꼬인 Git 히스토리, 특정 커밋으로 완벽하게 되돌리는 법 (Revert, Reset, Checkout)
블로그 포스팅용으로 핵심만 정리했습니다.
들어가며: “아, 그 기능 넣기 전으로 돌아가고 싶다!”
코드를 수정하고 커밋했는데, 예상치 못한 버그가 터지거나 방향이 잘못되었음을 깨달았을 때. 우리는 과거의 특정 시점으로 돌아가고 싶다는 생각을 간절하게 합니다. Git은 이런 상황을 위해 강력한 시간 여행 도구들을 제공합니다. 바로 Revert, Reset, Checkout 입니다. 각 명령어의 특징을 정확히 이해하고 상황에 맞는 최적의 방법을 사용해 보세요.
1. Revert: 실수를 기록으로 남기는 안전한 방법 (협업용)
git revert는 과거의 실수를 없었던 일로 만들지 않습니다. 대신, **”A라는 커밋에서 했던 작업을 정확히 반대로 하는 새로운 커밋”**을 만들어냅니다. 기존의 커밋 히스토리를 그대로 보존하기 때문에, 여러 사람과 함께 작업하는 원격 저장소(GitHub)에서 사용하기 가장 안전한 방법입니다.
- 언제 사용할까?
- 이미
push까지 완료해 팀원과 공유된 커밋을 되돌릴 때 - 누가, 언제, 어떤 실수를 바로잡았는지 이력을 남기고 싶을 때
- 이미
- 핵심 명령어 Bash
# 되돌리고 싶은 커밋의 해시(ID)를 지정합니다. git revert <커밋 해시> - 장점: 안전하다. 히스토리가 보존되어 투명하다.
- 단점: 불필요한 revert 커밋이 히스토리를 지저분하게 만들 수 있다.
2. Reset: 과거로 시간을 되돌리는 강력한 방법 (개인용)
git reset은 특정 커밋 시점으로 아예 돌아가 버립니다. 돌아가려는 시점 이후의 모든 커밋 히스토리가 삭제될 수 있어 매우 강력하고, 때로는 위험한 명령어입니다. 아직 원격 저장소에 올리지 않은 로컬 커밋들을 정리할 때 유용합니다.
- 언제 사용할까?
- 아직
push하지 않은 로컬 커밋들을 되돌리거나 합치고 싶을 때 - “방금 한 커밋은 그냥 없었던 일로 할래” 와 같이, 나 혼자 보는 히스토리를 깔끔하게 관리하고 싶을 때
- 아직
- 핵심 명령어 Bash
# 돌아갈 커밋 이후의 변경 내용을 모두 삭제합니다. (가장 강력) git reset --hard <돌아갈 커밋 해시> # 커밋만 되돌리고 변경 내용은 남겨둡니다. (기본 옵션) git reset --mixed <돌아갈 커밋 해시> - 장점: 히스토리를 깔끔하게 관리할 수 있다.
- 단점: 이미
push한 커밋에 사용하면 팀원의 히스토리가 꼬일 수 있어 매우 위험하다.
3. Checkout: 과거 시점을 잠시 구경하는 방법
git checkout은 특정 커밋의 상태를 잠시 확인하고 둘러보고 싶을 때 사용합니다. 마치 박물관의 전시품을 보듯 해당 시점의 코드를 열람할 수 있지만, 그 상태에서 새로운 변경사항을 만들고 저장하는 것은 권장되지 않습니다. (detached HEAD 상태)
- 언제 사용할까?
- “1.2 버전 때 이 기능이 어떻게 동작했더라?” 하고 코드를 확인만 하고 싶을 때
- 과거의 버그를 재현하거나 분석해야 할 때
- 핵심 명령어 Bash
# 특정 커밋 시점의 코드를 둘러봅니다. git checkout <확인하고 싶은 커밋 해시>
Q&A: 서버 배포 후 큰 문제 발생! 가장 안정적인 버전으로 복구하기
만약 Firebase 같은 서비스에 배포했는데 심각한 오류가 발견되어, 가장 안정적인 이전 버전으로 즉시 돌아가야 한다면 어떻게 할까요? 이때는 reset과 push --force 조합이 가장 빠르고 효과적입니다.
- 안정 버전의 커밋 해시 찾기
- Firebase/서버의 배포 기록에서 문제가 없던 마지막 버전의 커밋 해시를 찾아 복사합니다.
- 로컬 저장소를 안정 버전으로 초기화
--hard옵션으로 내 컴퓨터의 코드를 해당 시점으로 완벽하게 되돌립니다.
git reset --hard <안정-버전-커밋-해시> - 원격 저장소(GitHub)에 강제로 덮어쓰기
- 과거로 돌아간 로컬 상태를 기준으로 원격 저장소를 강제로 덮어씁니다.
git push origin main --force⚠️push --force는 원격 히스토리를 강제로 변경하므로, 이 복구 작업에 대해 팀원과 반드시 소통해야 합니다. 혼자 관리하는 프로젝트가 아니라면 사용에 극도의 주의가 필요합니다.
마치며
Git의 시간 여행은 강력하지만, 그만큼 책임이 따릅니다. 협업 시에는 revert로 안전하게, 혼자 작업할 때는 reset으로 깔끔하게! 이 두 가지만 기억해도 대부분의 실수를 바로잡고 깨끗한 히스토리를 유지할 수 있을 겁니다.