늘 겸손하게

Git branch 간 병합 본문

Programming Library & Tools/Git

Git branch 간 병합

besforyou999 2022. 2. 17. 17:15

Branch 병합의 종류

 

1.  fast-forward merge

2.  3-way merge

 

 

기초 지식

 

위 두 가지 병합 방법을 이해하기 위해서는 다음을 알아합니다.

 

1. Commit들은 이전 commit (부모 commit)을 가리키며 저장됨

 

2. Branch 는 branch에 담긴 commit들 중 가장 마지막 commit을 가리키는 포인터

 

3. HEAD는 현재 branch를 가리키는 포인터

 

예시

 

 

ls -al bash 명령어를 통해 볼 수 있는 .git 디렉토리 내부에 모든 commit 기록이 저장됩니다.

 

 

1. fast-foward merge

 

( Shell )
git branch testing

 

: 현재 branch가 가리키고 있는 commit을 가리키는 testing이라는 branch를 만든다.

 

 


 

( Shell )
git checkout testing

 

: HEAD가 testing을 가리키도록 변경한다. ( 현재 작업 중인 브랜치를 testing 브랜치로 변경 )

 

 


 

( Shell )
vim file1.txt
git commit

 

: 새로운 commit을 추가하고 HEAD가 가리키고 있는 branch (testing)가 새 commit을 가리키도록 변경한다. 바로 이전까지 testing이 가리키고 있던 commit을 새 commit이 부모로써 가리키게 된다.

 

 


 

( Shell )
git checkout master

: HEAD가 master를 가리키도록 변경한다.

 

 


 

( Shell )
git checkout -b hotfix
vim file2.txt
git add .
git commit

: 급한 문제를 해결하기 위한 hotfix branch를 만들고 전환해서, 문제를 해결하고 해당 변경 사항을 commit한다.

 

 

 


 

( Shell )
git checkout master
git merge hotfix

: 실제 서비스되는 코드에 hotfix의 내용을 반영하기 위해, master branch에 hotfix branch를 병합한다. (merge)

 

 

 

-> hotfix가 Master 이후의 Commit을 가리키고 있기 때문에, 단순히 master가 hotfix와 동일한 Commit을 가리키도록 이동하면 된다. 이러한 merge를 fast-foward merge라고 한다.

 

branch(포인터)를 앞으로 이동시키는 Merge라고 생각하면 편하다.

 


2.    3 - way merge

 

( Shell )
git branch -d hotfix

: 더 이상 필요없는 Hotfix branch를 삭제

 

 


 

( Shell )
git checkout Testing
vim sample.txt
git add .
git commit

: Testing 브랜츠로 돌아와서 작업을 진행한다. 앞서 작업한 hotfix는 Testing branch에 반영되지 않은 상태

 

 

-> 구현완료한 Testing 을 master 브랜치에 merge 하려고 싶지만 Testing 브랜치는 master의 commit을 가리키지 않기 때문에 fast-foward merge를 적용할 수 없다.

 

 

이런 경우 Git은 각각의 branch의 Commit 중 공통 조상인 commit 하나를 이용하는 3-way merge를 한다.

 

 

 

 


Merge 충돌 해결

 

브랜치간 병합을 하다보면 같은 부분을 수정한 부분이 존재하여 conflict(충돌)이 발생할 수 있다.

 

branch 1 에서 file1.txt를 수정하고 branch 2 에서도 file2.txt를 수정했다고 가정하자. 이 상황에서 Git은 어느 수정본이 사용자가 원하는 수정본인지, 어떤 것을 덮어씌울지 판단할 수가 없다. 이 부분을 개발자가 수정해주어야한다.

 

 

- 충돌 예시

 

 

 

>>>> , <<<< , ==== 등을 지우고 겹친 부분을 원하는 코드로 수정한 후 add & commit 하면 된다.

 

 


Conflict 발생 시 Merge 취소

 

일단 merge를 취소한 후 나중에 다시 merge 해야겠다고 생각한다면 

 

git merge --abort 명령을 사용하면 된다.