본문 바로가기

Project Management/Git & Github

[Chapter 3] repository 협업(6) - 브랜치 병합하기 : 충돌(conflict)

github logo image

 

 

 

지금까지 [feature/detail-page] 브랜치를 [master] 브랜치에 병합을 시도했고, 빨리감기(fast-forward) 병합이 실행된 상태입니다. 이제 마지막으로 [feature/popup] 브랜치에서 작업한 결과물을 병합하면 됩니다. 그런데, 이번에는 이전의 사례처럼 빨리 감기 병합이 아닌 일반 병합이 이뤄지기 때문에, 주의를 기울여야 합니다. 

 

특히, 이번 병합에서는 '충돌'이 예정되어 있기 때문에(?) 이에 대한 처리도 함께 진행할 예정입니다. 차근차근 실습을 진행해 보겠습니다. 

 

 


 

 

일단 이번 병합 과정에 있어서 앞서 진행한 빨리감기 병합과 가장 큰 차이점은, [master] 브랜치에 바로 병합을 진행하지 않는다는 점입니다. 오히려, 먼저 [master] 브랜치의 커밋을 [feature/popup] 브랜치에 먼저 병합을 시도할 것입니다. 그리고 그렇게 생성된 신규 커밋을 다시 [master]에 병합을 진행하도록 하겠습니다. 

 

이렇게 진행하는 이유는 뭘까요? [master] 브랜치에 바로 피처 브랜치를 병합하다가 문제가 생길 가능성이 있기 때문입니다. 일단, 피처 브랜치는 (상황에 따라 다르겠지만) 개인만이 다루는 브랜치가 되기 때문에 일단 마스터 브랜치를 피처 브랜치에 병합하여 문제가 없는지 확인하고, 문제가 없이 병합 커밋이 완성되면 - 그 병합 커밋을 마스터로 병합하는 과정을 거치는 것입니다. 

 

테스트 병합 이후에 [master]로 병합하는 과정 도식화

 

 

위의 도식화된 과정이 이해가 가시나요? 피처 브랜치로 마스터 브랜치를 병합한 후, 다시 마스터 브랜치가 해당 병합 커밋을 바라보도록 진행한 과정을 나타냈습니다. 이제 소스트리에서 실제로 한번 진행해 보겠습니다.

 

 


 

 

 

1. 우선 [feature/popup] 브랜치로 체크아웃을 진행합니다. [master] 브랜치를 피처 브랜치로 병합시키기 위한 준비죠.

 

피처 브랜치로 체크아웃합니다

 

 

 

2. 피처 브랜치로 병합하려는 마스터 브랜치의 커밋을 선택하고 '병합'을 진행합니다. [확인]을 클릭합니다.

 

 

 

 

3. 그런데 병합을 시도하니, '충돌 병합' 팝업이 출력됩니다. 스테이지 상태를 보니, detail-page.md는 스테이지에 올라갔지만 'feature-list.md' 파일이 충돌이 발생했습니다. 이 파일은 스테이지에 올라가지 못했습니다. 

 

 

충돌이 발생했습니다

 

 

 

4. 이제 새로운 커밋이 하나 생겼는데, '커밋하지 않은 변경사항'으로 출력됩니다. 스테이지에 올라가지 못한 'feature-list.md' 파일을 확인해 봐야겠습니다.

 

 

 

우측 하단에 핑크색/초록색 컬러링이 적용된 텍스트 라인들이 보이실 것입니다. 우선 4번 라인에서 충돌(conflict)이 발생한 것을 붉게 표시하고 있습니다. 그리고 하단의 <<<<<< HEAD....로 시작되는 라인은 현재 각 브랜치에서 충돌하고 있는 내용을 표시해주고 있습니다. 

 

참고로 해당 내용은, VS code로 해당 파일을 실행해도 동일하게 표시됩니다.

 

충돌 내용이 md 문서에도 동일하게 표시되고 있습니다

 

 

일단 우리는 피처 브랜치를 베이스로 두고, 마스터 브랜치를 병합하는 상태였습니다. 결국 피처 브랜치에는 4번 라인에 '_팝업 출력'이라는 내용이 있고 마스터 브랜치의 4번 라인에는 '_상세 페이지 관리'라는 텍스트가 들어있다는 것을 확인할 수 있습니다. 위의 현황에서 Current Change와 Incoming Change의 현황을 통해 이를 확인할 수 있습니다. 

 

자, 이제 VS code에서 불필요한 라인을 삭제하고, 같은 라인에 있던 각각의 텍스트를 정리해서 충돌이 나지 않도록 수정해 보겠습니다. 물론 VS code의 자체 기능인 [Accept Current Change....] 버튼을 사용해도 되지만 일단 수동으로 수정해 보겠습니다. 

 

 

 

5. 위의 파일 내용에서 불필요한 텍스트는 삭제하고, 라인이 충돌하지 않도록 각각의 내용을 정리했습니다. 그리고 저장을 진행합니다. 

 

 

 

 

6. 충돌 사항을 수정한 다음, 소스트리의 스테이지에서 feature-list.md를 다시 스테이지로 올립니다. 그러면 정상적으로 add가 진행되고, 커밋이 진행이 가능합니다. 스테이지에 파일이 모두 올라갔고, 피처리스트는 수정되고 팝업 피처 브랜치에 상세 페이지 파일도 새로 추가되는 것을 확인할 수 있습니다. 

 

 

 

 

 

7. 커밋 상태로 들어가 보겠습니다. 커밋 텍스트에 자동으로 마스터 브랜치를 피처 브랜치로 병합한다는 내용이 기재되어 있습니다. 피처리스트 파일에 충돌이 있었다는 내용도 남아있네요. 일단 수정하지 않고 커밋을 진행합시다.

 

 

 

 

8. 커밋을 완료하고 히스토리를 살펴보겠습니다. 팝업 피처 브랜치를 기준으로, 로컬에서 세 개의 커밋이 이루어져 있고 원격 저장소에는 반영되지 않은 상태가 되었습니다(머지, 팝업기능추가, 상세페이지 관리 추가). 이제 피처 브랜치로 push를 진행합니다.

 

 

팝업 피처 브랜치로 푸시를 진행합니다

 

 

 

 

9. 마스터 브랜치의 변경사항까지 성공적으로 팝업 피처 브랜치로 병합된 것을 확인할 수 있습니다. 그런데, 지금 마스터 브랜치를 어떤 상황이죠? '상세 페이지 관리 추가' 상태에 머물러 있습니다. 우리는 병합 테스트까지 완료했으니 이제는 팝업 피처 브랜치의 최신 커밋 상태를 마스터 브랜치로 병합하도록 하겠습니다. 

 

일단 마스터 브랜치로 체크아웃을 진행하겠습니다.

 

팝업 브랜치로 병합완료를 확인하고

 

마스터 브랜치로 다시 체크아웃 합니다

 

 

 

10. 팝업 피처 브랜치의 최신 커밋을 우클릭하여 '병합'을 실행합니다. 이제는 마스터 브랜치도 최신 상태로 바꾸어주는 것이죠. 확인을 진행합니다.

 

 

 

 

11. 마스터 브랜치의 상태가 변경되었습니다. 일단 로컬에서만 반영되었고, 원격 저장소에 push를 해주는 상황입니다. 이젠 익숙하죠? 마스터 브랜치로 push를 진행하겠습니다. 

 

로컬 저장소에서 마스터 브랜치가 최신 버전으로 병합 진행되었습니다

 

마스터 브랜치로 푸시까지 진행을 완료합니다

 

 

 

12. 자, 팝업 브랜치와 상세페이지 브랜치까지 모두 마스터에 반영되었습니다. 커밋 내용 상으로는 빨리감기가 진행되어, 마지막 커밋은 마스터 브랜치를 팝업 브랜치로 병합했다는 기록만 남아있는 것을 주의하세요.