본문 바로가기
C.W.K.
Stream
Lesson 02 of 05 · published

reset: branch pointer 조심히 움직이기

~24 min · reset, head

Level 0추적 전 새싹
0 XP0/47 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

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를 써.

Code

세 mode, 세 의도·bash
# 마지막 commit undo + 변경 staged 유지로 amend 준비:
git reset --soft HEAD~1
# 이제 더 나은 메시지로 재 commit 또는 변경 분리.

# 마지막 commit 셋의 변경을 working tree 로 unstage:
git reset HEAD~3                # 암묵적 --mixed

# 파괴적 — branch + index + worktree 다 1 commit rewind:
git reset --hard HEAD~1

# Remote 와 정확히 일치하게 rewind (local extra 손실):
git fetch origin
git reset --hard origin/main
안 좋은 reset 에서 회복·bash
# git reset --hard 한 직후 commit 잃었어?
git reflog                       # reflog 에서 잃은 tip 찾기

# Reflog 는 이런 entry 보여줘:
# abc1234 HEAD@{0} reset: moving to HEAD~3
# def5678 HEAD@{1} commit: feature/x done

# 잃은 tip 을 rescue branch 로 복원:
git switch -c rescue def5678

# 또는 main 자체를 되돌리기:
git reset --hard def5678

External links

Exercise

연습용 branch에 commit 셋을 만들어. HEAD~2를 대상으로 soft, mixed(기본값), hard 세 reset mode를 각각 시험해. 시험 사이에는 git reset --hard ORIG_HEADgit reflog로 돌아가. 각 mode 뒤 git status를 실행하고 무엇이 남고 무엇이 버려졌는지 적어봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.