이번엔 커밋을 취소하는 방법에 대해서 알아보겠습니다.
가장 최신 커밋만 취소하고 싶다면 git reset
명령을 이용합니다.
우선 vim으로 다음과 같이 한 줄을 추가 하고 'git commit -am'명령으로 커밋까지 완료 해보겠습니다.이렇게 커밋이 완료되고 방금한 커밋이 최신 커밋이 됩니다. 이때 다음과 같은 명령으로 최신 커밋만을 취소할 수 있습니다.
git reset HEAD^
이처럼 최신 커밋이 사라지고 이전 커밋이 최신 커밋이 되었음을 확인할 수 있습니다.
이 reset 명령에는 옵션이 있는데 간단히 알아보겠습니다.
git reset --soft HEAD^
는 최신 커밋 이전의 상태로 작업 트리(현재 작업 중인 폴더)를 되돌립니다. git reset --mixed HEAD^
는 최신 커밋과 스테이징이전으로 작업 트리를 되돌립니다. git reset명령의 기본값입니다.git reset --hard HEAD^
는 최신 커밋과 스테이징 이전 그리고 파일 수정 이전의 상태로 작업 트리를 되돌립니다. 주의할 점은 --hard 옵션을 통해 되돌린 내용은 복구가 불가능 합니다.git reset
명령에는 최신 뿐만이 아니라 특정 커밋까지 되돌릴 수 있는 기능도 있습니다.
git reset 커밋ID
커밋 ID(혹은 커밋 해시)
란, 커밋에 부여된 일종의 식별 번호 입니다. 다음 사진에서 빨간 박스에 포함된 부분이 커밋 ID입니다.vim 작업을 통해 다음과 같이 2번의 커밋 작업을 했습니다. 그리고 git reset 명령을 통해 커밋 메세지가 commit msg01인 첫 번째 커밋으로 돌아가 보도록 하겠습니다.git reset 명령 이후 git log 명령으로 확인해 본 결과 이전 커밋들은 사라지고 첫 번째 커밋들로 돌아왔음을 확인할 수 있습니다.
이렇게 해시ID를 이용하면 특정 커밋으로도 복귀할 수 있습니다.
이전에 본 git reset 명령은 커밋을 되돌리면서 수정사항을 삭제했습니다. 그러나 커밋을 되돌리면서 수정사항도 남겨두어야할 상황도 있는데요. 그런 경우를 위해 git revert
명령이 존재합니다.
우선 3개의 커밋 사항을 추가했습니다.
이제 revert 명령으로 되돌려볼 것 인데요. 이때 주의점이 있습니다. reset명령과는 다르게 돌아갈 커밋 ID를 지정하는 것이 아니라 되돌릴(취소할) 커밋의 ID를 지정해야합니다.
git revert 커밋ID
본 예제에서는 최신 커밋(commit msg03)을 되돌릴 것이므로 해당 ID를 복사 붙여넣기 합니다.
이때 git revert 해시ID를 입력하면 다음과 같은 창이 뜹니다. revert를 위해 추가 메세지를 남기는 창이기에 추가적으로 적을 사항이 있다면 이곳에서 적으면 됩니다. (이 창이 bash상에서 vim을 이용해서 초반 포스트에서 vim을 소개했었습니다.)다음과 같이 한 문장을 추가 하고 :wq로 나갔습니다. (메세지 남기는 것이 필수는 아님!)그리고 git log 명령을 통해 커밋 상태를 확인하면 커밋 기록은 남겨져 있는채로 취소 되었다는 Revert 상태가 남게 됩니다.cat명령이나 vim으로 파일을 열어보면 커밋 기록은 남지만 수정 사항은 되돌려 졌음을 확인할 수 있습니다.