Blog

Git commit, add, pull, merge 취소하기

June 6, 2014

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

모든 pullmergeORIG_HEAD 를 남기므로 reset 의 hard 옵션을 잘못된 mergepull 을 되돌리는데 사용할 수 있습니다. 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

Refenrenes

  1. http://stackoverflow.com/questions/927358/how-to-undo-the-last-git-commit
  2. http://ecogeo.tistory.com/276
  3. http://stackoverflow.com/questions/964876/head-and-orig-head-in-git