merge기록을 남기지 않는 fast-forward merge방식을 선호한다면, fast-forward merge가 불가능한 상황 (three-way merge case) 일 때 어쩔수 없이 no-fast-forward merge를 진행하여 merge기록을 남겨야만 하는것은 아니다.
rebase를 활용하면 fast-forward merge를 할 수 있다.
위 이미지는 현재 fast-forward merge가 불가능한 상황인 three-way merge case이다.
branch1
을 커밋 f
를 가리키게 rebase를 한다면 fast-forward merge가 가능하다.
나 혼자서 branch1
을 작업하고 있다면 언제든지 rebase를 자유롭게 할 수 있지만 만약 다른 개발자와 함께 branch1
에서 작업을 하고 있을 때 rebase를 한다면 위험하다.
rebase를 한다면 커밋의 포인터를 변경하게되는데 이렇게 커밋의 포인터정보가 바뀌게 된다면 기존의 커밋이 유지되는 것이 아니라 겉으로는 이름까지 같아보이는 새로운 커밋이 생성된 것이다.
이 때 내가 rebase를 한다면 다른 개발자와 커밋정보가 다르기 때문에 충돌이 발생할 수도 있으니 꼭 혼자만 브랜치를 관리하고 있을 때만 rebase를 사용하도록 하자.
실험결과 rebase는 해당 브랜치가 파생된 커밋 이전으로 rebase는 불가능한 것 같다.
위 그림 예제를 통해 보면
branch1
은 c커밋 이전으로 rebase가 불가하고 이후 커밋으로만 rebase가 가능하다.
# in rebase를 진행할 브랜치
git rebase 브랜치or해시코드
이후에 master
에서 branch1
을 fast-forward merge할 수 있다.
# in master
git merge branch1 # fast-forward merge 진행
브랜치에서 파생된 브랜치를 master브랜치에 rebase를 해야하는 경우가 있다.
예를 들어 위의 이미지와 같이 server
브랜치에서 파생된 client
브랜치가 있다고 하자.
이 때 테스트가 덜된 sever
브랜치는 납두고 client
브랜치만 master
브랜치로 합치고 싶을 때 rebase
의 --onto
옵션을 활용한다.
git rebase --onto master server client
server브랜치에서 파생된 client 브랜치를 master 브랜치로 rebase --onto 하는 명령어이다.
해당 명령어를 수행하면 아래 이미지와 같이 client
브랜치가 변경된 것을 확인할 수 있다.