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) 자주 묻는 질문
커밋을 squash한다는 것은 무슨 뜻인가요?
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 에디터를 열지 않고 가장 최근 커밋들을 빠르게 합치는 방법입니다.머지하기 전에 커밋을 합쳐야 하나요?
많은 팀이 그렇게 합니다. 그러면 기능 하나가 읽기 쉽고 되돌리기도 쉬운 커밋 하나로 들어갑니다. 대신 단계별 히스토리는 잃습니다. 나만 쓰는 브랜치에서는 마음껏 합쳐도 되지만, 공유 브랜치에서는 먼저 합의하세요. 다시 쓴 커밋 때문에 다른 사람 모두가 자기 사본을 reset해야 하기 때문입니다.
온라인에서 연습할 수 있나요?
네. 터미널 플레이그라운드를 열면 브라우저 안의 진짜 셸에서 인터랙티브 rebase를 실행할 수 있습니다 - 설치할 것이 없습니다. Coddy의 무료 인터랙티브 Git 강의도 rebase와 히스토리 정리를 단계별로 다룹니다.