병합(merge) 살펴보기

병합이란?

하나의 브랜치를 현재 브랜치와 합치는 것을 병합(merge)라고 합니다. 현재 브랜치는 헤드(HEAD) 브랜치라고 한다고 했죠? 예를 들어 헤드 브랜치가 master 이고 여기서 version2 브랜치를 병합하면 version2의 내용이 master에 반영되게 됩니다. 병합시 자주 발생하는 상황에 대해 알아보도록 합시다.

상황1: 헤드 브랜치에 변경 사항이 없을 경우

가장 쉬운 상황

가장 행복한 상황입니다. 이 상황은
  1. 합치려는 브랜치가 헤드 브랜치로부터 시작되었다.
  2. 그 사이 헤드 브랜치에는 전혀 갱신이 없었다.
주로 혼자 작업을 할 때 발생하는 상황입니다. 위 그림은 헤드 브랜치(*이 붙어 있는)인 master에서 version2가 시작되고 두 번 커밋한 상태입니다. 여기서 병합을 하면 단순하게 master 브랜치가 가르키는 커밋이 version2의 커밋으로 이동합니다. 더 이상 자세한 설명은... 필요없을 것 같습니다. 이런 상황을 fast-forward 라고 합니다. 단순히 브랜치의 참조만 갱신되는 상황이죠. 해피!

상황2: 가지가 생겨난 경우

두 번째 경우는 상황이 조금 복잡해 졌습니다. 원인은 몇 가지가 있습니다.
  1. 과거의 커밋으로부터 브랜치를 생성해서 작업을 한 경우
  2. 새로운 브랜치 작업 이후에 헤드에 다른 새 커밋이 있는 경우
  3. 여러 브랜치를 동시에 작업하면서 병합을 시도할 경우
세 경우 모두 종종 발생하는 상황입니다. 이 경우에도 기본이 되는 헤드 브랜치에서 타겟 브랜치를 병합하면 되긴 하는데, 이 때 여러 브랜치에서 동시에 변경한 파일이 있을 경우 충돌이 발생할 수 있습니다. 충돌이 생기면 에러 메시지 같은게 나오기 때문에 초보는 큰 충격에 빠지는 데 당연한 일이므로 걱정할 필요가 없습니다. 혼자 작업하는 경우에는 충돌 해결도 쉬운 편입니다.
  1. 보통 가장 최신 내용 하나만 선택하면 되는 경우가 많습니다.
  2. 그리고 최신 내용은 보통 타겟 브랜치에 있는 경우가 많습니다.
  3. 여러 파일에 변경 사항이 혼재해 있는 경우도 내가 개발했으므로 크게 어렵지 않습니다.
소스트리와 에디터를 사용하면 어렵지 않게 충돌 해결이 가능하므로 겁먹지 마세요! 충돌 해결에 대해서는 뒤 다루도록 하겠습니다. 운 좋게 충돌이 생기지 않았거나, 잘 해결했다면 아래와 같은 모양이 됩니다.

참고 사이트

https://learngitbranching.js.org/