Reset 은 branch pointer 를 옮기고, mode 가 나머지가 따라갈지 결정
git reset 은 Git 에서 가장 강력하고 가장 오용되는 명령. 핵심 동작은 단순: 현재 branch pointer 를 다른 commit 으로 옮김. 혼란은 index 와 working tree 가 따라갈지 결정하는 세 mode 에서 와. 어떤 의도에 어떤 mode 인지 알면 reset 관련 재앙의 95% 사라져.
--soft 는 branch pointer 만 이동. Working tree, index 그대로. 옛 tip 과 새 target 사이 commit 은 'uncommitted 하지만 staged' — commit 여러 개를 하나로 합치거나 마지막 commit 을 깨끗하게 다시 하는 정확한 상태. --mixed (default) 는 pointer 이동 + index 도 일치하게 reset. Working tree 그대로. Commit 들이 'uncommitted, unstaged' — stage 되는 거 완전 재작업에 유용. --hard 는 pointer 이동 + index reset + working tree 까지 일치하게 덮어써. 영향 받은 파일의 모든 uncommitted 작업 소멸. 강력하고 위험.
네이밍은 아쉽지만 안정적. 한 번 외워: soft = pointer 만, mixed = pointer + index, hard = pointer + index + worktree. 단계마다 파괴 증가. 가장 흔히 유용한 호출: git reset --soft HEAD~1 마지막 commit undo + 변경은 staged 유지해서 amend; git reset HEAD~3 (mixed) 마지막 commit 셋 unstage + 재작업; git reset --hard origin/main branch 를 remote 에 정확히 mirror.
Reset 은 local history 를 rewrite. 그 commit 들이 push 안 됐으면 문제 없음. push 됐고 남이 그 위에 작업했으면 published commit 을 옮긴 거고 force-push gymnastics 가 길. 일반 규칙: reset 은 unpublished history 용. Published history 엔 git revert, 다음 레슨.