[Git] 3-way merge 더 알아보기

go_go_·2022년 10월 13일
0

Git

목록 보기
8/12
post-thumbnail

📌 3-way merge

git에서 다른 브랜치와 병합할 때 두가지 방법이 있다.
1. Fast-forward
2. 3-way merge

main과 branch1이 있을 때 main에서 병합을 시도하려 한다.

어느 상황일 때 어떤 병합 방법을 쓸까?

  1. Fast-forward
  • branch1의 조상커밋을 main이 가르키고 있을 때 일어난다.
  • main에서 변한 내용이 없고, branch1은 기존 파일에서 변화하였다.
  • main이 branch1의 최신 커밋을 가르키며 병합이 끝난다.
  • 합병 후 새로운 커밋이 생기지 않는다.
  1. 3-way merge
  • branch1의 조상커밋과 main의 위치가 다르다.
  • main과 branch1 내용이 모두 변화하였다.
  • main, bracnh1, 둘의 공통 조상 커밋을 비교하여 합병한다.
  • 새로운 커밋이 생성하며 합병이 끝난다.

두 합병 방식의 차이 예제는 따로 포스팅 하였다.
Fast-forward와 3-way merge 예제보기


🔎 원리 및 예제

아래는 하나의 파일의 대해 각각 다른 브랜치 main과 branch1에서 수정한 내용이다.
공통조상은 main과 branch1이 시작한 커밋시점 내용이다.

동일 파일 내 공통조상, main, branch1에서 내용

공통조상mainbranch1
1AA
2BBB
3C12
4DD
  • 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를 한다.

공통조상mainbranch13-way merge
1AAA
2BBBB
3C12충돌!
4DD
  • 1행 : A
    • 나(main)은 수정하지 않았지만 합병 브랜치(branch1)에서 수정이 일어났다. -> 수정 반영
  • 2행 : B
    • 나(main)과 합병 브랜치(branch1) 모두 수정이 일어나지 않았다. -> 유지
  • 3행 : 충돌!
    • 같은 파일, 같은 위치에서 나(main)와 합병 브랜치(branch1)에서 모두 수정이 일어났다. -> 충돌
  • 4행 : 삭제됨
    • 나(main)는 수정했고 합병 브랜(branch1)에서 수정이 일어나지 않았다. -> 수정 반영

자동 병합이 완료되고, 충돌이 일어난 부분은 파일을 수정하여 add 후 commit을 해주면 병합이 완료된다.


출처
https://www.youtube.com/playlist?list=PLuHgQVnccGMA8iwZwrGyNXCGy2LAAsTXk

profile
개발도 하고 싶은 클라우드 엔지니어

0개의 댓글