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 |