git squash로 merge 깔끔하게 기록 남기기 (예제)
git merge로 브랜치 병합시 지저분하게 git merge 기록이 발생하게 된다.
main 브랜치를 작업하던 브랜치로 pull할 때마다 더럽게 머지 기록이 쌓이곤 한다..
그래서 이런 커밋이력을 병합할때 깔끔하게 관리하기 위해 사용하는 것이 git merge --squash이다.
또한 git rebase 도 있다.
두개는 유사하지만 다른 기능을 가지고 있다.
1. git merge --squash
브랜치의 커밋이력들이 하나로 통합된다.
2. git merge --rebase
브랜치의 커밋이력을 묶어서 메인 브랜치(병합할 브랜치) 뒤로 보낸다.
테스트를 위해서 test-squash, test-rebase 브랜치를 생성했다.
그리고 test-squash와 test-rebase에 각각 다른 커밋이력을 만들어 준뒤 푸쉬를 해주었다.
1. squash
main으로 체크아웃 해준후 test-squash 브랜치를 merge --squash 해준다.
그럼 어떠한 변화가 있을까?
merge --squash를 해준 후 commit -m 으로 커밋해주면 다음과 같이 머지한 커밋이력이 하나로 합쳐 1개의 커밋으로 만들 수 있다.
커밋 1개는 애매한거 같아서 3개 넣고 머지 스쿼시 해봄
3개의 커밋이력이 squashed commit of the following라는 메시지로 1개의 커밋으로 머지되어 있음
2. rebase
git rebase 를 실험하기 위해 rebase1, rebase2 커밋 두개를 추가함
전에 한 squash 때문에 충돌나길래 적당히 해결해주고 continue rebase를 눌러준다.
참고로 gui 썼음 (github desktop)
로그 확인하면 main 기존 커밋과 merge squash 커밋 사이에 rebase 브랜치의 커밋들이 들어간 것이 보인다.
한번더 rebase 브랜치에 rebase3,4 커밋 생성후 git rebase test-rebase를 시도했더니
아래와 같이 새롭게 커밋이력을 만들어 준다.
git rebase 명령어로 인해 이미 push된 squashed commit과 merge squash등이 재생성 된것 이다.
git merge처럼 merge 커밋이 안생기고 깔끔하게 커밋이력을 남길 수 있다.
결론
git merge --squash
git checkout main
git merge --squash test-squash
- test-squash 브랜치의 커밋이력들을 하나의 커밋으로 모아줌
git rebase
git checkout main
git rebase test-rebase
- test-rebase의 마지막 커밋 푸쉬 시점 이후의 main 커밋을 재생성해줌 -> rebase시 기존 main 커밋들이 새로 생김
- merge 커밋이 안생김 (squash도 안생기는데 rebase는 통합되지는 않음)