📌 3-way merge
git에서 다른 브랜치와 병합할 때 두가지 방법이 있다.
1. Fast-forward
2. 3-way merge
main과 branch1이 있을 때 main에서 병합을 시도하려 한다.
어느 상황일 때 어떤 병합 방법을 쓸까?
- Fast-forward
- branch1의 조상커밋을 main이 가르키고 있을 때 일어난다.
- main에서 변한 내용이 없고, branch1은 기존 파일에서 변화하였다.
- main이 branch1의 최신 커밋을 가르키며 병합이 끝난다.
- 합병 후 새로운 커밋이 생기지 않는다.
- 3-way merge
- branch1의 조상커밋과 main의 위치가 다르다.
- main과 branch1 내용이 모두 변화하였다.
- main, bracnh1, 둘의 공통 조상 커밋을 비교하여 합병한다.
- 새로운 커밋이 생성하며 합병이 끝난다.
두 합병 방식의 차이 예제는 따로 포스팅 하였다.
Fast-forward와 3-way merge 예제보기
🔎 원리 및 예제
아래는 하나의 파일의 대해 각각 다른 브랜치 main과 branch1에서 수정한 내용이다.
공통조상은 main과 branch1이 시작한 커밋시점 내용이다.
동일 파일 내 공통조상, main, branch1에서 내용
행 | 공통조상 | main | branch1 |
---|
1 | A | A | |
2 | B | B | B |
3 | C | 1 | 2 |
4 | D | | D |
- 1행 : branch1에서 변화
- 기존 내용 : A
- main : 변화x
- branch1 : 변화o -> 내용삭제
- 2행 : 모두 변화 없음
- 기존 내용: B
- main : 변화x
- branch1 : 변화x
- 3행 : main, branch1 모두 변화
- 기존 내용: A
- main : 변화o -> 1
- branch1 : 변화o -> 2
- 4행 : main에서 변화
- 기존 내용: A
- main : 변화o -> 내용삭제
- branch1 : 변화x
main에서 branch1을 병합하려 한다.
git merge branch1
이 때 git은 main과 branch1, 공통조상을 보고 3-way merge를 한다.
행 | 공통조상 | main | branch1 | 3-way merge |
---|
1 | A | A | | A |
2 | B | B | B | B |
3 | C | 1 | 2 | 충돌! |
4 | D | | D | |
- 1행 : A
- 나(main)은 수정하지 않았지만 합병 브랜치(branch1)에서 수정이 일어났다. ->
수정 반영
- 2행 : B
- 나(main)과 합병 브랜치(branch1) 모두 수정이 일어나지 않았다. ->
유지
- 3행 : 충돌!
- 같은 파일, 같은 위치에서 나(main)와 합병 브랜치(branch1)에서 모두 수정이 일어났다. ->
충돌
- 4행 : 삭제됨
- 나(main)는 수정했고 합병 브랜(branch1)에서 수정이 일어나지 않았다. ->
수정 반영
자동 병합이 완료되고, 충돌이 일어난 부분은 파일을 수정하여 add 후 commit을 해주면 병합이 완료된다.
출처
https://www.youtube.com/playlist?list=PLuHgQVnccGMA8iwZwrGyNXCGy2LAAsTXk