[Git] 2-Way Merge & 3-Way Merge

2023. 4. 13. 21:34공부/Git

머지가 머지?

Merge에는 여러가지 방법이 있다. 우선 2-way merge 에 대해서 예시를 들어서 설명하겠음.

 

2-Way Merge flow

  Main
file1 A
file2 B
file3 C
file4 D

다음과 같은 메인 브랜치가 존재한다고 가정하고, 이 Main 브랜치를 기반으로 협업을 위해 브랜치를 몇개 더 생성해서 작업을 한다면 다음 과 같을 것이다.

  Main 내가 작업한 브랜치 다른 사람이 작업한 브랜치
file1 A A A
file2 B B B2
file3 C C2 C3
file4 D D2 D

이 상태에서 나와 협업하는 개발자가 둘다 Merge를 했을때 발생할 결과는?

  Main 내가 작업한 브랜치 다른 사람이 작업한 브랜치 Merge 예상 결과
file1 A A A A
file2 B B B2 Conflict
file3 C C2 C3 Conflict
file4 D D2 D Conflict

file1 은 아무런 변동이 없어 그대로 나옴

file2 는 내가 작업한 결과와 다른 사람이 작업한 내용이 달라서 Conflict 발생

file3 또한 나와 다른 사람이 작업한 내용이 달라서 Conflict 발생

file4 또한 Conflict 가 발생한다.

 

이처럼  2-way merge는 단순하고 빠르지만, 거의 모든 경우에서 Conflict 를 발생시키기기에 안정성 측면에서 많이 아쉽다. 이를 개선한 방식인 3-way merge에 대해 알아보자.

 

3-Way Merge 가 머지?

3-way merge는 병합하려는 브랜치에서 추가로 변경 사항이 잇는 경우에 수행되며, 브랜치를 merge하기 위해 새로운 merge commit이 생성됨. 이 commit은 머지 할 두 브랜치에서 변경된 내용을 합친 결과를 반환하는데, 이를 위해 공통 조상 커밋을 기반으로 작업이 수행됨. 무슨 말인지 이해가 잘 안가는데 위와 같은 형식으로 살펴보자.

 

3-Way Merge flow

  Main 내가 작업한 브랜치 다른 사람이 작업한 브랜치
file1 A A A
file2 B B B2
file3 C C2 C3
file4 D D2 D

이 상태에서 3-Way Merge 방식으로 Merge를 하면 예상 결과는?

  Main 내가 작업한 브랜치 다른 사람이 작업한 브랜치 Merge 예상 결과
file1 A A A A
file2 B B B2 B2
file3 C C2 C3 Conflict
file4 D D2 D D2

file1 에서는 둘다 작업한 내용이 없어서 그대로 Merge

file2 에서는 다른 사람이 작업한 내용만이 확인되어서 B2가 Merge 될것임.

(이를 위해선 두 작업 내용을 비교하는 Base Commit이 필요함)

file3 에서는 Conflict가 발생하는데 내가 작업한 내용과 동료가 작업한 내용이 Base와 다르기때문에 발생한다. 

file4 에서는 D2를 반환하는데 내가 작업한 내용만이 Base 와 다르기 때문임.

 

'공부 > Git' 카테고리의 다른 글

[Git] Upstream?  (0) 2023.04.14
[Git] 이력관리를 위한 Rebase Merging  (0) 2023.04.14
[Git] CherryPick  (1) 2023.04.13
[Git] Stash?  (0) 2023.04.12
[Git] 브랜치 전략  (0) 2023.04.12