git merge
fast-foward: 이미 같은 조상을 바라보고 거기에 연장선상의 커밋일 경우에는 그냥 기존 부모의 커밋이 앞으로 한단계 가는 fast-foward 형식으로 머지를 한다.
이 경우에 hotfix 브랜치를 master에 머지하면 fast-foward를 한다.
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)
이렇게 된 경우에는 fast-foward를 할 수 없고, 3-way Merge가 진행된다.
이미 마스터가 내가 기초가 된 것보다 더 한단계 이동.
$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)
두개의 커밋 결과를 하나의 커밋으로 합침. 그것의 결과를 별도 커밋으로 만들고 해당 커밋을 머지 당할 브랜치가 가리키도록 바꾼다.
아래같이 만들어진 머지 커밋은 부모가 여러개.
말그대로 베이스를 다시 한다 요런 말인것인데
요것에서 experiment 브랜치에서 git rebase master
를 하면 c3에서 변경된 사항을 patch로 만들고 이를 다시 c4에 적용시킨다.
이것이 바로 리베이스이다.
두 브랜치의 공통 커밋으로 이동
→ 해당 커밋부터 지금 checkout 브랜치의 커밋까지 diff 후 따로 임시 저장
→ rebase 할 브랜치(experiment)가 합칠 브랜치(master)가 가리키는 커밋을 가리키게 하고, 하까 저장해놓은 변경사항 차례대로 적용
즉, experiment가 master의 브랜치 변경을 베이스로 하여 자신의 변경을 추가로 얹어놓는것
experiment를 master에 rebase한 후 master에 experiment에 머지하면 머지 가능.
→ rebase를 하면 모든 작업이 차례대로 수행된 것 처럼 깔끔하게 적용된다. 커밋 히스토리가 깔끔해진다.
→ rebase 의 경우는 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하면서 합치고 merge 의 경우는 두 브랜치의 최종결과만을 가지고 합친다.
rebase를 이용하면 다른 브랜치에 새롭게 자리를 잡아서 업무를 하는게 가능하다. 가령 이런 경우.
client branch의 변경만을 master에 머지하고 싶을 경우,
client를 master에 rebase, master에서 client merge
→ 이렇게 되면 depth와 상관없이 master에 머지할 수 있다.
rebase에는 주의할 점이 있는데, 이미 공개 저장소에 Push 한 커밋을 Rebase 하지 마라는 것이다.
rebase는 기존의 커밋을 그대로 사용하는 것이 아니라, 내용은 같지만 다른 커밋을 새로 만든다.