02-06 대화형 리베이스와 히스토리 정리
지저분한 작업 커밋을 깔끔한 히스토리로 다듬는 법 — rebase -i와 squash/fixup/autosquash.
지저분한 작업 커밋을 깔끔한 히스토리로 다듬는 법 — rebase -i와 squash/fixup/autosquash.
목표: PR 올리기 전 커밋을 논리적이고 읽기 좋게 정리
[!danger] 황금 규칙 히스토리 재작성은 내 로컬에만 있는(아직 push 안 한) 커밋에만. 공유된 커밋엔 절대 금지.
🎯 왜 정리하는가
작업하다 보면 “wip”, “오타 수정”, “다시 시도” 같은 커밋이 쌓인다. 리뷰어와 미래의 나를 위해 논리 단위로 묶고 메시지를 다듬는다.
graph LR
subgraph "정리 전"
A["feat: 로그인"] --> B["wip"] --> C["오타"] --> D["다시"]
end
subgraph "정리 후"
E["feat: 로그인 추가"]
end
🔧 git rebase -i — 대화형 리베이스
git rebase -i HEAD~4 # 최근 4커밋 편집
git rebase -i <commit> # 그 커밋 '다음'부터 편집
편집 화면(에디터)에 커밋 목록이 뜨고, 각 줄 앞 명령을 바꾼다:
pick 9f3a1c2 feat: 로그인
squash a1b2c3d wip
squash 4d5e6f7 오타
reword 7g8h9i0 다시
명령 종류
| 명령 | 약어 | 동작 |
|---|---|---|
pick | p | 그대로 사용 |
reword | r | 메시지만 수정 |
edit | e | 멈춰서 내용 수정(파일 분리 등) |
squash | s | 이전 커밋에 합침 + 메시지 합침 |
fixup | f | 이전 커밋에 합침 + 메시지 버림 |
drop | d | 커밋 삭제 |
| (순서 변경) | 줄 순서를 바꾸면 커밋 순서도 바뀜 |
[!tip] squash vs fixup 메시지를 합쳐 정리하고 싶으면
squash, 사소한 수정 커밋을 흔적 없이 흡수하려면fixup.
⚡ autosquash — 자동 정리
수정 커밋을 만들 때 대상을 지정해두면 rebase가 자동 배치한다.
# 이전 커밋 abc123을 고치는 수정을 만들 때
git commit --fixup abc123 # "fixup! <원본 메시지>" 커밋 생성
git commit --squash abc123 # "squash! ..." 생성
# 자동 정렬해서 리베이스
git rebase -i --autosquash HEAD~5
fixup/squash 커밋이 대상 바로 뒤로 자동 정렬되어 손이 덜 간다.
git config --global rebase.autosquash true # 항상 켜기
✂️ 커밋 쪼개기 (edit)
하나의 큰 커밋을 여럿으로 나누기:
git rebase -i HEAD~3
# 대상 커밋을 'edit'으로 표시 → 멈추면:
git reset HEAD~ # 그 커밋을 풀어 변경을 작업영역으로
git add -p && git commit -m "..." # 원하는 단위로 다시 커밋
git add -p && git commit -m "..."
git rebase --continue
🔁 reset —soft로 합치기 (간단 버전)
선형으로 최근 N개를 하나로 합칠 땐 더 간단:
git reset --soft HEAD~3 # 최근 3커밋 풀기(변경은 스테이징 유지)
git commit -m "feat: 로그인 추가"
🚑 정리 중 문제 대응
git rebase --continue # 충돌 해결 후 계속
git rebase --abort # 전체 취소·원상복구
git reflog # 망쳤어도 이전 상태 복구 가능 ⭐
[!tip] 두려워 말 것 rebase -i로 망쳐도
git reflog에 리베이스 전 상태가 남아 있어git reset --hard HEAD@{n}으로 복구된다.
📋 체크리스트
-
rebase -i로 커밋 squash/reword/drop - squash vs fixup 구분
-
--fixup+--autosquash워크플로우 -
edit로 커밋 쪼개기 -
reset --soft로 빠르게 합치기 - reflog로 복구
- 공유 커밋 재작성 금지 원칙
🔗 관련 노트
- 02-05-stash-tag-cherry-pick — 이전
- 03-01-Git-내부-객체-모델 — 다음(심화)
- 01-03-브랜치와-병합 — rebase 기초
- 01-05-되돌리기와-복구 — reset/reflog
마지막 업데이트: 2026-06-02