[Git] Git merge의 종류 - Fast-forward와 3-way Merge
Fast - foward 방식
*Cn은 커밋이고, 숫자 n은 커밋의 순서를 나타낸다.
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)
master 브랜치에서 hotfix 브랜치를 merge한다.
- 명령어 실행 결과
Merge 메시지에서 “fast-forward” 를 확인할 수 있다. hotfix 브랜치가 가리키는 C4 커밋이 C2커밋에 기반한 브랜치이기 때문에 브랜치 포인터는 Merge 과정 없이 그저 최신 커밋(C4)으로 이동한다. 이런 Merge 방식을 “Fast forward” 라고 부른다. 즉, A 브랜치에서 다른 B 브랜치를 Merge 할 때 B 브랜치가 A 브랜치 이후의 커밋을 가리키고 있으면, 그저 A 브랜치가 B 브랜치와 동일한 커밋을 가리키도록 이동시킬 뿐이다.
3-way 방식
$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)
master branch에서 iss53 branch를 merge한다.
현재 브랜치가 가리키는 커밋이 Merge 할 브랜치의 조상이 아니므로 Git은 'Fast-forward’로 Merge 하지 않는다. 이 경우에는 Git은 각 브랜치가 가리키는 커밋 두 개(C4, C5)와 공통 조상 하나(C2)를 사용하여 3-way Merge를 한다.
- 명령어 실행결과
가끔씩 3-way Merge가 실패할 때도 있다. Merge 하는 두 브랜치에서 같은 파일의 한 부분을 동시에 수정하고 Merge 하면 Git은 해당 부분을 Merge 하지 못한다. 예를 들어, iss53브랜치와 master브랜치가 C2 커밋 이후 같은 부분을 수정했다면 Git은 Merge 하지 못하고 아래와 같은 충돌(Conflict) 메시지를 출력한다.
참고 출처