Git

병합

bde574786 2025. 3. 17. 16:08

Fast-Forward 병합

순차적 커밋에 맞추어 병합을 처리하는 방법을 Fast-Forward 병합이라고 한다. 해당 방식은 일반적으로 혼자 개발할 때 사용한다.

브랜치를 병합하려면 기준이 되는 브랜치로 이동해야 한다. 현재 feature 브랜치로 분기하여 작업했으므로 main 브랜치로 체크아웃한다.

 

커밋 작업은 분기된 feature 브랜치에서 모두 수행하였으므로 두 브랜치를 병합하면 된다.

 

Fast-Forward 병합은 작업한 브랜치를 원본 브랜치에 병합할 때 작업한 브랜치의 시작 커밋을 원본 브랜치 이후의 커밋으로 가리킨다. 단순히 커밋 위치를 최신으로 옮기는 것과 비슷하다. 결과적으로 main 브랜치의 마지막 커밋 위치와 feature 브랜치의 마지막 커밋 위치가 같아졌고 동일한 HEAD 포인터를 가지게 되었다.

 

3-way 병합

3-way 병합은 좀 더 복잡한 병합을 처리할 수 있는 방법이다. 여러 개발자와 협업으로 작업하는 경우 대부분 3-way 병합을 사용한다.

현재 main에서 생성된 hotfix 브랜치에는 현재 새로운 커밋 2개가 추가되어 있다.

 

main 브랜치에서 아래와 같이 추가 커밋이 발생하게 되면 hotfix 브랜치와 main 브랜치는 갈라지게 되고 기준 커밋에서 서로 다른 브랜치의 커밋이 연결될 것이다.

 

위처럼 브랜치 모양이 갈라지는 형태로 나뉠 때는 Fast-Forward 방식의 알고리즘을 적용하여 병합할 수 없다. 해당 경우는 3-way 방식을 이용하여 병합한다.

두 브랜치를 병합하기 위해서 먼저 분할 기준인 조상 커밋을 찾고 이 조상 커밋을 포함하는 브랜치와 새로운 두 브랜치, 이렇게 3개를 하나로 병합해야 한다. 브랜치가 3개 있으므로 3-way 병합이라고 한다. 깃은 3-way 병합을 할 때 공통된 조상 커밋을 자동으로 찾아주며 이 커밋을 기준으로 브랜치를 병합하게 된다. 그리고 병합을 완료한 후에는 새로운 병합 커밋을 추가로 하나 생성한다. 병합 커밋은 부모 커밋이 2개라는 특징이 있다.

3-way 병합은 Fast-Foward 병합과 달리 병합 메세지가 필요하다. e 옵션으로 에디터를 열 수 있지만 옵션을 지정하지 않으면 자동 병합 메세지를 사용한다.

$ git merge 브랜치이름 -e

 

병합이 완료되면 다음과 같이 병합 결과 메세지가 출력되고 작성된 메세지로 커밋된다.

 

브랜치 병합 여부 확인

다수의 브랜치가 있을 때 어느 브랜치가 병합을 완료한 것인지 알기 어렵다. 깃은 병합이 완료된 브랜치 목록을 보여주는 merged 옵션을 제공한다.

$ git branch --merged

 

반대로 병합하지 않은 브랜치를 확인하려면 no merged 옵션을 사용한다.

$ git branch --no-merged

 

병합 후 삭제

병합된 브랜치의 커밋은 모두 원본 브랜치에 적용되므로 중복되는 커밋을 가지는 별도의 브랜치를 유지할 필요는 없다. hotfix의 모든 커밋이 main으로 병합되었으므로 hotfix 브랜치는 불필요하다.

d 옵션은 병합을 완료한 브랜치만 삭제할 수 있으며 병합이 완료되지 않은 브랜치를 삭제하고 싶다면 D 옵션을 사용한다.

$ git branch -d hotfix
$ git branch -D hotfix