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 다시

명령 종류

명령약어동작
pickp그대로 사용
rewordr메시지만 수정
edite멈춰서 내용 수정(파일 분리 등)
squashs이전 커밋에 합침 + 메시지 합침
fixupf이전 커밋에 합침 + 메시지 버림
dropd커밋 삭제
(순서 변경)줄 순서를 바꾸면 커밋 순서도 바뀜

[!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