본문 바로가기

개발 환경 및 도구

[Git] 실수로 올린 커밋 되돌리기 - reset, revert 차이점

들어가며

Git을 사용하다 보면 "앗!" 하는 순간이 있습니다. 중요한 정보를 실수로 커밋했거나, 잘못된 코드를 푸시했을 때죠.
이런 상황에서 사용할 수 있는 git reset과 revert의 차이점과 적절한 사용법을 알아보겠습니다.

git reset vs git revert

간단히 말하면:

  • git reset: 커밋 히스토리를 실제로 지웁니다 (혼자 작업하는 브랜치에 적합)
  • git revert: 새로운 커밋을 만들어 변경사항을 되돌립니다 (협업하는 브랜치에 적합)

git reset 사용하기

1. reset의 세 가지 모드

# 1. Soft Reset: 커밋만 되돌리고 변경된 파일은 스테이징 영역에 유지
git reset --soft HEAD~1

# 2. Mixed Reset (기본값): 커밋과 스테이징을 되돌리고 변경된 파일은 워킹 디렉토리에 유지
git reset HEAD~1
# 또는
git reset --mixed HEAD~1

# 3. Hard Reset: 커밋, 스테이징, 워킹 디렉토리 모두 되돌리기
git reset --hard HEAD~1

주의사항

  • --hard 옵션은 변경사항을 완전히 삭제하므로 신중하게 사용해야 합니다
  • 이미 원격 저장소에 푸시한 커밋을 reset하면 강제 푸시(git push -f)가 필요합니다
  • 강제 푸시는 협업 시 다른 개발자들에게 문제를 일으킬 수 있습니다

git revert 사용하기

기본 사용법

# 가장 최근 커밋 되돌리기
git revert HEAD

# 특정 커밋 되돌리기
git revert [커밋해시]

# 여러 커밋 한번에 되돌리기
git revert [시작커밋해시]..[끝커밋해시]

revert의 장점

  1. 히스토리가 보존되어 추적이 용이합니다
  2. 다른 개발자들과 충돌 가능성이 적습니다
  3. 변경사항을 되돌렸다는 것을 명시적으로 보여줍니다

실전 시나리오

시나리오 1: 개인 브랜치에서 실수로 커밋한 경우

# 마지막 커밋을 취소하고 변경사항은 유지하고 싶을 때
git reset --soft HEAD~1

# 완전히 되돌리고 싶을 때
git reset --hard HEAD~1

시나리오 2: main 브랜치에 잘못된 코드를 푸시한 경우

# revert를 사용해 안전하게 되돌리기
git revert HEAD
git push origin main

시나리오 3: 특정 파일만 이전 상태로 되돌리고 싶은 경우

# 특정 파일을 마지막 커밋 상태로 되돌리기
git checkout HEAD -- path/to/file

# 특정 파일을 특정 커밋 상태로 되돌리기
git checkout [커밋해시] -- path/to/file

유용한 팁

1. reset 실수 복구하기

# reset --hard 후에도 reflog로 복구 가능
git reflog
git reset --hard HEAD@{1}  # 또는 특정 해시

2. revert 커밋 메시지 커스터마이징

git revert -e [커밋해시]  # 커밋 메시지 편집

정리

  • 혼자 작업하는 브랜치: reset 사용 (간단하고 깔끔함)
  • 공유된 브랜치: revert 사용 (안전하고 추적 가능)
  • 항상 변경사항을 되돌리기 전에 현재 상태를 브랜치로 백업하는 것을 추천
  • git reflog를 기억하면 대부분의 실수를 복구할 수 있음

참고할만한 Git 명령어

# 현재 상태 확인
git status

# 커밋 히스토리 확인
git log --oneline

# 변경사항 확인
git diff

# 특정 커밋의 변경사항 확인
git show [커밋해시]

이렇게 하면 Git으로 인한 실수를 효과적으로 관리할 수 있습니다.
항상 중요한 작업 전에는 브랜치를 만들어 백업하는 것을 잊지 마세요!