커밋 실행을 모르면 커밋을 취소하는 것이 약간 두려운 일입니다. 그러나 당신이 이해하면 실제로 놀랍습니다.
이것을 가지고 있다고 가정하십시오. 여기서 C는 HEAD이고 (F)는 파일의 상태입니다.
(F)
A-B-C
↑
master
당신은 할 C를 저지하고 다시 볼 로컬 수정 된 파일의 모든 변경 내용이 손실 결코 핵이라도 . 당신은 이것을합니다 :
git reset --hard HEAD~1
결과는 다음과 같습니다.
(F)
A-B
↑
master
이제 B는 머리입니다. 를 사용했기 때문에 --hard
파일은 커밋 B에서 해당 상태로 재설정됩니다.
아, 그러나 커밋 C가 재앙이 아니라 약간 떨어져 있다고 가정 해보십시오. 커밋 을 취소하고 더 나은 커밋을 수행하기 전에 약간의 편집을 위해 변경 사항 을 유지하려고합니다 . C를 HEAD로 사용하여 여기부터 다시 시작하십시오.
(F)
A-B-C
↑
master
당신은 이것을 제외하고 할 수 있습니다 --hard
:
git reset HEAD~1
이 경우 결과는 다음과 같습니다.
(F)
A-B-C
↑
master
두 경우 모두 HEAD는 최신 커밋에 대한 포인터 일뿐입니다. 를 수행하면 git reset HEAD~1
Git에게 HEAD 포인터를 한 커밋 뒤로 이동하도록 지시합니다. 그러나 (사용하지 않는 한 --hard
) 파일을 그대로 둡니다. 이제 git status
C에 체크인 한 변경 사항이 표시됩니다. 잃어버린 것은 없습니다!
가장 가벼운 터치를 위해 커밋을 취소 할 수는 있지만 파일과 인덱스는 그대로 두십시오 .
git reset --soft HEAD~1
이렇게하면 파일 만 남게 될뿐만 아니라 색인 만 남게됩니다. 당신이 할 때 git status
, 당신은 같은 파일이 이전과 인덱스에있는 것을 볼 수 있습니다. 사실,이 명령 바로 다음에 할 수 git commit
있으며 방금했던 것과 동일한 커밋을 다시 실행할 수 있습니다.
한 가지 더 : 첫 번째 예에서와 같이 커밋을 삭제 했다고 가정 하지만 결국 에는 커밋 이 필요하다는 것을 알 수 있습니까? 힘든 운 이지요?
아니요, 여전히 되돌릴 방법이 있습니다. 입력 git reflog
하면 이동 한 (일부) 커밋 샤 (즉, 해시) 목록이 표시 됩니다. 파괴 한 커밋을 찾아서 다음과 같이하십시오.
git checkout -b someNewBranchName shaYouDestroyed
이제 커밋을 부활 시켰습니다. 커밋은 실제로 90 일 동안 Git에서 파괴되지 않으므로 일반적으로 되돌아 가려고하지 않은 것을 구할 수 있습니다.