시간을 되돌리는 타임머신: git reset 완벽 해부

“이 커밋은 완전히 잘못됐어. 아예 없던 일로 하고 싶어.”

이럴 때 사용하는 명령어가 바로 git reset입니다. Git의 HEAD를 과거 커밋으로 되돌리고, 그 이후 변경분을 어디에 둘지 결정할 수 있는 강력한 도구죠. 문제는 --soft, --mixed, --hard 옵션이 각각 어떤 결과를 만드는지 헷갈리기 쉽다는 점입니다. 핵심은 단 하나, “되돌리고 난 뒤 변경 사항을 Git의 어느 영역에 남겨 둘 것인가?”입니다.


Git의 3가지 작업 영역 이해

git reset을 이해하려면 Git이 변경 사항을 어떻게 저장하는지부터 알아야 합니다.

  • Repository (HEAD): 이미 커밋으로 확정된 Git의 역사.
  • Staging Area (Index): git add로 다음 커밋에 포함될 변경이 대기하는 공간.
  • Working Directory: 에디터에서 실제로 코드를 수정하는 내 작업 폴더.

3가지 옵션 비교 (핵심: 변경 사항이 어디에 남는가)

git reset HEAD~3처럼 최근 세 개 커밋을 되돌린다고 가정해 봅시다. 각 옵션은 변경 사항을 다음과 같이 처리합니다.

옵션 HEAD (커밋) Staging Area (Index) Working Directory (작업 파일) 용도 (Use Case)
--soft 과거 커밋으로 이동 유지 (변경 내용이 add 상태로 남음) 유지 여러 커밋을 묶어 다시 커밋하거나 메시지를 손볼 때
--mixed 과거 커밋으로 이동 비움 (Index 초기화) 유지 가장 일반적인 되돌리기. 커밋만 취소하고 코드는 그대로 둘 때 (기본값)
--hard 과거 커밋으로 이동 비움 (Index 초기화) 삭제 (변경 내용 제거) 위험! 현재 작업까지 모두 지우고 과거 상태로 돌아가고 싶을 때

실무에서 가장 많이 쓰는 패턴

코드는 살리고 커밋만 취소하고 싶다면 --mixed를 사용합니다. 기본 옵션이기 때문에 생략해도 결과는 같습니다.

# 작업 내용은 유지하고 커밋만 취소
git reset --mixed HEAD~1

# 또는 기본값이라 옵션 생략 가능
git reset HEAD~1

Pro Tip

--hard는 강력하지만 그만큼 위험합니다. 실행 전에 반드시 git status로 작업 중인 파일이 없는지 확인하세요. 되돌릴 작업이 있다면 미리 백업하거나 브랜치를 따 두는 습관을 들이면 안전합니다.


궁금한 점이나 추가로 다뤘으면 하는 내용이 있다면 댓글로 남겨 주세요.

댓글남기기