2 minute read

개요


이번 글에서는 local repository에서 branch를 생성하여 작업을 한 후, 두 브랜치를 통합(merge)하는 법에 대해 알아보도록 하겠습니다.
merge를 하는 도중에 충돌(conflicts)이 발생할 수 있습니다.

현재 브랜치와 병합 하고자 하는 브랜치에서 같은 파일의 같은 위치를 수정했을 경우, 사용자가 어느 것을 선택할 것인지 Git은 알 수가 없기 떄문에 에러 로그로 사용자에게 충돌난 부분을 직접 수정해서 충돌을 해결해야되고 어느 부분에서 충돌이 발생했다고 표시를 합니다.
이번에는 실습을 통해 merge하는 방법과 충돌을 해결하는 방법에 대해 알아보도록 하겠습니다.

대체적으로 merge conflict가 발생하면 아래와 같은 형식으로 표시가 됩니다.

<<<<<< HEAD
코드1번
=======
코드2번
>>>>>> FOO

명령어

git merge
{대상브랜치} : 현재브랜치에서 대상브랜치를 병합시킴
--squash : 대상브랜치를 병합할 때, 커밋 이력을 모두 제거하고 작업된 내용만 병합
--no-ff : fast-forward 방식으로 병합할 때, 병합된 것임을 알리는 커밋 메시지 생성


Fast-Forward 방식으로 병합

master브랜치를 부모로 하는 dev_2_1202브랜치를 분기 생성했다고 가정했을때, 현재 dev_2_1202브랜치의 작업물들은 master브랜치의 작업물들의 내용과 역대 commit 내역이 동일한 상태일 것입니다. 그 상태에서 dev_2_1202브랜치의 작업물에 코드 한 줄을 추가하여 commit 했다면,

dev_2_1202브랜치는 master브랜치의 커밋 내역을 전부 다 포함하고 있고 그 상태에서 dev_2_1202브랜치가 커밋을 한번 더 했기 때문에, dev_2_1202브랜치가 master 브랜치 보다 더 최신 버전이고 앞선다고 볼 수 있습니다. 따라서 master 브랜치를 가져와 dev_2_1202브랜치에 병합합니다. 두 브랜치를 병합시 커밋 내역이 더 앞서가고 있는 브랜치를 기준으로 병합하는 것을 Fast-forward 방식 병합이라고 한합니다.(뒤쳐져 있는 master를 빨리 감기하여 통합시킴)

git checkout -b test
git add
git commit -m "test"

git checkout master
git merge test


Non Fast-Forward 방식으로 병합

통합 하려는 두 브랜치가 서로 다른 커밋 내역을 가지고 있을 경우(서로 포함 불가능한) Non Fast-Forward 방식으로 병합할 수 밖에 없습니다. 서로 다른 커밋 내역을 가지고 있기 때문에, 그리고 동일한 부분을 다르게 코딩했을 가능성도 있기 때문에 병합할 때 충돌이 발생할 수 있습니다.

git checkout main
git branch feature
git checkout feature
# feature 브랜치에서 커밋 작업
git add .
git commit -m "feature 브랜치 커밋 1"
# feature 브랜치에서 추가 커밋 작업
git add .
git commit -m "feature 브랜치 커밋 2"
git checkout main
# main 브랜치에서 커밋 작업
git add .
git commit -m "main 브랜치 커밋 1"
git merge feature


Non Fast-Forward 방식 => 두 브랜치를 하나로 합친 새로운 커밋을 진행

rebase 로 Merge

rebase는 말그대로 브랜치의 base(부모 브랜치)를 바꾸는 작업입니다. rebase로 부모 브랜치를 바꿔주어 브랜치를 통일한 후 Merge 하는식으로 작업합니다.

# git checkout dev_2_1202
# git rebase master


새로운 브랜치(branch) 생성해서 작업

아예 새로운 branch를 만들어서 작업하는것 또한 방법입니다. 새로운 브랜치인 dev_2_1202 브랜치를 생성합니다. 그러면 master 브랜치의 파일들과 커밋 이력을 그대로 복사되고, 독립적인 작업공간이 생성됩니다.

# git checkout -b dev_2_1202
# git branch

이후 수정적업을 새로운 branch에 push한 뒤 본류에 merge하는 순서로 해결 가능합니다.

# git add .
# git commit -m "dev_2_1202 메시지"

# git checkout master
# git merge dev_2_1202

merge와 관련된 옵션


  1. –squash 이 옵션은 대상 브랜치의 모든 커밋을 하나의 커밋으로 합쳐서 merge 하는 방식입니다. 즉, 대상 브랜치에서 작업했던 히스토리를 하나의 메시지로 압축시키는 것이죠. 이 옵션은 테스트 브랜치에서 원래 브랜치에 병합할 때 유용한 방식입니다. 즉, 애초에 하나인 브랜치가 임시로 빠져나와서 다시 통합할 때 사용하는 것이 좋습니다.

  2. –no-ff fast-forward 관계에서 merge를 하면 merge 커밋이 생략되는데, –no-ff 옵션을 주면 merge할 때 커밋을 생성합니다. 전자의 경우는 –ff 옵션과 같습니다.

Top