본문 바로가기

깃 브랜치 (git branch) 4. 브랜치와 병합 이해하기. fast forward, recursive strategy 생각 해 보기.

참고 :

생활코딩. 지옥에서 온 깃. 

https://www.opentutorials.org/course/2708/15263


깃(git)의 공식 홈페이지 Git SCM

https://git-scm.com/downloads

- Documents / book (언어 : 한국어) : https://git-scm.com/book/ko/v2

- 3.2 Git 브랜치 - 브랜치와 Merge 의 기초







브랜치(branch)를 만들고 병합(merge)하는 크게 2가지 경우가 있다.


1. fast-forward

2. merge commit


위에 대해 이해해보자.





상태 : master 브랜치 commit 3번 함. (각 C0, C1, C2(현재))




상태 : 이슈(ISSUE. 기능의 추가, 버그의 수정 등..)가 발생하여, 브랜치 'iss53'을 만듦


$ git checkout -b iss53

=    $ git branch iss53

$ git checkout iss53


'-b' 는 위 2줄의 명령어를 한번에!



상태 : 브랜치 'iss53'에서 이슈를 처리한 후, commit 'C3' 를 작성한다.

이슈를 처리했으니, 다시 마스터로 돌아간다.







상태 : 그런데, 갑작스런 문제 hotfix가 발생하여 브랜치 'hotfix', commit C4를 생성한다.




상태 : 긴급한 문제 'hotfix'를 처리 한 후, master로 다시 병합(merge : fast-forward방식) 한다.



마스터가 새로운 커밋을 생성하지 않았을 때,


마스터가 가르키고 있는 커밋(C2)에서 커밋(C4)으로 '빨리감기(fast-forward)'한다.

(C4는 C2에서 기반한 브랜치이기 때문에 이동만 한다.)


별도의 commit을 생성하여 병합을 하는게 아니라, master가 가르키고 있는 브랜치 포인터를 바꾸기만 한다.



그리고, 해결한 'hotfix'브랜치는 삭제한다. (중복 브랜치는 불필요)



명령어


$ git checkout master

$ git merge hotfix

Updating f42c576..3a0874c

Fast-forward

 index.html | 2 ++

 1 file changed, 2 insertions(+)


$ git branch -d hotfix

Deleted branch hotfix (3a0874c).



상태 : 다시 iss53으로 돌아와 처리한 후, commit 'C5'를 만든다.

이슈를 처리했으니 마스터로 돌아가 해결한 이슈를 병합(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(+)


git merge iss53을 통해 master와 iss53을병합 하면, 


위 (fast-forward)와는 다르게 'recursive' strategy라는 설명이 나온다.



브랜치 'iss53' 가 만들어진 이후, master는 C4라는 새로운 커밋이 생성되었다.

그러므로 fast-forward가 되지 않는다.


이럴 때, git은 내부적으로

master와 iss53의 공통의 조상을 찾는다. - (C2)


그 다음 '3-way Merge'라는 방법으로 C4와 C5를 합친다.


다음, 합쳐진 결과를 새로운 커밋으로 만든다. (아래 C6)








병합을 할 때, 

공동 선상에 있다면 fast-forward 방식으로 브랜치 포인터를 이동 시키기만한다.

하지만, 

부모가 새로운 커밋을 생성했다면, 3-way merge를 통해 새로운 커밋을 생성하고 합쳐지게 된다.