Git: 커밋 합치기(Squash)
마지막 업데이트
Squash는 여러 커밋을 하나로 합치는 것으로, "wip", "오타 수정", "이번엔 진짜 수정" 같은 지저분한 커밋들의 연속을 하나의 깔끔한 커밋으로 만듭니다. 보통 사용하는 도구는 인터랙티브 rebase - git rebase -i - 이며, 여기서 합칠 커밋을 표시합니다. squash는 히스토리를 다시 쓰므로 push 전이나 나 혼자 작업하는 브랜치에서 하세요.
이 명령들을 터미널 플레이그라운드에서 사용해 보세요 - 브라우저 안의 진짜 셸이라 설치할 것이 없습니다.
문법
| Command | What it does |
|---|---|
git rebase -i HEAD~3 | 최근 3개 커밋을 인터랙티브하게 rebase |
git rebase -i main | main 이후의 모든 커밋을 rebase |
git merge --squash feature | 머지 시 브랜치의 커밋들을 하나로 합침 |
git reset --soft HEAD~3 && git commit | rebase 없이 최근 3개 커밋을 합침 |
인터랙티브 rebase 명령
열린 에디터에서 pick을 다음 중 하나로 바꾸세요.
| Keyword | What it does |
|---|---|
pick | 커밋을 그대로 유지 |
squash (s) | 이전 커밋에 합치고 메시지를 병합 |
fixup (f) | 합치되 이 커밋의 메시지는 버림 |
reword (r) | 커밋은 유지하되 메시지를 편집 |
실전 예제
push 하기 전에 최근 세 개의 커밋을 하나로 합칩니다.
| Step | Action | Result |
|---|---|---|
| 1 | git rebase -i HEAD~3 | 최근 3개 커밋을 에디터에서 엽니다 |
| 2 | 2번과 3번 커밋을 squash로 설정 | 첫 번째 커밋에 합치도록 표시합니다 |
| 3 | 저장하고 합쳐진 메시지를 편집 | 세 개의 커밋이 하나의 깔끔한 커밋이 됩니다 |
Git 커밋 합치기(squash) 자주 묻는 질문
Git에서 최근 N개의 커밋을 어떻게 합치나요?
git rebase -i HEAD~N을 실행합니다(예: 최근 세 개는 HEAD~3). 에디터에서 첫 번째 커밋은 pick으로 두고 나머지는 squash로 바꿉니다(메시지를 버리려면 fixup). 저장한 뒤 합쳐진 커밋 메시지를 편집하면 커밋들이 하나로 합쳐집니다.squash와 fixup의 차이는 무엇인가요?
둘 다 커밋을 이전 커밋에 합칩니다.
squash는 커밋의 메시지를 유지하고 에디터에서 다른 메시지와 결합할 수 있게 합니다. fixup은 커밋의 메시지를 완전히 버리고 앞선 커밋의 메시지만 남깁니다 - 최종 메시지에 넣고 싶지 않은 "앗, 작은 수정" 커밋에 유용합니다.머지할 때 브랜치 전체를 어떻게 합치나요?
git merge --squash feature를 사용한 뒤 git commit을 하세요. 이렇게 하면 브랜치의 모든 변경 사항이 스테이징된 변경으로 적용되고, 브랜치의 개별 커밋을 가져오지 않고 대상 브랜치에 하나의 커밋으로 기록할 수 있습니다. GitHub의 "Squash and merge" 버튼도 같은 일을 합니다.인터랙티브 rebase 없이 합칠 수 있나요?
네.
git reset --soft HEAD~N은 브랜치를 N개 커밋 뒤로 되돌리면서 그 변경 사항을 모두 스테이징된 상태로 유지하고, 이어서 한 번의 git commit으로 하나로 기록합니다. rebase 에디터를 열지 않고 가장 최근 커밋들을 빠르게 합치는 방법입니다.온라인에서 연습할 수 있나요?
네. 터미널 플레이그라운드를 열면 브라우저 안의 진짜 셸에서 인터랙티브 rebase를 실행할 수 있습니다 - 설치할 것이 없습니다. Coddy의 무료 인터랙티브 Git 강의도 rebase와 히스토리 정리를 단계별로 다룹니다.