git reset

한 줄 요약

HEAD를 이동시켜 커밋을 취소하거나 되돌리기

선행 지식

기본 사용법

git reset <> <>

주요 옵션 (3가지 모드)

옵션커밋StageWorking Dir용도
--soft취소유지유지커밋만 취소
--mixed (기본)취소취소유지커밋 + Stage 취소
--hard취소취소취소모든 것 취소

시각적 이해

원래 상태

[c1]───▶[c2]───▶[c3]───▶[c4]
                          ▲
                         HEAD

git reset —soft HEAD~1

[c1]───▶[c2]───▶[c3]   [c4의 변경사항은 Stage에]
                  ▲
                 HEAD

Stage: c4의 변경사항 (커밋 준비 상태)
Working Dir: 변경 없음

git reset —mixed HEAD~1 (기본)

[c1]───▶[c2]───▶[c3]   [c4의 변경사항은 Working Dir에]
                  ▲
                 HEAD

Stage: 비어있음
Working Dir: c4의 변경사항 (수정된 상태)

git reset —hard HEAD~1

[c1]───▶[c2]───▶[c3]   [c4 완전히 삭제!]
                  ▲
                 HEAD

Stage: 비어있음
Working Dir: c3 상태로 완전 복원

실제 예제

직전 커밋 취소 (변경사항 유지)

# 커밋은 취소하지만 변경사항은 Working Dir에 유지
git reset HEAD~1
# 또는
git reset --mixed HEAD~1
 
# 상태 확인
git status
# Changes not staged for commit:
#        modified:   app.js

직전 커밋 취소 (Stage 유지)

# 커밋만 취소, 변경사항은 Stage에 유지
git reset --soft HEAD~1
 
# 상태 확인
git status
# Changes to be committed:
#        modified:   app.js
 
# 메시지만 바꿔서 다시 커밋
git commit -m "새로운 메시지"

직전 커밋 완전 삭제

# ⚠️ 주의: 변경사항 완전 삭제!
git reset --hard HEAD~1

여러 커밋 취소

# 최근 3개 커밋 취소
git reset HEAD~3
 
# 특정 커밋으로 이동
git reset a1b2c3d

Stage만 초기화

# Stage에 올린 모든 파일 내리기
git reset
# 또는
git reset HEAD

이는 git restore --staged .와 동일합니다.

언제 어떤 옵션을 사용하나?

—soft 사용 상황

  • 커밋 메시지만 바꾸고 싶을 때
  • 여러 커밋을 하나로 합치고 싶을 때 (squash)
  • 커밋을 다시 하고 싶을 때
git reset --soft HEAD~3
git commit -m "feat: 3개 커밋을 하나로"

—mixed 사용 상황 (기본값)

  • 커밋을 취소하고 파일을 다시 선택하고 싶을 때
  • 잘못된 파일이 커밋에 포함되었을 때
git reset HEAD~1
git add app.js   # 원하는 파일만 선택
git commit -m "feat: 수정된 커밋"

—hard 사용 상황

  • 모든 변경을 완전히 취소하고 싶을 때
  • 실험적인 작업을 버리고 싶을 때
# ⚠️ 되돌릴 수 없음!
git reset --hard HEAD~1

reset vs revert

git resetgit revert
커밋 히스토리 변경새 커밋으로 되돌리기
push 안 한 로컬 커밋에 적합push한 커밋에 적합
히스토리가 깔끔히스토리 보존
협업 시 위험협업 시 안전

git revert 참고

자주 하는 실수

push한 커밋을 reset

git reset --hard HEAD~1
git push   # 거부됨!
git push -f  # ⚠️ 다른 사람 작업 덮어씀!

해결: push한 커밋은 git revert 사용

—hard 사용 후 복구

--hard로 삭제한 변경은 복구하기 어렵습니다.

시도해볼 수 있는 방법:

# reflog에서 이전 상태 찾기
git reflog
# a1b2c3d HEAD@{1}: commit: feat: 중요한 기능
 
# 해당 커밋으로 이동
git reset --hard a1b2c3d

reset과 checkout 혼동

  • reset: HEAD를 이동 (브랜치 포인터 이동)
  • checkout: 작업 디렉토리 변경 (HEAD는 그대로)

안전한 사용을 위한 팁

  1. push 전에만 reset 사용
  2. 중요한 작업 전 브랜치 백업
    git branch backup-before-reset
  3. —hard 사용 전 상태 확인
    git log --oneline -5
    git status

관련 명령어

더 알아보기