본문 바로가기
Git

[Git] Git branch 병합 전략

by D.B_18 2021. 12. 20.

두 개의 브랜치가 존재하는 상황에서, 하나의 브랜치로 합치는 경우 Git에서는 일반적으로 두 가지 방법을 사용할 수 있습니다.

오늘은 그 방법에 대해서 알아보려고 합니다!

 

Merge

merge 브랜치에서 사용하는 전략은 각 브랜치의 마지막 커밋 두 개와, 공통 조상의 총 3개의 커밋을 이용하는 3-way mere를 수행하여 새로운 커밋을 만들어내는 것입니다. 다음 그림에서 보이는 feature와 master의 마지막 커밋은 각각 f2와 m2, 그리고 공통 조상 커밋 b 입니다.

3-way-merge

비교를 위해 필요한 3개의 커밋을 정리하면 다음 세 가지 커밋입니다.

1. 내 브랜치 커밋

2. 다른 사람의 브랜치 커밋

3. 두 브랜치의 공통 조장이 되는 커밋

우선, 공통 조상이 되는 base에 커밋되어 변경된 부분이 a, b, c, d라고 가정하고 다음 표에 기록하였습니다.

my base Other
  a  
  b  
  c  
  d  

내 브랜치와 다른 사람의 브랜치에서 변경된 내역이 아래의 표와 같다고 가정해보겠습니다.

my base Other
a a a'
b b b
c' c c''
d' d d

만약, 여기서 base가 되는 공통 조상 커밋이 없다면, 양쪽에서 동이랗게 보이는 b를 제외하고는 원래 커밋이 어떤 상태였는지 확인하기 어렵습니다. 또한 충돌이 났는지에 대한 부분도 알기 어렵습니다. 따라서 base가 되는 커밋을 함께 비교하여 3-way-merge를 수행하면 merge 커밋의 상태를 보다 명확하게 결정할 수 있게 되는 것입니다.

merge
a'
b
confict
d'

Rebase

브랜치의 공통 조상이 되는 base를 다른 브랜치의 커밋 지점으로 바꾸는 것입니다.

rebase를 수행하면, master 브랜치의 마지막 커밋인 m2 이후에 feature 브랜치의 변경 사항인 f1과 f2가 일어난 것처럼 보이게 할 수 있습니다.

즉, feature의 base를 b가 아니라 m2로 재설정하는 것입니다.

Rebase의 기본 전략

rebase 하려는 브랜치 커밋들의 변경사항을 patch라는 것으로 만든 다음에 어딘가에 저장해둡니다. 그리고 이를 master 브랜치에 하나씩 적용하여 새로운 커밋을 만드는 것입니다.

 

1. feature 브랜치로 checkout

2. master 브랜치로 rebase

3. feature 브랜치를 master로 fast-foward merge

 

언뜻 보면 비슷해 보이는 rebase와 merge의 차이가 정확히 무엇인지 정리해보도록 하겠습니다.

 

Merge vs Rebase

- merge로 브랜치를 병합하게 되면, 커밋 내용에 merge commit이 추가로 남게 됩니다. 따라서 merge를 사용하면 브랜치가 생기고 병합되는 모든 작업 내용을 그대로 기록하게 됩니다.

- rebase같은 경우는 브랜치를 병합할 때 이런 merge commit을 남기지 않으므로, 다른 브랜치는 없었던 것처럼 프로젝트의 작업 내용이 하나의 흐름으로 유지됩니다.

 

작업한 내용의 사실을 기록하고 싶을 때는 merge를 사용하고, 프로젝트의 진행 상황을 남기고 다른 사람에게 정리된 히스토리를 보여주고 싶을 때는 rebase를 사용할 수 있습니다.

728x90
반응형

'Git' 카테고리의 다른 글

[Git] Git branch 관련 명령어 정리  (0) 2021.12.23
[Git] git 명령어 취소  (0) 2021.12.13
[Git] Gitlab에서 Github로 미러링 설정  (0) 2021.12.13