git revert 명령어는 커밋을 되돌려 저장소를 이전 커밋 상태로 되돌릴 수 있게 해주는 도구입니다. 커밋을 삭제하는 대신, revert는 이미 공개된 커밋의 변경 사항을 취소하는 새로운 커밋을 생성합니다. 덕분에 원래 커밋은 프로젝트 히스토리의 일부로 그대로 보존됩니다.
Git 저장소에서 작업하다 보면, 아직 저장소에 올릴 준비가 되지 않은 코드로 커밋을 만들어 버리는 실수를 저지르기도 합니다.
이럴 때 필요한 것이 바로 git revert 명령어입니다. git revert 명령어를 사용하면 커밋을 되돌리고(undo), 저장소를 이전 커밋 상태로 되돌릴 수 있습니다.
이 글에서는 예제와 함께 코드 되돌리기 방법과 git revert 명령어 사용법을 자세히 살펴봅니다. 글을 끝까지 읽고 나면 전문 개발자처럼 git revert 명령어로 커밋을 되돌릴 수 있게 될 것입니다.
코드 되돌리기가 필요한 순간
Git 저장소에서 작업하다 보면 커밋에 실수가 있었다는 사실을 뒤늦게 알아차리는 경우가 종종 있습니다.
예를 들어, 새로운 기능 개발을 마친 직후 수정해야 할 버그를 발견했다고 가정해 봅시다. 버그 수정 내용을 커밋했는데, 막상 확인해 보니 개발 중이던 새 기능 관련 파일까지 함께 커밋해 버린 것입니다.
이렇게 되면 하나의 커밋에 버그 수정과 새 기능이 뒤섞여 있어, 프로젝트를 함께 진행하는 다른 협업자들이 변경 내용을 이해하기 어려워집니다. 원래 의도는 두 변경 사항을 각각 별도의 커밋으로 나누어 올리는 것이었겠죠.
이런 상황이라면 저장소를 마지막 커밋을 푸시하기 이전 상태로 되돌리고 싶어질 것입니다. 마지막 커밋을 되돌리면 커밋을 다시 정리해서 올릴 기회를 얻을 수 있습니다.
git revert 명령어란?
git revert 명령어는 커밋을 되돌릴(undo) 수 있게 해줍니다. 다만 프로젝트에서 커밋을 삭제하는 대신, 최근 두 커밋 사이의 변경 사항을 찾아내 그 변경을 취소하는 새로운 커밋을 생성합니다.
git revert 명령어가 유용한 이유는 저장소의 프로젝트 히스토리를 그대로 보존할 수 있기 때문입니다. 커밋을 완전히 삭제하는 대신 저장소를 다른 커밋 상태로 되돌리므로, 지금까지 저장소에 푸시한 모든 커밋에 대한 정확한 기록을 유지할 수 있습니다.
마지막 커밋을 취소하고 싶을 때 git revert 명령어를 사용하세요. 마지막 커밋의 내용을 일일이 손으로 고치는 대신, 커밋을 되돌린 후 새로운 커밋을 코드베이스에 푸시하면 됩니다.
git revert 명령어의 기본 문법은 다음과 같습니다:
git revert
그럼 실제 예제를 통해 이 명령어가 어떻게 동작하는지 살펴보겠습니다.
git revert 실습 예제
로컬 머신에는 README.md라는 파일 하나가 있는 예제 저장소가 있다고 가정해 봅시다. 이 파일에 변경 사항을 만들었고, 이를 커밋으로 저장하려고 합니다. 다음 명령어를 실행하면 됩니다:
git commit -m "docs: Update README.md with author info"
이 명령어를 실행하면 docs: Update README.md with author info라는 메시지와 함께 커밋이 생성됩니다. 이후 README.md 파일을 한 번 더 수정하고, 다음 명령어로 저장소에 커밋했습니다:
git commit -m "docs: Update order of authors by contributions"
이 명령어 역시 저장소에 새로운 커밋을 하나 추가합니다. 커밋 목록을 간략하게 보여주는 git log --pretty=oneline 명령어를 실행하면, 저장소 히스토리에 두 개의 커밋이 있는 것을 확인할 수 있습니다:
6f52d877873e7d3b52c929647384dfdf2488da22 (HEAD -> master) docs: Update order of authors by contributions
57d763663e619088159bb7629243456f88feab79 docs: Update README.md with author info
이제 마지막 커밋을 되돌리기로 결정했다고 가정해 봅시다. README.md 파일에 작성한 저자 순서가 잘못되었다는 것을 깨달았고, 저장소를 마지막 커밋을 푸시하기 이전 상태로 되돌려야 하는 상황입니다.
이 경우 다음 명령어를 사용하면 됩니다:
git revert HEAD
이 명령어를 실행하면 기본 텍스트 편집기가 열리면서 커밋 메시지를 입력하라는 안내가 나타납니다. 여기서 HEAD는 가장 최근의 커밋을 가리킵니다. 이 예제에서는 revert author order commit이라는 메시지를 입력했습니다. 그러면 명령어는 다음과 같은 결과를 반환합니다:
[master b66c29a] revert author order commit "docs: Update order of authors by contributions"
1 file changed, 1 deletion(-)
다시 git log --pretty=oneline 명령어를 실행해 보면 새로운 커밋이 생성된 것을 확인할 수 있습니다:
b66c29a8c4c226fa9ae8cd8f9e086c0a73e6ecfe (HEAD -> master) revert author order commit "docs: Update order of authors by contributions"
6f52d877873e7d3b52c929647384dfdf2488da22 docs: Update order of authors by contributions
57d763663e619088159bb7629243456f88feab79 docs: Update README.md with author info
커밋 히스토리에는 이제 세 개의 커밋이 표시됩니다. git revert 명령어는 마지막 커밋을 삭제하는 대신, 이전 커밋의 변경 사항을 취소하는 새로운 커밋을 만들었습니다. 즉, 저장소에 푸시한 모든 커밋의 완전한 히스토리가 그대로 유지되는 것입니다.
git revert 명령어를 실행하려면 커밋 참조(commit reference)가 반드시 필요합니다. 위 예제에서는 HEAD를 지정하여 저장소를 마지막 커밋 기준으로 되돌렸습니다.
특정 커밋으로 되돌리고 싶다면 해당 커밋의 해시(hash) 값을 지정하면 됩니다. 명령어에 HEAD 대신 git log 명령어로 확인한 해시 값을 사용하면, 원하는 특정 커밋 시점으로 되돌릴 수 있습니다. 특정 커밋으로 저장소를 되돌릴 때 사용하는 명령어의 예는 다음과 같습니다:
git revert 57d763663e619088159bb7629243456f88feab79
이 명령어는 SHA 해시 값이 57d763663e619088159bb7629243456f88feab79인 커밋 기준으로 저장소를 되돌립니다. 이 저장소에서 해당 해시는 저장소에 만든 첫 번째 커밋에 해당합니다.
git revert vs. git reset
revert와 reset 명령어는 모두 Git 저장소에서 이전 커밋의 변경 사항을 취소하는 데 사용됩니다. 하지만 두 명령어의 동작 방식에는 미묘한 차이가 있다는 점을 알아두어야 합니다.
git revert 명령어는 이전 커밋을 되돌리는 데 사용됩니다. git revert를 실행하면 두 커밋 사이의 변경 사항이 취소되고, 변경이 취소된 상태의 코드를 담은 새로운 커밋이 생성됩니다.
반면 git reset 명령어는 특정 범위 사이의 모든 커밋을 제거하는 방식으로 저장소를 이전 상태로 되돌립니다. 따라서 git reset을 실행하며 이전 커밋을 참조하면, 현재 저장소 상태와 해당 커밋 사이의 모든 커밋이 삭제됩니다.
일반적으로 reset보다는 revert로 커밋을 되돌리는 것이 권장됩니다. 가장 큰 이유는 git revert가 프로젝트 히스토리를 변경하지 않기 때문입니다. 덕분에 개발자는 프로젝트에 적용된 모든 변경 사항에 대한 정확한 기록을 유지할 수 있습니다.
또한 git revert 명령어는 저장소 히스토리상 특정 시점의 개별 커밋으로 되돌릴 수 있습니다. 반면 git reset 명령어는 현재 위치한 커밋을 기준으로 거슬러 올라가는 방식으로만 동작합니다.
즉, 저장소 히스토리에서 멀리 떨어진 과거의 커밋을 취소하려면, 그 시점 이후의 모든 커밋을 제거한 후 변경 사항을 다시 커밋해야 합니다. 이는 저장소 히스토리의 정확한 기록을 보존하기 어렵게 만들며, Git 같은 소스 관리 도구를 효과적으로 활용하는 데 필수적인 요소를 잃게 됩니다.
마무리
git revert 명령어를 사용하면 특정 커밋 이후 코드 저장소에 적용한 변경 사항을 취소할 수 있습니다. 커밋을 삭제하는 대신, 현재 커밋과 이전 커밋 사이의 변경 사항을 파악해 그 변경을 되돌리는 새로운 커밋을 생성합니다.
이 글에서는 Git에서 git revert 명령어를 사용해 커밋을 되돌리는 방법을 알아보았습니다. 이제 전문 개발자처럼 git revert 명령어로 커밋을 되돌릴 준비가 되셨습니다!