그동안 프로젝트를 진행하면서 기능 한 단위로 떨어질 때만 commit을 남겼었는데, 중간에 작업했던 내용이 온전히 기록되지 않아서 여러 시점에 어떻게 작성했었는지 확인이 어려웠었다. 또 깜빡하고 너무 많은 commit을 남기게 되었을 때 이걸 합치면 좋을텐데.. 라는 생각이 들었었는데,squash
를 통해 여러 커밋들을 하나로 합칠 수 있다는 것을 알게 되었다.
이렇게 여러 커밋들을 squash
를 통해 합치면 원하는 만큼 돌아가면서 확인할 수 있도록 commit을 많이 남길 수 있고, Git 히스토리 관리를 더 깔끔하게 할 수 있다!
Git Squash는 여러번 커밋한 이력을 하나의 커밋 이력으로 만드는데 사용한다.
git squash
라는 명령은 따로 없고,
git rebase -i
명령어를 활용 하거나,git merge -squash
명령어를 통해 병합하는 동안 스쿼싱을 한다.먼저 commit 이력을 확인한다.
$ git log --pretty=oneline
이 명령어를 입력하면 그동안 한 commit들의 id값처럼 생긴, 숫자와 알파벳이 결합된 코드? 같은 로그가 나온다.
위 로그에서 "first commit"만 남겨두고 "second commit", "third commit", "fourth commit"을 합쳐보자.
3개의 커밋 이전인 "first commit"의 id값처럼 생긴 놈을 git rebase -i
명령어 뒤에 붙인다.
$ git rebase -i f1be886e5432b2dcf4f4b255537fad6f1bfbe6ee
그러면 Git이 squash에 대한 커밋 세부 정보와 함께 기본 편집기를 호출한다.
이게 뭐라는 거냐면, rebase를 통해 commit 이전 상태로 되돌아가려는데 남아있는 commit들을 어떻게 처리할 거냐고 Git이 물어보면서 사용 가능한 Command를 알려주는거다.
커밋들을 합치려면 이 Command 중에서 s, squash
를 사용해야 한다.
맨 앞에 있는 "second commit"만 남겨두고 commit 앞에 pick
이라고 써져 있는 것을 s
커맨드로 수정한다.
이렇게 s 커맨드로 수정한 후 편집기에서 저장하고 종료한다.
나는 nano editor를 사용해서 Ctrl+O
+Enter
(저장) Ctrl+X
(종료) 단축키를 사용했다.
편집기를 저장하고 종료하면 아래와 같이 commit message 입력 편집기가 열린다.
Git이 rebase를 통해 squash를 할건데, 이전에 작성한 commit message는 어떻게 할거냐고 물어보는거다.
이전 모든 commit message들을 싹 지운 후에, 하나로 만들 commit message를 적은 후 편집기에서 저장하고 종료한다.
git log --pretty=oneline
으로 commit 이력을 다시 확인하면 이전 세 commit이 합쳐져서 작성한 commit message인 하나의 commit으로 나온다. 성공적으로 git squash 완료!
이번엔 git merge --squash <병합되는 branch 이름>
명령어로 commit을 squash해보자.
"dev" 브랜치에 세 개의 commit 내역이 있고, "main" 브랜치로 병합하면서 저 세 개의 commit들을 하나의 commit으로 squash해볼 예정이다.
$ git checkout main
Switched to branch 'main'
이후 아래와 같이 git merge --squash <병합되는 branch 이름>
옵션을 사용하여 git merge를 수행한다.
$ git merge --squash dev
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
이렇게 하면 따로 commit message가 만들어지지는 않고, 그냥 변경 사항이 main 브랜치에 병합이 된다.
이렇게 새로운 내용이 있는 병합된 main 브랜치에서 commit message를 입력하면 세 개의 커밋 내용이 합쳐진 git squash 완료!
팀 프로젝트를 진행할 때는 git rebase -i
명령어를 통해 squash하는 방법을 더 많이 사용할 것 같다. 아무래도 Pull requests를 통해 branch merge를 많이 하니까 git merge --squash
명령어는 덜 쓸 것 같은 느낌? git merge --squash
명령어는 해당 branch에서 작성한 내용을 모두 하나의 commit으로 묶고 싶을 때만 사용할 것 같다.