git squash란
정확히 git squash라는 명령어를 없지만, merge할 때, 여러 커밋을 하나로 합치거나 interactive rebase를 할 때, squash라는 명령어가 쓰인다.
squash를 사용하게 되면 여러 개의 커밋을 하나로 합쳐주기 때문에 commit history를 깔끔하게 만들 수 있다.
$ git merge --squash my-feature $ git commit -m "your-commit-message"
이 때의 깃트리는 두 갈래로 뻗어나갔다가 다시 하나로 합쳐지는 모양을 하게 된다.

git rebase란
git
rebase
는 각 커밋이 하나의 부모를 가지게 한다. 즉, 그냥 rebase
만 하게 되면 모든 commit들은 합쳐지지 않고, 지정한 브랜치에 추가된다. (git log —graph
로 깃 트리 확인할 수 있다)$ git checkout my-feature $ git rebase develop $ git checkout develop $ git merge my-feature

여기서
i
옵션을 통해 HEAD에서부터 몇개의 커밋을 rebase
할 건지 지정할 수 있게 된다.git rebase -i HEAD~3 //총 3개의 커밋을 합치겠다.
그러면 3개의 커밋메세지와 함께
squash
를 적용할 수 있게 된다.pick 7c65355 Task 1/3 squash 2639543 Task 2/3 squash d442427 Task 3/3
git rebase의 경우, 공통 조상이 되는 브랜치로 이동해서 diff를 copy하게 됨으로 되도록이면 push하기 전, 자신의 브랜치에서 사용하는 것이 좋다
둘의 차이점은?
squash
는 말 그대로 여러 개의 커밋을 하나로 합쳐주는 기능
rebase
는 커밋 부모를 하나로 맞춰주기 대문에 마치 하나의 브랜치에서 작업한 것처럼 히스토리를 관리할 수 있게 한다.rebase
에서squash
를 사용하게 되면 커밋이 하나로 합쳐지는 것rebase
에서는 개수를 지정할 수 있다.

squash
와 rebase
를 적절히 사용하면 위와 같은 트리를 만들 수 있다고 한다.