Post

git squash - 커밋 합치기 기능

작업중에 여러 차레의 커밋을 하는 것은 개발자에게 많은 이점을 제공한다. 누군가의 개발로 이한 변화 결과를 확인하거나, 작업 이전의 상태로 롤백하기 등 유용한 상황이 많다.

하지만 이렇게 많은 커밋이 운영 브랜치에 고스란히 반영이 된다면 커밋 히스토리가 복장해지고 이해하기 어려워진다. 이런경우, –squash 옵션을 사용하게 되면 문제를 해결할 수 있다.

Squash 는 여러 개의 커밋을 하나의 커밋으로 합치는 방법으로 이미 커밋된 이력들을 하나로 합칠수 도 있고 병합단계에서 병합되는 커밋을 하나로 만들어 merge 할 수 있다.


1. Squash 병합

squash_1.png

병합(merge) 단계에서 –squash 옵션을 사용하게 되면 병합하고자 하는 브랜치의 커밋을 하나로 합쳐 merge 하게 된다. 따라서 브랜치를 병합할 때의 모든 커밋 히스토리가 유지되지 않고, 단일 커밋으로 대체된다.

1
git merge --squash [병합하고자 하는 브랜치명]

일반적으로 –squash 옵션은 작업 브랜치의 커밋 히스토리를 깔끔하게 유지하고 싶을때나, 코드 리뷰 과정에서 불필요한 커밋 히스토리를 제거하고 싶을 때 주로 사용한다.

2. rebase 를 통한 squash

1
2
3
4
5
git checkout [rebase 하고자 하는 브랜치명]

git rebase -i HEAD~[커밋개수] // 합치고자 하는 커밋의 개수를 의미한다.

git push origin [rebase한 브랜치명] --force
  • git rebase -i HEAD~[커밋개수] : interactive 모드 진입(텍스트 에디터가 열린다)
1
2
3
4
5
pick e20ca2441 fast-forward commit - 2
pick 1834bece6 fast-forward commit - 5
pick 720e4c513 fast-forward commit - 6

# Rebase 9fcbb01ff..720e4c513 onto 9fcbb01ff (3 commands)
  • 합치고자 하는 커밋의 pick 을 squash 로 변경해준뒤 저장하고 에디터를 종료(ctrl + c → wq!)한다.
1
2
3
squash e20ca2441 fast-forward commit - 2
squash 1834bece6 fast-forward commit - 5
pick 720e4c513 fast-forward commit - 6
  • 만약 e20ca2441, 1834bece6 커밋을 squash 로 변경하여 rebase 를 진행한다면 최종적으로 720e4c513 커밋 하나에 내용이 합쳐지게 된다.


git push origin [rebase한 브랜치명] - -force

  • rebase 를 마친 로컬 브랜치를 원격 저장소에 강제로 푸쉬하는 멍령어
  • 동료 개발자가 기존 브랜치를 내려받은 상황에 강제 푸쉬를 하게 되면 원격 저장소 동기화 문제가 생겨 충분한 의사소통을 한 후에 푸쉬를 해야한다.
This post is licensed under CC BY 4.0 by the author.