본문 바로가기

Project Management/Git & Github

[Chapter 3] repository 협업(4) - 브랜치 병합하기 개념

github logo image

 

 

 

이번 아티클에서는 지난 번 예제에서 [master], [feature/detail-page], [feature/popup] 브랜치로 각각 작업한 결과물을 합쳐서 관리하는 방식을 살펴보겠습니다. 우선 병합(merge) 방식과 원리해 대해서 먼저 살펴보겠습니다. 

 

병합에는 다음과 같이 세 가지 케이스가 존재합니다.

 

 

 

1. 병합 커밋(Merge Commit)

 

병합 커밋의 예시

 

병합 커밋은 위와 같은 경우를 뜻합니다. [모자를 쓴 남자], 그리고 [안경을 쓴 남자]가 각각 있습니다. 이 두 그림을 겹쳐서 합친다고 생각해보면 어떻게 될까요? '모자와 안경을 쓴' 남자가 새롭게 생겨납니다. 이렇게 새로 탄생한 '모자와 안경을 쓴 남자'라는 새로운 병합 커밋이 생성됩니다. 

 

 

 

 

 

2. 빨리 감기(Fast-Forward)

 

빨리 감기의 예시

 

 

'빨리 감기'라니, 뜬금 없는 단어같이 느껴집니다. 하지만 위의 케이스를 보시면 조금은 이해가 되실 겁니다. 첫 번째 그림과 두 번째 그림에는 어떤 차이가 있나요? 첫 번째 그림에는 얼굴 표정이 없고, 두 번째 그림에는 얼굴 표정만 추가되었습니다. 그럼 이 두개의 그림을 역시 겹쳐서 합친다면 [새로운 결과물]이 나오나요? 

 

아니죠. 두 개를 합친다고 해서 새로운 것이 탄생하지는 않고, 그냥 두 번째 그림과 똑같은 상태가 됩니다. 새로운 상태를 만들 필요 없이 그냥 '두 번째 그림'으로 바꿔주는 경우입니다. 이를 빨리 감기 병합(Fast-Forward Merge)로 표현합니다. 

 

 

 

 

 

3. 충돌(Conflict)

 

 

어떤 모자를 써야하지? 충돌 예시

 

 

위의 경우에는 첫 번째 그림에서 들고 있는 스마트폰을 합쳐주게 됩니다. 그런데, 모자에서 문제가 생깁니다. 두 그림 모두 모자를 쓰고 있기 때문에 모자 영역에서 충돌이 발생하는 것이죠. 이 경우에 git에서는 '어떤 모자를 골라야할지'를 선택할 수 없습니다. 그래서 '충돌'이 발생하게 되고, 이를 수동으로 선택해줘야 합니다. 이 충돌 관리는 추후 다시 살펴보겠습니다. 

 

 


 

 

 

그럼 우리가 앞서 만들었던 브랜치 예시를 병합(merge)하는 과정에 대해서 살펴보겠습니다. 본격적으로 소스트리에서 실행해 보기 전에 앞으로 우리가 할 병합 작업의 과정을 먼저 그림으로 먼저 살펴보고, 소스트리에서 실제로 실행해 보도록 하겠습니다. 

 

현재 상태

 

 

위의 그림이 현재까지의 진행 상태입니다. [master] 브랜치는 '커밋5'를 가리키고 있는 상태이고, [feature/detail-page] 브랜치는 '커밋5'를 기준으로 작업을 별도로 진행해 '커밋7'까지 작업했습니다. 한편 [feature/popup] 브랜치는 역시 '커밋5'를 기준으로 수정 작업을 진행해 '커밋8'을 생성해 둔 상태입니다. 

 

 

 

 

 

 

우선, 이 상태에서 [master] 브랜치에 [feature/detail-page] 브랜치를 합쳐보도록 하겠습니다. 이럴 경우에는, 위에서 설명한 병합 케이스 중 '빨리 감기(fast-forward)' 병합에 해당하겠죠? 그러면 다음 그림과 같이 별다른 변동 없이, [master] 브랜치가 가리키는 커밋이 달라지기만 합니다. 그리고 이제 [feature/detail-page]의 작업 사항은 모두 [master] 브랜치에 반영했으니, 이 브랜치는 삭제해 줍니다.

 

빨리 감기 병합 후, [feature/detail-page] 브랜치를 삭제한다

 

 

 

 

 

 

 

 

자, 이제 [master] 브랜치의 '커밋7' 상태와 [feature/popup] 브랜치의 '커밋8' 상태 두 개의 커밋을 병합하려고 합니다. 이것은 1번의 '병합 커밋' 상태가 되는 것을 의미하죠. 즉, 두 개의 커밋이 합쳐진 "새로운 커밋"이 등장한다는 것입니다. 

 

중요한 것은, '어느 브랜치에 합칠 것인가?' 입니다. 우리는 앞서 전제조건으로 피처 브랜치에서 작업된 것을 [master] 브랜치에 병합한다고 정했습니다. 그럼 이 "새로운 병합 커밋"은 [master] 브랜치에 생겨나게 됩니다. 그럼 [feature/popup] 브랜치에서는 어떤일이 벌어지나요? 아무일도 일어나지 않습니다. 위 그림 기준으로 '커밋8'을 가리키는 상태가 그대로 유지되고, [master] 브랜치에만 병합된 결과물 커밋이 하나 생기게 됩니다. (만일 반대로 병합하면 [master] 브랜치는 그대로 유지되고, 피처 브랜치에 새로운 커밋 결과물이 생겨나게 되겠죠)

 

이 병합 상태를 그림으로 표현하면 다음과 같습니다.

 

[master] 브랜치에 병합했습니다. 새로운 커밋이 생성됩니다.

 

 


 

여기까지가 소스트리를 통해 실습해볼 내용입니다. 물론 중간에 디테일한 내용은 달라질 수 있고 충돌이 발생될 예정(?)이라 몇 가지 절차가 더해지겠지만, 궁극적으로는 이러한 작업을 진행해 볼 것입니다.