2014-03-05 4 views
2

나는 5 개의 커밋을했고, 나는 그들을 밀어 내기 전에 모든 커밋을 하나 만들고 싶었다. 어떤 이유로 나는 이것을 평소 사용하는 것과 다른 방법으로 시도하기로 결정했습니다.git rebase가 내 커밋을 먹었습니다! 나에게 'git reflog'결과를 번역 하시겠습니까?

FWIW : 여기서 지침을 따르려고했습니다. http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html.

아래에서 자세한 내용을 설명 하겠지만 질문의 맨 아래로 건너 뛰고 여기 git reflog의 출력을 넣으십시오. 그 이유는 여기에 중요한 부분이 있기 때문입니다.

git rebase -i HEAD~5 

내가 잘못 내가 지금 실현, 커밋 및 I을 보였다 텍스트 편집기되게되었다, 모든 첫 번째 열을 변경 : 내 모든 변화 노력으로 내가 한 -

그래서 여기에 내가 무슨 짓을했는지 'pick'에서 'squash'값.

그런 다음 오류 메시지가 표시됩니다. 내 수치심에 나는 오류 메시지가 말한 것을 기억할 수는 없지만 "당신은 사용하지 않겠다"같은 말을했다고 생각합니다. 그 시점에서

나는 다시 프롬프트이고 나는 반복하려고 할 때 :

It seems that there is already a rebase-merge directory, and 
I wonder if you are in the middle of another rebase. If that is the 
case, please try 
     git rebase (--continue | --abort | --skip) 
If that is not the case, please 
     rm -fr /home/foo/dev/bar/.git/rebase-merge 
and run me again. I am stopping in case you still have something 
valuable there. 

그럼 내가 뭘 제안이 답변 https://stackoverflow.com/a/12163247/364088을 읽어

git rebase -i HEAD~5 

내가 메시지를 얻을 :

git reset --soft HEAD^ 

나는 그것을했다. 내가 해낸 후에.

git diff 

더 변화를 보이지 않았다 있지만
git status 

는 않은 변경이있는 파일의 수를 보여 주었다. 어쨌든 나는 그 때했다

git commit 

그리고 지금 나는 지난 다섯 커밋에서 모든 chnages를 잃어 버렸다!

git reflog 

쇼 (이 그것의 바로 위에있다) :

3f80e4b [email protected]{0}: commit: Decorator demo added 
1888dd9 [email protected]{1}: reset: moving to HEAD^ 
7d6228e [email protected]{2}: checkout: moving from master to 7d6228eb9b03d0c45acf7c66e662220213cf4fb9 
705736f [email protected]{3}: commit: Snapshot commit - squash later 
75db0c3 [email protected]{4}: commit: Snapshot commit - squash later 
b70b50f [email protected]{5}: commit: Snapshot commit - squash later 
d970a62 [email protected]{6}: commit: Snapshot commit - squash later 
0f24e88 [email protected]{7}: commit: Snapshot commit - squash later 
7d6228e [email protected]{8}: commit: Move some standard code into its own module and tidy up . 
1888dd9 [email protected]{9}: commit: Early version of the decorators demo 

그래서 것은 "스냅 샷 커밋 - 스쿼시 나중에"라는 레이블이 붙은 커밋 단일로 I 병합 원하는 사람은 커밋 .

HEAD @ {2} 및 HEAD @ {1}은 "스냅 샷 커밋 - 스쿼시"를 병합하는 과정에서 수행 한 작업입니다. 커밋 HEAD @ {0}은 리베이스 및 리셋 후에 수행 한 커밋입니다.

마지막 커밋이 가장 중요한 경우는 HEAD @ {8}입니다.

그래서 '705736f '로 돌아가서 이상적으로는 이번에 만 커밋을 병합하면됩니다.

"스냅 샷 커밋 - 스쿼시 나중에"변경 사항을 복구 할 수 있다면 매우 행복 할 것입니다.

조언에 감사드립니다. 당신이 그것을 체크 아웃 (가 새 로컬 지점이다) 및 확인 할 수

git branch recover 705736f 

이 시점에서 :

답변

2

내 선호하는 방법은 나뭇 가지처럼 돌아 가야 할 일에 라벨을 부착하는 것입니다 당신은 당신이 원하는 무엇을 회복했습니다

git checkout recover 
git log # or gitk, or whatever 

이 커밋 이전 (사전 REBASE - 시도)를 가리키는 새로운 지점의 레이블입니다.

새 커밋 ( Decorator demo added) (그래프 로그 뷰어에서 --graphgitk --branches 또는 git log 같은) Early version of the decorators demo 오프 후 포크 커밋 다른 지점에있을 것입니다.

git reset --hard 705736f 
: 새, 당신은 예전에 현재 분기를 강제로 재설정 reflog에 커밋 할 수 커밋합니다 (reflog에서 제외) "잃을"기꺼이 경우


(705736f을 가리키는 새 분기를 만드는 대신). 다시 git log을 실행하여 원하는 위치에 있는지 확인하십시오 (심지어 git log 705736f도 가능!).

$ git reset --hard [email protected]{3} 

당신은 다시 당신이 당신의 마지막 커밋했던 점에 얻을 것이다 :

+0

감사합니다. 매우 감사드립니다. – glaucon

1

그냥 않습니다. 그때부터 당신은 그에 따라 행동 할 수 있습니다.

+1

답변 해 주셔서 감사합니다. @torek 제안을 시도하면서 올바른 것으로 표시하지 않았으므로 제안을 시도 할 기회가 없었습니다. 어쨌든 답변을 주셔서 감사합니다. 감사합니다. – glaucon

+0

이 방법은 효과가 있지만 반드시 정확하지는 않습니다. 'git reflog'를 먼저 호출하여 올바른 HEAD @ {#}를 얻을 수 있습니다 –

관련 문제