Git commit, add, pull, merge 취소하기
Git commit, add, pull, merge 취소하기
아직도 git 을 타이핑 하시나요? alias g=git 이 정신 건강에 이롭습니다.
reset
reset 명령은 현재 브랜치의 HEAD가 다른 commit 을 가리키게 만듭니다. 예를 들어서, 방금 commit 한 내용에 잘못된 부분이 있어 커밋을 취소하고, 수정 한 뒤 다시 커밋하고자 할 때 아래와 같이 할 수 있습니다.
$ git commit ;; a mistake
$ git reset --soft HEAD^
$ edit file
$ git add file
$ git commit -c ORIG_HEAD
1. soft, mixed, hard
reset 옵션 중 soft 는, 현재의 인덱스, 워킹 트리를 그대로 유지한채로 HEAD 를 변경할 것을 의미합니다. default 옵션인 mixed 는 인덱스는 취소한채 워킹트리만 그대로, hard 는 인덱스와 워킹트리 변화를 모두 제거하고 HEAD 를 변경합니다.
따라서 위의 reset 구문은 변화를 그대로 유지한 채 HEAD가 이전 커밋을 가리키게 하겠다. 라는 의미입니다. 그래야만 잘못된 부분을 수정할 수 있습니다.
2. ORIG_HEAD
reset 을 이용해 HEAD 를 변경하고 나면, 이전의 HEAD 는 .git/ORIG_HEAD 라는 이름으로 저장이 됩니다. 따라서 새롭게 커밋하고 복잡한 히스토리를 만드는 것 없이 ORIG_HEAD 를 이용해, 잘못된 커밋객체에 다시 수정 사항을 반영할 수 있습니다. 그리고 -c 옵션은 ORIG_HEAD 의 커멘트를 그대로 이용한다는 뜻입니다.
Cancle merge, commit
모든 pull 과 merge 는 ORIG_HEAD 를 남기므로 reset 의 hard 옵션을 잘못된 merge 나 pull 을 되돌리는데 사용할 수 있습니다. hard 옵션은 워킹트리, 인덱스 보존 없이 reset 이 가리키는 커밋의 내용을 그대로 따라가기 때문입니다.
$ git reset --hard ORIG_HEAD
$ git reset --merge ORIG_HEAD ;; If you wanna keep your changes
또한 hard 옵션을 이용하면, commit 도 취소할 수 있습니다. @ 은 1.8.4 부터 도입된 HEAD 의 동의어 입니다. @^, @~1 @~, 모두 이전 HEAD 를 가리키는 뜻입니다.
$ git reset --hard @^
Cancle add (index)
reset 을 이용해 add 를 취소할 수 있습니다. reset 의 default 옵션인 mixed 가 워킹트리를 보존하지만, Index 는 보존하지 않기 때문입니다. 현재 HEAD 를 가리키면서 mixed 를 적용하면, index 를 취소할 수 있습니다.
$ git reset HEAD