지난 포스트에서 다룬 Fast-Forward 병합은 순차적으로 분기되어 작업된 브랜치를 병합하는데 사용한 병합 방식이었습니다. 작업이 순차적으로 진행되기 때문에 병합과정에서 따로 신경써야할 부분은 없었습니다.
오늘 다루는 3-way 병합
은 좀 더 복잡한 상황에서의 병합 방식입니다. 다른 개발자와 작업을 진행하게 되는 경우 내가 분기한 브랜치, 다른 개발자가 분기한 브랜치에서 작업이 이루어지게 됩니다.이때 브랜치 상황은 내가 작업하는 브랜치의 커밋
, 다른 개발자가 작업하는 브랜치의 커밋
, 두 브랜치의 공통 분기점이 되는 공통 커밋
세 가지의 커밋이 남게 됩니다. 그래서 이런 경우의 병합을 세 브랜치들을 종합해서 병합하기 때문에 3-way 커밋
이라고 부릅니다.
지난 포스트에 이어서 위와 같은 파일 구조를 가진 디렉토리에서 실습을 진행합니다. 새로 만들어서 진행해도 상관없습니다.
그러면 3-way 병합
을 실습을 통해 알아보도록 하겠습니다.
먼저, Me
라는 이름의 브랜치를 생성합니다.
git branch Me
그 다음 Me
브랜치로 이동한 뒤 t1.txt
파일을 수정하고, 커밋까지 완료해주세요.이후 t2.txt
파일도 수정하고 커밋해주세요. 그러면 현재 작업상황은 다음과 같습니다.
이번엔 master
브랜치로 돌아와서 작업을 합니다. t1.txt
를 수정하고 커밋해주세요. 이때 Me
브랜치에서 3번째 줄을 수정했었는데, 마스터에서 3번째 줄을 건드리게 되면 병합 충돌이 발생합니다. 병합 충돌에 대해서는 따로 다룰 예정이니, 3번째 줄이 아닌 다른 부분을 수정해주세요. 그 다음 t3.txt
도 아무렇게나 수정하고 커밋해줍니다. 현재 진행상황을 그림으로 나타내면 다음과 같습니다.
그러면 이제 브랜치들을 병합해볼 차례입니다. 기준이 되는 공통 부모 커밋, Me 브랜치의 최신 커밋, master 브랜치의 최신 커밋을 가지고 병합을 진행합니다.
3-way 병합
은 병합이 완료될 때 커밋을 하나 생성합니다. 기존 마스터 브랜치에 갖다붙여서 브랜치의 최신 커밋이 마스터의 최신 커밋이 되었던 Fast-Forward 병합
과는 다른점 입니다. 이때 Merge branch '브랜치명'
이라는 커밋 메세지가 자동으로 붙는데, 이 메세지를 바꾸고 싶다면 merge
명령 뒤에 --edit
옵션을 붙여줍니다.
git merge 브랜치이름 --edit
다음과 같은 화면에서 노란 부분의 메세지를 수정해주면 됩니다.
이렇게 3-way 병합
을 해봤는데요. 이 과정을 bash에서 graph로 확인해보면 다음과 같이 나타납니다.
병합을 실습하면서 병합이 완료된 브랜치는 삭제해주는 것이 좋다고 했었습니다. 그런데 실습 상황처럼 브랜치가 한 두개 있지 않다면 어떤 브랜치가 병합이 완료되었고 어떤 브랜치가 작업중인지 알기 어렵습니다. 그래서 깃을 병합된 브랜치를 확인할 수 있는 명령을 제공하고 있습니다.
git branch --merged
git branch --no-merged
git branch --merged
는 병합된 브랜치를 보여줍니다. 브랜치가 병합 되었다면, 브랜치 목록에서 브랜치 이름 앞에 별표*
가 붙습니다. --no-merged
는 그 반대 상황입니다.