Reset은 branch pointer를 옮기고 mode가 나머지를 결정해
git reset은 강력한 만큼 자주 오용되는 명령이야. 핵심은 단순해. 현재 branch pointer를 다른 commit으로 옮겨. 혼란은 index와 작업 트리가 함께 따라갈지 정하는 세 mode에서 생겨. 각 mode의 폭발 반경을 알면 reset 사고 대부분을 피할 수 있어.
--soft는 branch pointer만 옮기고 작업 트리와 index는 그대로 둬. 옛 tip과 새 target 사이 변경은 commit하지 않았지만 staged인 상태가 돼. 여러 commit을 하나로 모으거나 마지막 commit을 다시 만들기 좋아. --mixed(기본값)는 pointer와 index를 target에 맞추되 작업 트리는 남겨. 변경은 commit되지 않았고 stage도 되지 않은 상태가 돼. staging부터 다시 짤 때 유용해. --hard는 pointer, index, 작업 트리를 모두 target에 맞춰 덮어써. 해당 파일의 commit하지 않은 작업은 사라져. 강력하고 위험해.
이렇게 외우면 돼. soft는 pointer만, mixed는 pointer와 index, hard는 pointer와 index와 작업 트리까지. 갈수록 파괴 범위가 커져. git reset --soft HEAD~1은 마지막 commit을 풀되 변경을 staged로 남기고, git reset HEAD~3은 최근 세 commit의 변경을 unstage해 다시 작업하게 해. git reset --hard origin/main은 branch를 remote의 모습과 정확히 맞춰.
Reset은 로컬 이력을 다시 써. 대상 commit을 아직 push하지 않았다면 괜찮지만, 이미 공개했고 다른 사람이 그 위에서 작업했다면 published commit을 움직이는 일이 돼. 일반 규칙은 간단해. reset은 공개되지 않은 이력에 쓰고, 공개된 이력에는 다음 lesson의 git revert를 써.