git reset 명령어와 옵션
git reset 명령어의 사용법에 대해 알아보겠습니다.
git reset 명령어는 git 을 특정 commit 상태로 돌려놓는 명령어입니다.
$ git reset -q aCommit pathA pathB pathC
aCommit 의 상태로 나열된 모든 path의 git 을 돌려놓는 것입니다.
-q : Error 가 있을 경우에만 로그를 보여줍니다.
$ git reset -q --hard aCommit
reset 을 할 경우 기존의 수정사항이 있을때 적용하는 옵션입니다.
--hard : 수정사항을 모두 무시하고 aCommit 상태로 돌려놓습니다.
--soft : 수정사항을 모두 유지하고 commit 하기 전의 상태로 남겨둔채 단지 HEAD 만 aCommit 으로 옮깁니다.
실제 사용되는 상황을 예로 설명해 보겠습니다.
1. file1.c file2.c 를 수정한다.
2. $ git add file1.c file2.c
3. repository 의 내용을 merge 해야하는 경우가 발생.
4. $ git reset
5. $ git pull git://xxxx.xxxx.xxx
이 경우 git reset 을 하게되면 file1.c file2.c 의 수정내용이 그대로 유지되며 git add 만 undo 하게 됩니다.
1. $ git commit xxxx
2. $ git reset --soft HEAD^
3. edit files
4. $ git commit -a -c ORIG_HEAD
이 상황은 일반적으로 많이 발생하는 상황입니다.
1 에서 commit 을 하였으나 수정이 잘못 되었을 경우 2 번의 명령으로 commit 과 git add 를 취소합니다. (바로 이전의 commit 상태로 돌림) --soft 옵션을 사용하였으므로 수정내용은 모두 남아있습니다.
그리고 3 에서 잘못된 내용을 다시 고치고 4 의 git commit -a -c ORIG_HEAD 명령으로 commit 을 합니다.
-c 옵션은 기존 commit 에서 사용한 comment 를 그대로 사용한다는 옵션입니다.
수정하고 싶을 경우는 --amend 를 사용하면 됩니다.
1 $ git branch aBranch
2 $ git reset --hard HEAD~3
3 $ git checkout aBranch
특정 branch 에서 작업하다가 현재 작업 내용이 해당 branch 에 적당하지 않을 경우 수정내용을 다른 aBranch 로 옮기는 방법입니다. 1 에서 aBranch 를 만들고 2 에서 작업내용을 redo 한 후 3 에서 aBranch 로 옮겨가는 것입니다. 1 에서 branch 를 만들고 checkout 하지 않았으므로 2의 작업은 master 의 내용을 삭제하게 됩니다.
더 많은 내용은 http://git-scm.com/docs/git-reset 을 참고하면 됩니다.