본문 바로가기

Git

[Git] branch 병합하기 (merge), fast forward와 merge commit의 차이점

728x90
반응형

서로 다른 branch 병합하기 (merge)


현재 master, exp 라는 branch가 있을 때,


exp를 master에 병합할 경우 master 브랜치로 이동하고 exp를 병합합니다.

$ git checkout master

$ git merge exp


exp 병합 전


exp 병합 후


commit 5는 원래 마스터가 가지고 있는 내용. 3,4가 exp꺼였는데 master에 병합된 내용




master를 exp로 병합할 경우

$ git checkout exp

$ git merge master


master를 exp에 병합하면 exp와 master의 내용이 똑같아 지고 같은 위치(head)에 존재합니다.



그렇다면 master와 동일한 내용을 갖고 있는 exp를 삭제해 보겠습니다.

$ git checkout master

$ git branch -d exp


이제는 master branch만 존재하는 것을 확인할 수 있습니다.






fast forward와 merge commit의 차이점

fast forward의 예

`master` 브랜치에서 갈라져 나온 hotfix 브랜치

위의 그림을 해석해보자면 master는 C0, C1, C2 순으로 커밋했습니다.

이후 급한일을 처리하기 위해 hotfix 브랜치를 만들고 C4커밋, iss53 브랜치를 만들고 C3커밋을 했습니다.


그 이후에 master는 새로운 커밋을 하지 않은 상태입니다.



Merge 후 `hotfix` 같은 것을 가리키는 `master` 브랜치

이 때, C2커밋 상태에 있던 master에 hotfix를 병합하려고 할 경우 fast forward가 일어납니다.

서로 다른 상태를 병합하는 것이 아니고 master를 hotfix 위치로 이동만 해도 되는 상태이기 때문에 별도의 머지를 위한 커밋이 발생하지 않습니다.




이번에는 merge commit이 될 경우를 살펴보겠습니다.

커밋 3개를 Merge

iss53이 커밋 C5까지 된 상태이고, C4에는 hotfix branch가 삭제되고 master만 존재하는 상태입니다.

Merge 커밋

iss53을 master에 병합해보려고 합니다. 아예 다른 결과물을 갖고있는 master와 iss53은 merge되어 C6이라는 commit을 만들게 됩니다.

이렇게 병합할 때 새로운 commit을 생성할 경우를 merge commit 이라고 합니다.



다시 정리하자면 merge commit은 서로 다른 상태의 브랜치를 병합해서 새로운 commit을 만드는 경우이고

fast forward는 동일 내용이 포함되는 브랜치일 경우 브랜치 이동만으로 병합해서 따로 commit을 생성하지 않는 경우입니다.







참고 : 생활코딩 - 지옥에서 온 Git

참고2 : 브랜치와 Merge의 기초(pro git)

728x90
반응형