16장 restore·reset·revert를 상태별로 고른다
세 명령은 이름이 비슷하지만 대상이 다르다.
| 상황 | 보존하려는 것 | 기본 선택 | 핵심 효과 |
|---|---|---|---|
| staged만 취소 | 파일 내용 | git restore --staged 파일 |
index를 되돌림 |
| 커밋 전 수정 취소 | 취소 안 함 | git restore 파일 |
작업 폴더를 덮음 |
| 로컬 마지막 커밋 취소 | 파일 내용 | git reset --mixed HEAD~1 |
브랜치와 index 이동 |
| 로컬 커밋 취소, staged 유지 | staged 내용 | git reset --soft HEAD~1 |
브랜치만 이동 |
| 공유된 잘못된 커밋 취소 | 공유 역사 | git revert 커밋 |
반대 변경의 새 커밋 |
git reset --hard는 브랜치, index, 작업 폴더를 맞추며 로컬 수정 손실을 일으킬 수 있다. “깨끗하게 만든다”는 이유만으로 쓰지 않는다. git clean -fd는 untracked 파일과 폴더를 삭제하고 Git 역사로 복구하기 어렵다. 필요하다면 먼저 git clean -nd로 삭제 후보만 미리 본다.
merge commit을 revert할 때는 mainline 부모를 정하는 -m이 필요하다. 어느 부모를 기준으로 되돌리는지 그래프에서 확인하지 못했다면 멈추고 리뷰한다.