Merge는 분기된 Branch들을 합치기 위해서이다.
Merge는 흔히 3-Way Merge라고 부르는데, 뜻은 총 3개의 커밋을 기준으로 합친다는 뜻이다.
합치려는 2개의 커밋과 앞의 두 커밋의 공통 부모를 포함해서 3개를 애기한다.
공통 부모를 찾는 이유는 기준점을 찾기 위해서이다.
합치려는 2개의 커밋 중 하나로 기준점을 잡으면 누군가에게 추가하는 것이 누군가에게는 빼야되는 것이 되기 때문이다.
Merge가 되는 경우는 3가지로 나눌 수 있다.
1. 한 개의 Branch가 다른 하나의 Branch를 모두 포함하고 있을 경우로, 만약 HEAD가 더 큰 집합이라면 그대로 변함이 없을 것이고, 더 작은 집합이 HEAD라면 더 작은 집합의 위치가 더 큰 집합의 위치로 옮겨질 것이다.
2. 충돌이 날 경우로, 가장 골치 아프다. 서로 다른 브랜치에서 작업을 했는데 같은 파일을 수정했을 경우 공통 부모를 기준으로 서로 다른점을 비교해서 파일을 알려준다. 그렇다면 사용자는 해당 파일을 보고 합병해서 파일을 만들어 놓고 다시 commit을 해야 한다.
3. 충돌이 나지않아 곱집합이 공집합일 경우로 서로 자연스럽게 합쳐지는 경우이다.
사용법은 간단하다.
git merge "대상 브랜치"
Git Bash에서 해석을 해보자면,
먼저 HEAD를 master로 옮겼다.
그리고 대상으로 newBranch로 한 후에 merge를 하면 다음과 같이 하나로 합쳐진 것을 볼 수 있다.
이 경우는 merge 중에서 3번째 경우로 겹치는 파일이 없어서 문제없이 merge 되는 경우이다.
이번에는 충돌하는 경우를 보자.
먼저 master 브랜치를 충돌이 일어나게끔 파일을 수정 후에 commit 했다.
그리고 merge를 통해서 newBranch와 병합을 하면 메시지를 통해서 Merge Conflict in Test3.txt라며, Test3.txt 파일에서 충돌이 일어났음을 알려준다.
해당 파일을 보면 HEAD는 Conflict Line이라고 적혀있었는데, newBranch는 Trid라고 적혀있다고 알려준다.
이를 원하는대로 편집한 다음에 다음과 같이 진행하면 문제없이 병합되는 것을 볼 수 있다.