0. Introduction

  • 이번 단원에서는 git의 merge 원리인 Fast-forward와 3-way merge에 대해 알아본다.

Fastforward vs 3-way merge

  • Git에서 merge가 이뤄지는 두가지 방식인 Fast forward3-way merge를 비교해보자.

Fast forward(빨리 감기)

두 브랜치가 공통 커밋을 조상으로 가지고 있는데, 한 쪽 브랜치에만 이후의 커밋이 있을 때, 병합하기 위한 다른 커밋을 만들지 않고, HEAD만 이동하여 병합한 방식

  • 아래 이미지처럼 A branch에서 B branch가 분기되었다.
  • B branch의 최신 버전에는 A branch의 최신 버전을 가지고 포함하고 있다.

image

  • 이런 상황에서 Fast forwardA branch의 HEAD를 단지 아래처럼 B branch의 최근 commit으로 옮긴 후, B branch를 제거하는 방법이다.

image

단점: 작업을 하고나서 어떤 브랜치를 사용했고, 언제 병합했는지 기록에 남지 않는다.

  • 그러면 fast-forwad 방식으로 merge 작업을 해보자.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    > $ git branch another-branch
    > $ git switch another-branch
    
    # leopards.yaml의 memeber에 하나를 추가한다.
    
    > $ git commit -am'Add memebers in Leopards.yaml'
    
    # leopards.yaml의 memeber에 또 하나를 추가한다.
    
    > $ git commit -am'Add memebers in Leopards.yaml'
    
    > $ git switch main
    > $ git merge another-branch
    Updating 3d75f7f..09994e8
    Fast-forward
    leopards.yaml | 2 ++
    1 file changed, 2 insertions(+)
    (base)
    
    # 그리고 another-branch를 제거한다.
    > $ git branch -d another-branch
    
  • 위 코드를 보면 Fast-forward 단어를 확인할 수 있다.

  • 만약 이 방식으로 하지 않고, 병합 커밋 을 만들어 merge하려면 아래 명령어를 사용한다.

    • git merge --no-ff (병합할 branch명)

3-way merge

이 방식은 Fast-forward와 달리 기록이 남는 방법으로, 한 branch에서 두 branch로 분기되고, 분기된 후 각 branch에서 추가적인 commit이 발생한 상황에서 merge를 할 때의 원리를 말한다.

  • 아래 총 3 군데 를 비교하여 어느 변화를 받아들일지 또한 어느 부분을 충돌로 인식하여 사용자에게 맡겨야 하는지를 결정한는 걸 3-way merge 라 한다.
    • 아래 이미지 같은 상황에서 분기가 시작된 부분을 기준으로
    • A branch의 최근 commit 부분
    • B branch의 최근 commit 부분

image

  • 그래서 새로운 merge commit이 생성된다.

image

  • git merge --no-ff (병합할 branch명) 를 사용한다.

    • ff는 fastforward를 의미한다.
    1
    2
    3
    4
    
    $ git merge --no-ff main2
    Auto-merging leopards.yaml
    CONFLICT (content): Merge conflict in leopards.yaml
    Automatic merge failed; fix conflicts and then commit the result.
    

Reference