Git Rebase
- git에서 한 브랜치에서 다른 브랜치로 합치는 방법은 merge, 와 rebase 두가지가 있다.
- 이미 해버린 커밋을 수정하는데 유용하게 사용되는 커맨드가 git rebase이다.
- 이전 커밋을 수정하고, 커밋을 다른 브랜치로 옮기는 일을 할 수 있으며 브랜치를 깔끔하게 유지하고, 브랜치를 이어 붙이는 등 커밋에 관련된 대부분의 것을 할 수 있다.
Git Merge vs Git Rebase
- git rebase가 유용하게 사용되는 첫번째 사용처는 merge이다. git merge보다 커밋 히스토리가 훨씬 깔끔하게 남기 때문에 다른 사람들의 작업을 보기가 편해진다.
Git Merge
- 두개의 branch를 merge 하기 위해 아래의 명령어를 사용한다.
git checkout master
git merge dev
- 그러면 아래와 같이 두개의 branch를 3-way merging을 통해 merge하게 되며 두개의 커밋을 포인팅하는 새로운 커밋이 생기고 이를 브랜치가 가리키게 된다.
- 여러명이 작업을 계속 git merge를 통해서 할 경우 지저분한 커밋 히스토리가 생기게된다.
Git Rebase
- git rebase는 커밋의 base를 다시 정하는 작업이다.
git rebase master dev
- 위의 명령어는 master와 dev 브랜치의 공통 조상 커밋부터 dev 브랜치까지의 모든 커밋의 base를 master 브랜치의 위치로 바꾸라는 의미이다.
- 로컬에 저장했던 각 커밋들을 하나하나 적용하는 과정에서 master branch와 conflict가 뜬다면 rebase가 중지되고 conflict를 해소한 후 git rebase --continue 명령어를 입력하면 다시 rebase가 진행된다.
과거의 commit 수정하기
-
git rebase를 사용하는 용도중 하나는 과거의 commit을 수정하는 것이다. 이때 과거의 커밋은 현재 HEAD가 있는 커밋, 즉 git commit --amend를 통해 고칠 수 있는 커밋 뿐만 아니라 현재 커밋부터 맨 처음 커밋까지의 모든 커밋을 의미한다.
git commit --amend
- git commit --amend를 통해 커밋을 수정하면 기존 커밋이 수정되는게 아니라 새로운 커밋이 생성되기 때문에 커밋 히스토리에 새로운 가지가 생기게 된다.
-
git rebase는 interative mode를 지원하는데, 이 모드에서는 커밋의 base를 재정의 할 때 각 커밋들에 대한 추가적인 작업을 할지에 대해 지적할 수 있다.
-
git rebase에 인자를 하나만 주면 두번째 인자로 HEAD를 준 것과 동일한 효과를 보이며 -i 옵션을 통해 interative mode를 통해 커밋이 적용될 때 부가 옵션을 줄 수 있다.
-
이때 squash를 통해 커밋을 하나로 만들 수 있다.