git reset <커밋>은 현재 브랜치가 가리키는 커밋(HEAD)을 옮기는 명령이다. 옵션에 따라 스테이징 영역(staging area, index)과 작업 디렉터리(working directory)까지 함께 되돌릴지가 달라진다.
| 옵션 | HEAD | 스테이징 | 작업 디렉터리 |
|---|---|---|---|
--soft | 이동 | 유지 | 유지 |
--mixed (기본) | 이동 | 되돌림 | 유지 |
--hard | 이동 | 되돌림 | 되돌림 |
--soft: 방금 한 커밋만 취소하고 변경은 스테이징된 채 남긴다. 커밋 메시지를 고치거나 여러 커밋을 하나로 다시 묶을 때 쓴다--mixed: 커밋과git add를 취소한다. 파일 내용은 그대로라 다시 골라 담을 수 있다--hard: 커밋하지 않은 변경까지 지운다. 추적되지 않는 파일은 남지만 수정 내용은 복구가 어렵다
git reset --soft HEAD~1 # 마지막 커밋 취소, 변경은 스테이징 유지
git reset HEAD~1 # = --mixed
git reset --hard origin/main--hard로 커밋을 날렸어도 커밋 자체는 한동안 남아 있어서 reflog로 되살릴 수 있다. 이미 푸시한 커밋을 되돌릴 때는 히스토리를 다시 쓰는 reset 대신 git revert가 안전하다(머지와 리베이스 참고).
출처: git-reset 문서