본문 바로가기

Git

[Git] merge 완전정복

반응형

이번 시간에는 머지(merge)를 자세히 다뤄보겠습니다. 두 브랜치를 머지하면 머지 커밋이 생성됩니다. 하지만 새로운 커밋이 생성되지 않는 머지도 있습니다. 이를 'fast-forward 머지'라고 합니다. 머지 커밋이 생성되는 머지는 '3-way 머지'라고 합니다. 하나씩 설명드리겠습니다.

[1] fast forward merge

아래 그림과 같이 브랜치가 아직 분기되지 않은 상태에서 머지를 하면 새로운 커밋이 생성되지 않습니다. 마스터 브랜치를 하이레벨 브랜치와 머지해주면 마스터 브랜치가 이동만 하고 끝입니다.

 

 

그러니깐 위 상태에서 머지를 해주면 아래처럼 됩니다.

 

 

새로운 커밋이 생성되지 않았죠? 그러면 새로운 커밋이 생성되는 머지를 살펴보겠습니다.

 

 

[2] 3-way merge

분기된 상태에서 브랜치끼리 머지하면 아래 그림과 같이 새로운 머지 커밋이 생성됩니다. 머지의 기준은 공통부모 커밋입니다. 아래 그림에서 1번 표시를 한 커밋이 공통부모 커밋입니다. 1번 커밋을 기준으로 변화가 있는 부분이머지에 반영됩니다. 2, 3번 모두 변화가 있는 경우 충돌이 발생해 working directory로 이동해서 수정 작업을 거쳐야 합니다.

 

 

정말 간단한 예를 들어보겠습니다.

 

 

case1을 보면 왼쪽 브랜치는 그대로, 오른쪽 브랜치는 변화가 있습니다. 이 두 브랜치를 병합하면 변화한 브랜치를 따라갑니다. 그런데 case2를 한번 보세요. 두 브랜치 모두 변화가 있죠? 그래서 이 경우 충돌이 일어납니다. 충돌을 해결하기 위해 working directory에 가서 직접 수정하면 됩니다.

[3] 특별 케이스 - rebase

만약 아래 그림과 같은 상황에서 '보라색 부분이 highlevel 브랜치에도 반영되었으면 좋겠어요'라는 요청이 오면 어떻게 해야할까요?

 

 

물론 머지를 해주면 되긴 하겠지만 좀 더 간단한 방법이 있습니다. 바로 rebase 명령어를 통해 가능한데요, rebase는 베이스를 다시 설정한다는 뜻이죠? 위 그림에서 highlevel 브랜치의 베이스는 세 번째 커밋입니다. 이때 highlevel 브랜치에서 마스터 브랜치를 rebase하면 베이스가 다섯 번째 커밋으로 바뀝니다. 머지와 비교해봤을때 새로운 커밋이 생성되지 않는다는 차이가 있죠. rebase를 했을 때의 모습을 보겠습니다.

 

 

이렇게 하면 새로운 커밋이 생성되지 않으니깐 불필요한 커밋을 없앨 수 있겠죠? merge를 할지 rebase를 할지는 상황에 따라 다릅니다. 두 브랜치를 합쳤다는 정보가 커밋 히스토리에 꼭 남아야 하는 경우에는 머지를 해야겠죠? 그런데 커밋 히스토리를 깔끔하게 유지하는게 더 중요하다면 rebase를 하면 됩니다.

 

반응형

'Git' 카테고리의 다른 글

[Git] 누가 기록했는지 확인하기  (0) 2022.01.14
[Git] git pull시 주의점  (0) 2022.01.14
[Git] Reset vs Checkout  (1) 2022.01.14
[Git] HEAD와 branch의 관계  (0) 2022.01.14
[Git] Remote repository의 브랜치  (0) 2022.01.14