0. Introduction
- 해당 내용은 제대로 파는 Git & GitHub - by 얄코 을 통해서 공부한 내용입니다.
- 이번 단원에서는 git의 merge 원리인 Fast-forward와 3-way merge에 대해 알아본다.
Fastforward vs 3-way merge
- Git에서
merge
가 이뤄지는 두가지 방식인 Fast forward 와 3-way merge를 비교해보자.
Fast forward(빨리 감기)
두 브랜치가 공통 커밋을 조상으로 가지고 있는데, 한 쪽 브랜치에만 이후의 커밋이 있을 때, 병합하기 위한 다른 커밋을 만들지 않고, HEAD만 이동하여 병합한 방식
- 아래 이미지처럼
A
branch에서B
branch가 분기되었다. B
branch의 최신 버전에는A
branch의 최신 버전을 가지고 포함하고 있다.
- 이런 상황에서 Fast forward는
A
branch의 HEAD를 단지 아래처럼B
branch의 최근 commit으로 옮긴 후,B
branch를 제거하는 방법이다.
❗ 단점: 작업을 하고나서 어떤 브랜치를 사용했고, 언제 병합했는지 기록에 남지 않는다.
그러면 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 부분
- 그래서 새로운 merge commit이 생성된다.
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.