IT story

숨김을 반대로 적용하는 방법?

hot-time 2020. 5. 6. 21:05
반응형

숨김을 반대로 적용하는 방법?


작은 패치가 자식 숨김에 저장되어 있습니다. 를 사용하여 작업 사본에 적용했습니다 git stash apply. 이제 패치를 역으로 적용하여 이러한 변경 사항을 취소하고 싶습니다 git revert.

누구든지 이것을하는 방법을 알고 있습니까?

설명 : 작업 사본에 다른 변경 사항이 있습니다. 내 특별한 경우는 설명하기 어렵지만 숨겨져있는 디버깅 또는 실험 코드를 상상할 수 있습니다. 이제 작업 사본에 다른 변경 사항이 혼합되어 있으며 숨김 변경 사항이 있거나없는 효과를보고 싶습니다.

숨김이 현재 이것을 지원하는 것처럼 보이지 않지만 git stash apply --reverse멋진 기능입니다.


git-stash 맨 페이지 에 따르면 , "스 태시는 트리가 작업 디렉토리의 상태를 기록하는 커밋으로 표시되며 첫 번째 상위는 스 HEAD태시가 생성 될 때의 커밋 git stash show -p"으로 표시됩니다. 숨김 상태와 원래 부모 간의 차이로 숨 깁니다.

다른 변경 사항을 그대로 유지하려면 git stash show -p | patch --reverse다음과 같이 사용 하십시오.

$ git init
Initialized empty Git repository in /tmp/repo/.git/

$ echo Hello, world >messages

$ git add messages

$ git commit -am 'Initial commit'
[master (root-commit)]: created 1ff2478: "Initial commit"
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 messages

$ echo Hello again >>messages

$ git stash

$ git status
# On branch master
nothing to commit (working directory clean)

$ git stash apply
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   messages
#
no changes added to commit (use "git add" and/or "git commit -a")

$ echo Howdy all >>messages

$ git diff
diff --git a/messages b/messages
index a5c1966..eade523 100644
--- a/messages
+++ b/messages
@@ -1 +1,3 @@
 Hello, world
+Hello again
+Howdy all

$ git stash show -p | patch --reverse
patching file messages
Hunk #1 succeeded at 1 with fuzz 1.

$ git diff
diff --git a/messages b/messages
index a5c1966..364fc91 100644
--- a/messages
+++ b/messages
@@ -1 +1,2 @@
 Hello, world
+Howdy all

편집하다:

이것에 대한 약간의 개선 git apply은 패치 대신에 사용 하는 것입니다.

git stash show -p | git apply --reverse

또는 git apply -R의 약어로 사용할 수도 있습니다 git apply --reverse.

나는 최근에 이것이 정말로 편리하다는 것을 알았습니다 ...


git stash[save]작업 디렉토리 상태 및 색인 상태를 가져 와서 숨겨서 색인 및 작업 영역을 HEAD버전으로 설정합니다.

git stash apply brings back those changes, so git reset --hard would remove them again.

git stash pop brings back those changes and removes top stashed change, so git stash [save] would return to previous (pre-pop) state in this case.


git checkout -f

will remove any non-commit changes.


Direct cut n paste from the git man page It's clearly worded and even includes an alias;

Un-applying a Stash In some use case scenarios you might want to apply stashed changes, do some work, but then un-apply those changes that originally came from the stash. Git does not provide such a stash unapply command, but it is possible to achieve the effect by simply retrieving the patch associated with a stash and applying it in reverse:

$ git stash show -p stash@{0} | git apply -R

Again, if you don’t specify a stash, Git assumes the most recent stash:

$ git stash show -p | git apply -R

You may want to create an alias and effectively add a stash-unapply command to your Git. For example:

$ git config --global alias.stash-unapply '!git stash show -p | git apply -R'
$ git stash apply
$ #... work work work
$ git stash-unapply

This is long over due, but if i interpret the problem correctly i have found a simple solution, note, this is an explanation in my own terminology:

git stash [save] will save away current changes and set your current branch to the "clean state"

git stash list gives something like: stash@{0}: On develop: saved testing-stuff

git apply stash@{0} will set current branch as before stash [save]

git checkout . Will set current branch as after stash [save]

The code that is saved in the stash is not lost, it can be found by git apply stash@{0} again.

Anywhay, this worked for me!


In addition to @Greg Bacon answer, in case binary files were added to the index and were part of the stash using

git stash show -p | git apply --reverse

may result in

error: cannot apply binary patch to '<YOUR_NEW_FILE>' without full index line
error: <YOUR_NEW_FILE>: patch does not apply

Adding --binary resolves the issue, but unfortunately haven't figured out why yet.

 git stash show -p --binary | git apply --reverse

This is in addition to the above answers but adds search for the git stash based on the message as the stash number can change when new stashes are saved. I have written a couple of bash functions:

apply(){
  if [ "$1" ]; then
    git stash apply `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"`
  fi
}
remove(){
  if [ "$1" ]; then
    git stash show -p `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"` | git apply -R
    git status
  fi
}
  1. Create stash with name (message) $ git stash save "my stash"
  2. To appply named $ apply "my stash"
  3. To remove named stash $ remove "my stash"

How to reverse apply a stash?

Apart from what others have mentioned, easiest way is first do

git reset HEAD

and then checkout all local changes

git checkout . 

참고URL : https://stackoverflow.com/questions/1020132/how-to-reverse-apply-a-stash

반응형