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


233

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

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

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

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


1
현재 버전과 이전 버전을 비교하여 역 패치를 만들 수 있습니까? 그런 다음 적용 하시겠습니까?
ralphtheninja

적용된 숨김 이외의 작업 트리에 변경 사항이 있습니까?
Greg Bacon

여기에 추가하면 ... 질문이 아닌 FAQ였습니다 ... stackoverflow.com/questions/59973103/…
Don Thomas Boyle

답변:


188

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.

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


2
정말 고마워 이것은 숨김에 대한 좋은 기능 일 것 같습니다.
Pat Notz 2016 년

5
예, git apply -R적어도 git bash가있는 Windows 상자 patch --reverse에서 패치 할 파일을 찾는 데 문제가 있었기 때문에 개선되었습니다 (대체가 왜 효과가 있었는지 실마리는 없습니다). +1 및 좋은 설명
hakre

--index이처럼 추가하는 것이 좋지 않을 것 git stash show -p | git apply --reverse --index입니다. 더 이상 색인에 색인을 추가 할 필요가 없으므로 변경 사항이 되돌려집니다.
theUnknown777

3
@Greg Bacon, 야, 당신이 설명 한 스크립트를 살펴 보았지만 git stash show -p | git apply -R -v메시지와 함께 실행했을 때 패치가 실패했습니다 Checking patch messages... error: while searching for: Hello, world Hello again error: patch failed: messages:1. 무엇이 잘못 될 수 있는지 아십니까?
Max Koretskyi

5
내가 얻을 오류 : 패치 실패 : /src/filename.java:46 오류 : SRC / filename.java 패치가 적용되지 않습니다
팀 볼랜드

83

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

git stash apply변경 사항을 다시 가져 오므로 다시 git reset --hard삭제하십시오.

git stash pop이러한 변경 사항을 다시 가져오고 최상위 변경 사항을 제거하므로이 경우 git stash [save]이전 (사전 팝) 상태로 돌아갑니다.


82
git checkout -f

커밋되지 않은 변경 사항을 제거합니다.


4
감사합니다, 당신은 적용되지 않은 단계적 변화로부터 나를 도와줍니다.
Fa.Shapouri

1
이것은 훨씬 간단했다
Mark A

대단해!
Kiran Sk

22

V1 git man page에는 숨김 적용 취소에 대한 참조가 있습니다. 발췌는 다음과 같습니다.

최신 V2 git 맨 페이지 에는 숨김 적용을 취소하는 것에 대한 참조가 포함되어 있지 않지만 아래는 여전히 잘 작동합니다.

태쉬 적용 취소 일부 유스 케이스 시나리오에서는 스태 이징 된 변경 사항을 적용하고 일부 작업을 수행 한 다음 원래 스 태쉬에서 발생한 변경 사항을 적용 취소 할 수 있습니다. Git은 이러한 숨김 적용 취소 명령을 제공하지 않지만, 숨김과 관련된 패치를 검색하고이를 반대로 적용하여 효과를 달성 할 수 있습니다.

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

다시 말하지만, 숨김을 지정하지 않으면 Git은 가장 최근 숨김을 가정합니다.

$ git stash show -p | git apply -R

별칭을 만들고 효과적으로 Git에 숨김 해제 명령을 추가 할 수 있습니다. 예를 들면 다음과 같습니다.

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

1
어떤 이유로 든 "스 태시 적용 취소"를 연결 한이 유용한 섹션이 두 번째 버전에서 제거되었습니다. 현재 최신 버전 은이 책의 2.1.146, 2019-04-15- 입니다. V2- Git Tools- Stashing and Cleaning . 저자는 내가 찾을 수없는 것처럼 보이는 더 좋은 방법이 있다고 생각하기 때문일 수 있습니다.
Nad Alaba

머리 위로에 대한 @NadAlaba 덕분에, V1 및 V2의 차이에 메모를 만들 수있는 대답을 업데이트 한 ... 이상한 망할 놈의 저자는 해제 적용 은닉에 대한 섹션 제거
초코 스미스

13

이것은 기한이 지났지 만 문제를 올바르게 해석하면 간단한 해결책을 찾았습니다. 이것은 내 자신의 용어에 대한 설명입니다.

git stash [save] 현재 변경 사항을 저장하고 현재 분기를 "깨끗한 상태"로 설정합니다

git stash list 다음과 같은 것을 제공합니다 : stash@{0}: On develop: saved testing-stuff

git apply stash@{0}이전 과 같이 현재 분기를 설정합니다 stash [save]

git checkout .다음 과 같이 현재 분기를 설정합니다 stash [save]

숨김에 저장된 코드는 손실되지 않으며 git apply stash@{0}다시 찾을 수 있습니다 .

어쨌든, 이것은 나를 위해 일했다!


확실하게, 나는 git stash apply --reverse첫 번째를 적용한 다음 단순히 git stash apply stash@{x}당신이 언급 한 것처럼 되돌아갔습니다 . 문제없이 일했습니다.
Carlos Garcia

3

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

다른 사람들이 언급 한 것 외에도 가장 쉬운 방법은 먼저하는 것입니다.

git reset HEAD

그런 다음 모든 로컬 변경 사항을 체크 아웃하십시오.

git checkout . 

저장하려는 로컬 작업 이 전혀없는 한 이것이 가장 쉬운 방법 입니다. 지점에 잘못된 숨김을 적용했거나 해결하지 않으려는 병합 충돌이 발생하면 작업 세트를 지점의 최신 커밋으로 완전히 되돌려 서이를 취소하는 빠르고 쉬운 방법입니다.
Shadoninja

2

@Greg Bacon 답변 외에도 이진 파일이 색인에 추가되고 다음을 사용하여 숨김의 일부인 경우

git stash show -p | git apply --reverse

발생할 수 있습니다

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

추가 --binary하면 문제가 해결되지만 불행히도 아직 이유를 찾지 못했습니다.

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

0

이것은 위의 답변 외에도 새 숨김이 저장 될 때 숨김 번호가 변경 될 수 있으므로 메시지를 기반으로 git 숨김을 검색합니다. 나는 몇 가지 bash 함수를 작성했다.

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. 이름 (메시지)으로 숨김 생성 $ git stash save "my stash"
  2. 이름을 적용하려면 $ apply "my stash"
  3. 명명 된 숨김을 제거하려면 $ remove "my stash"

0

실수로 스 태싱을 누른 경우 공유 한 이미지를 따라 스 태쉬 해제 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.