Original article: Git Revert Commit – How to Undo the Last Commit

Git에서 코드 작업을 하고 있는데 계획대로 되지 않아서 가장 최근 커밋을 되돌려야 한다고 가정해봅시다. 어쩌면 좋을까요? 방법에 대해 알아봅시다!

마지막 커밋을 취소할 수 있는 두 가지 방법이 있습니다. 이 글에서는 이 두 가지를 모두 살펴보겠습니다.

revert 명령어

revert 명령어는 취소하고 싶은 특정 커밋의 내용을 되돌리는 새로운 커밋을 만듭니다. 이 명령어를 사용하여 다음과 같이 마지막 커밋을 되돌릴 수 있습니다:

git revert <되돌리고 싶은 커밋 이름>

git log를 사용하여 되돌릴 커밋의 이름을 찾을 수 있습니다. 여기에 설명된 첫 번째 커밋은 마지막으로 생성된 커밋입니다. 그런 다음, 찾아낸 영숫자 이름을 복사하여 revert 명령어에 사용할 수 있습니다.

A diagram showing that the git revert command creates a new commit to revert previous changes.
이 이미지에서 각 원은 하나의 커밋을 의미합니다.

reset 명령어

reset 명령어를 사용해 마지막 커밋을 실행 취소할 수도 있습니다. 그러나 주의해야할 점은 커밋 기록이 변경되기 때문에 거의 사용하지 않아야 합니다. 작업 지점인 HEAD를 지정된 커밋으로 이동하고, 그 이후의 모든 항목을 폐기합니다:

git reset --soft HEAD~1

--soft 옵션은 커밋되지 않은 변경사항이 손실되지 않음을 의미합니다.

A diagram showing that git reset --soft will change your commit history, but will keep any unstaged changes you have.
이 이미지에서 각 원은 하나의 커밋을 의미합니다.

가장 최근 커밋으로 되돌리고 unstaged 상태의 변경 사항을 모두 제거하려면 --hard 옵션을 사용할 수 있습니다:

git reset --hard HEAD~1

이렇게 하면 최신 커밋뿐만 아니라 커밋되지 않은 변경 사항도 취소됩니다.

A diagram showing that git reset --hard will change your commit history, but will also remove any unstaged changes you have.
이 이미지에서 각 원은 하나의 커밋을 의미합니다.

Git에서 언제 reset 또는 revert를 사용해야 할까요?

되돌려야 하는 커밋이 로컬에만 존재하는 경우에만 reset 명령어를 사용해야 합니다. 이 명령어는 해당 커밋을 아예 삭제하고 커밋 기록을 변경하기 때문에 같이 협업하고 있는 다른 팀원의 작업에도 영향을 끼치기 때문입니다. (협업하는 프로젝트 브랜치에 reset 을 실행하면 다른 팀원이 새로운 커밋을 push할 때 브랜치에 충돌이 납니다 --옮긴이 주석.)

revert는 변경 내용을 취소하는 새 커밋을 생성하므로, 되돌리려는 커밋이 이미 원격 저장소로 푸쉬된 경우에는 커밋 기록을 덮어쓰지 않는 revert 명령어를 사용하는 것이 가장 좋습니다.

마치며

마지막 커밋을 취소하는 두 가지 방법과 언제 어떤 방법을 사용하는 것이 가장 좋은지를 배웠습니다.

이제 마지막 커밋이 버그를 유발하거나 커밋하지 말았어야 하는 내용이 있다는 것을 알게 되면 어떻게 고치는지 아시겠죠?