이동식 저장소

[Github] Merge (병합) 본문

Secondary/Github

[Github] Merge (병합)

해스끼 2020. 5. 24. 20:45

이전 글에서 브랜치에 대해 살펴봤습니다. 브랜치란 프로젝트의 버전을 나누어 서로 독립적으로 개발할 수 있도록 하는 개념입니다. 그런데 아무리 코드를 나눠서 작성했다고 한들, 결국 하나로 코드를 모아야 완전한 결과물을 만들 수 있습니다. Merge(병합)을 이용하여 코드를 합쳐 봅시다.

병합이란?

병합은 두 버전의 합집합을 구하는 것과 같습니다. 예를 들어 제가 브랜치 b1에서 수정한 코드 A.java와 다른 조원께서 브랜치 b2에서 수정한 코드 B.java를 master 브랜치로 모으는 것이죠. 이런 경우에는 전혀 어렵지 않게 병합할 수 있습니다. A.java와 B.java를 master로 당겨 오기만 하면 됩니다.

 

위의 예시에서 b1과 b2가 합쳐진 결과는 master에 반영됩니다. 병합한 결과를 제3의 브랜치에 적용할 수도 있지만, 자기 자신으로 끌고 올 수도 있습니다. 즉 제가 수정한 코드를 다른 조원의 브랜치 b2로 병합할 수도 있다는 말입니다. 이렇게 하면 b2에 b1의 변경 사항이 반영됩니다.

 

Github desktop에서 병합해 봅시다. 여기서는 제가 이전 글에서 만든 브랜치 branch-mwy에서 master로 병합해 보겠습니다.

branch-mwy에 커밋 0524가 있습니다. 이 커밋을 master로 병합할 겁니다.

 

우선 master 브랜치로 체크아웃(브랜치를 옮겨가는 것)해야 합니다. "Current branch"를 눌러 master를 선택합니다.

 

이때 커밋하지 않은 변경사항이 있다면, 변경 사항을 이전 브랜치에 놔둘 것인지, 아니면 옮길 브랜치로 가져올 것인지 묻는 대화창이 나타납니다. 저는 변경사항을 놔 두고 이동하도록 하겠습니다.

Leave my changes

 

이제 커밋을 병합합시다. 왼쪽의 "Select branch to compare..." 대화상자를 눌러 branch-mwy를 선택하면, master의 최신 커밋을 기준으로 뒤처진/앞선 커밋을 보여줍니다. master보다 branch-mwy의 코드가 더 최신이므로 branch-mwy 입장에서는 master가 자신의 뒤에 있는 셈입니다. 그렇기 때문에 오늘 오전에 제가 한 커밋은 Behind 탭에 존재합니다.

0524 커밋이 보입니다. 이제 아래쪽의 Merge into master를 눌러 병합하면 됩니다. 그런데 경고 표시가 보이네요. 경고 메시지를 읽어 보면, master와 branch-mwy 사이에 충돌이 발생했다고 합니다. 뭔가 되게 무섭고 좀 그래 보이지만 괜찮습니다. 우리는 할 수 있습니다.

 

일단 두려움을 뒤로 하고 Merge 버튼을 눌러 봅시다. 그러면 예상대로 충돌이 생겼다는 메시지가 나옵니다.

뭔가 많다

충돌을 해결해야 merge를 계속 진행할 수 있습니다. 일단 맨 위의 .xml 파일을 VSCode로 열어보도록 하겠습니다. 무슨 일이 일어났는지는 알아야 하지 않겠습니까?

 

파일을 열어보면 이런 창이 보입니다. 36라인의 ======를 기준으로 위 부분은 master의 내용이, 아래에는 branch-mwy의 내용이 보입니다. 아하, 두 개의 변경사항이 같은 위치에서 충돌했네요. 뭐 양자컴퓨터도 아니고 두 코드가 동시에 존재할 수는 없으니, 우리는 이 두 코드 중 하나를 선택해야 합니다. 상황에 맞게 적절히 내용을 선택하면 됩니다. 쓸데없는 이런 내용은 지워도 됩니다.

<<<<<< HEAD
===========
>>>>>> branch-mwy
등등..

 

변경 사항을 모두 선택하고 VSCode를 닫으면, 희망찬 메시지가 저와 여러분을 반겨 줄 겁니다.

충돌이 해결되었습니다! 이제 남은 파일에 대해서도 충돌을 모두 해결해 봅시다.

 

충돌을 모두 해결했습니다. 저 영롱한 파란 버튼이 보이십니까? 이제 master 브랜치에 저의 코드를 반영할 수 있습니다. 

 

버튼을 누르면 merge가 완료됩니다. 이제 Github 원격 저장소에 이 영광스러운 사실을 업로드하면 끝입니다.

Push!

버튼을 누르고 잠시 기다리면, history 탭에서 merge 커밋을 확인할 수 있습니다. 축하합니다! 모든 변경사항이 master에 반영되었습니다.

 

IntelliJ의 Git 탭에서 가지가 합쳐진 모습을 볼 수 있습니다. 이제 스스로에게 자부심을 가져도 좋습니다. 


이제 우리는 충돌을 해결하여 브랜치를 합칠 수 있습니다. 잠시 이런 상황을 생각해 봅시다. 저는 제 브랜치에 제 마음대로 커밋할 수 있으며, 사실 그렇게 하기 위해 브랜치를 만들었습니다. 그런데 제 커밋을 마음대로 남의 브랜치에 병합하는 것은 별로 좋은 생각이 아닙니다. 다른 조원의 입장에서는 자고 일어났더니 코드가 바뀌어 있는 겁니다. 당황스럽겠죠.

 

그래서 우리는 조금 더 정중한 병합을 해야 합니다. 즉, 내가 작성한 코드를 합병하기 전에 미리 다른 브랜치에 허락을 받으면 조금 더 깔끔하게 병합할 수 있겠죠? 이런 것을 Pull request라고 합니다. 다음 글에서는 pull request, 줄여서 PR에 대해 알아보도록 하겠습니다.

'Secondary > Github' 카테고리의 다른 글

[Github] Pull request  (1) 2020.05.29
[Github] 브랜치 만들기  (0) 2020.05.23
Comments