
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 브랜치가 변경된 것을 확인할 수 있다.
