git reset
한 줄 요약
HEAD를 이동시켜 커밋을 취소하거나 되돌리기
선행 지식
- Commit - 커밋의 개념
- HEAD와 포인터 - HEAD의 역할
- Stage와 Working Directory - Git의 세 영역
기본 사용법
git reset <옵션> <커밋>주요 옵션 (3가지 모드)
| 옵션 | 커밋 | Stage | Working 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 a1b2c3dStage만 초기화
# 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~1reset vs revert
| git reset | git 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 a1b2c3dreset과 checkout 혼동
reset: HEAD를 이동 (브랜치 포인터 이동)checkout: 작업 디렉토리 변경 (HEAD는 그대로)
안전한 사용을 위한 팁
- push 전에만 reset 사용
- 중요한 작업 전 브랜치 백업
git branch backup-before-reset - —hard 사용 전 상태 확인
git log --oneline -5 git status
관련 명령어
- git revert - 안전하게 되돌리기
- git restore - 파일 복원
- git log - 커밋 히스토리 확인
- git reflog - 모든 HEAD 이동 기록
더 알아보기
- HEAD와 포인터 - reset의 원리
- 이전 버전으로 돌아가기 - 상황별 가이드
- 실수 복구 시나리오 - 다양한 복구 방법