실수로 git stash pop 실행 취소


186

복잡한 병합을 수행하기 전에 로컬 변경 사항을 숨기고 병합을 수행 한 다음 실행하기 전에 커밋하는 것을 어리석게 잊었습니다 git stash pop. 팝은 추적하기 어려운 몇 가지 문제 (큰 코드베이스에서 잘못된 메소드 호출)를 생성했습니다. 나는을 실행 git stash show했으므로 적어도 어떤 파일이 변경되었는지 알고 있습니다. 다른 것이 없다면, 이것이 더 커밋하는 교훈이라고 생각합니다.

내 질문 : 병합을 취소하지 않고 숨김 팝을 취소 할 수 있습니까?


2
git stash pop먼저 커밋하지 않고는 허용되어서는 안됩니다 . 그것을 달성하기 위해 무엇을 했습니까?
크리스 제스터 영

솔직히 확신하지 못합니다 (어제였습니다). 합병은 충돌이 있었기 때문에 자체적으로 커밋하지 않았습니다. 나는 그 후 어떻게 든 팝 팝을 실행할 수있었습니다.
nren

1
나는 이것을 git 버전 1.7.9.msysgit.0을 사용하여 알았습니다. 파일이 준비되지 않았고 숨김 팝이 모든 것을 병합했습니다.
PandaWood

git stash pop2.25.0.windows.1 버전의 git
Artem Hevorhian

커밋하기 전에 변경 사항 을 색인화 하고 잃어버린 경우 stash pop/apply해고 할 수 있습니다 git fsck --lost-found. 이 명령은 (그러므로 매달려) 무대는 아니지만 최선을 다하고 어디 있다고 (자식 용어에 익숙하지 않은 사람들을 위해 실제 파일)에 매달려있는 모양을 반복하고, 아래에 넣어 것입니다 .git / 분실 / 발견 된 디렉토리를 여기서 할 수 있습니다 git show그들과 참조 이들이 찾고있는 파일 인 경우
Artem Hevorhian

답변:


69

Git에서 떨어진 스테이크를 복구하는 방법을 사용해보십시오 . 튀어 나온 은신처를 찾으십시오. 인덱스와 작업 복사본을 유지하기 때문에 숨김에 대해 항상 두 개의 커밋이 있다고 생각합니다 (따라서 인덱스 커밋은 비어있을 것입니다). 그런 다음 git showdiff를보고 patch -R적용을 취소하는 데 사용 합니다.


6
와우 작동했습니다. git fsck --no-reflog | awk '/dangling commit/ {print $3}'(링크에서) 숨김 커밋을 찾을 수 있었고 그 차이에서 수동으로 문제를 발견했습니다. 감사!
nren

1
fsck는 거대한 목록을 출력합니다. 모든 SHA1을 표시하는 것이 지루합니다. 어떻게합니까?
meson10

5
@ meson10 : 안타깝게도 스 태시는 리플 로그에 보관되는데, 이는 팝된 스 태쉬의 역사를 볼 수있는 명백한 방법 (실제 지점 인 경우)입니다. 또한 downvote + help 요청이 최선의 전략이 아님을 제안합니다.
Ben Jackson

2
제대로 이해하려면 약간의 노력이 필요했습니다. 내 작업의 결과는 다음과 같습니다. git diff -p ${STACH_SHA1}~1 ${STASH_SHA1} | patch -R -p1; 나는 git show제안대로 시도 했지만 그 출력은 패치에 좋지 않았다. 또한 파일 앞에 놓인 및 요소 -p1를 제거하기 위해 패치 할 수있는 옵션 을 제공해야했습니다. 그렇지 않으면 리포지토리 루트의 경로를 확인할 수 없습니다. 제안 : 패치를 가지고 놀기 전에 조심해서 별도의 지점에서 혼란을 저 지르십시오. a/..b/..git diff
basilikode

당신의 대답에 @BenJackson "항상"수단 모두 stash popstash pushA는 그 바로 인덱스와 작업 디렉토리에 변경 사항을 저장 할 커밋 트리거?
Artem Hevorhian

36

에서 git stash --help

Recovering stashes that were cleared/dropped erroneously
   If you mistakenly drop or clear stashes, they cannot be recovered through the normal safety mechanisms. However, you can try the
   following incantation to get a list of stashes that are still in your repository, but not reachable any more:

       git fsck --unreachable |
       grep commit | cut -d\  -f3 |
       xargs git log --merges --no-walk --grep=WIP

이것은 동일한 시나리오에서 허용되는 답변보다 나에게 도움이되었습니다.


13
"WIP"검색과 관련된 많은 솔루션이 기본 숨김 메시지에 의존하고 있습니다. 숨김 메시지에 명시적인 메시지를 제공하면 WIP를 포함하지 않을 수 있습니다.
벤 잭슨

감사. 가독성을 높이기 위해 --oneline 옵션을 log 명령에 추가했습니다.
basslo

이것은 숨김 커밋의 SHA를 찾는 데 도움이됩니다. 그러나 허용 된 답변 (git diff SHA ~ 1 SHA | patch -R)의 @basilikode 주석과 통합하면 정상적으로 작동합니다. path --dry-run을 먼저 사용하여 확인하는 것이 좋습니다.
Jarek C

3

병합이 너무 복잡하지 않은 경우 다른 옵션은 다음과 같습니다.

  1. "git stash"를 사용하여 병합 변경 사항을 포함하여 모든 변경 사항을 숨김으로 다시 이동하십시오.
  2. 병합을 다시 실행하고 삭제 된 숨김의 변경 사항없이 변경 사항을 커미트하십시오.
  3. 파일이 지금 동일하므로 이전 병합의 모든 변경 사항을 무시해야하는 "git stash pop"을 실행하십시오.

그 후에 당신은 당신이 너무 일찍 떨어 뜨린 은신처의 변경 사항 만 남게됩니다.

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