Hg Init: a Mercurial tutorial – Merging

병합할 때는 때때로 충돌이 생긴다. 충돌은 보통 쉽게 고칠 수 있지만 직접 해결해야 하거나 아무도 바라지 않는 헤드가 여럿 생길 수도 있다.


Merging

버전 제어에서 중요한 것은 같은 소스를 기반으로 여럿이 작업하는 걸 통합하는 것이다.

로즈와 내가 모두 과카몰리 요리법을 고치려 한다고 생각해 보자. 로즈는 아보카도(avocado) 품질을 높이려 한다. 시작하기 전 중앙 저장소에서 최신 변경 내용을 가져와 가장 최근 내용으로 바꾼다.

다음처럼 고치고

변경 내용을 커밋한 후 중앙 저장소에 넣는다.

동시에 나는 같은 파일에서 다른 부분을 고친다.

커밋할 수는 있지만 중앙 저장소에 넣을 수는 없다.

이는 그리 도움되는 에러 메시지는 아니다. 차라리 다음처럼 보여주는 게 더 낫다.

이게 바로 정말로 내가 해야 할 일이다.

방금 가져 온 게 무슨 내용인지 궁금한가? hg log -P . 명령으로 간단히 확인할 수 있다.

정말로 로즈가 변경한 내용이다. 현재 내 저장소는 어떨까?

헤드가 여럿 생겼다. 내 저장소는 다음과 같다.

두 헤드가 보이나? 이는 로즈와 내가 모두 체인지셋 7에서 변경해서 그렇다. 그러므로 병합할 필요가 있다. (에드: 절대 수동적으로 말하지 말아요!) 병합해야 한다.

병합 명령인 hg merge는 두 헤드를 하나로 합치고 그 결과를 내 작업 디렉터리에 남긴다. 커밋하기 전에 병합이 잘 됐는지 확인한다[1].

아보카도는 품종이 해스(hass)이고 할라페뇨(Jalapeno)[2]는 칠레산으로 병합이 잘 됐다. 계속 진행해 커밋하고 서버에 넣는다.

난 두 가지 변경 내용을 넣었다. 하나는 원래 내가 고친 할라페뇨 부분이고 또 하나는 병합하며 만든 변경 내용이다.

로즈와 내가 요리법에서 다른 부분을 작업했기 때문에 두 변경 내용이 충돌하지 않는다는 점에 주목한다. 그러므로 병합은 정말 정말 쉽다. 대부분의 조직에서 각 프로그래머는 코드에서 각각 다른 부분을 맡아 작업하므로 이 경우가 가장 일반적이다.

때로는 해야 할 일을 아무도 기꺼이 나서서 하지 않는 역기능적인 조직에 있을 수도 있다. 이로 인해 프로그래머 사이에 설명할 수 없는 슬픈 감정이 종종 불시에 생긴다. 이는 알아내기 어렵지만 증상은 다음과 같다. 프로그래머가 화장실, 서버 보관함에 틀어박혀 있거나 칸막이로 둘러친 자리 안에서 높은 톤으로 소리 죽여 울거나, 군용 돌격 소총의 반복된 발사 소리에 갑자기 고막이 손상된 것처럼 보일 때이다.

하지만 잘 관리되고 건강한 조직에서조차 병합 충돌은 때때로 생기며 머큐리얼에서는 사람이 해결해야 한다. 어떻게 되는지 살펴보자.

먼저 로즈는 내가 변경한 할라페뇨 부분을 가져간다.

이제 두 사람 모두 재료를 바꿔 정말로 충돌이 생길 때 어떻게 되는지 살펴보자.

나는 바나나를 추가하고

변경 내용을 먼저 체크 인했다.

로즈는 정확히 같은 줄에 망고를 추가했다.

정말 ‘싱싱하게 잘 익은’ 망고다.

이번에는 내가 먼저 변경 내용을 넣었으므로 로즈가 병합해야 한다. 하하!

그러면 갑자기 병합 충돌이 발생하고 그래픽 화면의 병합 충돌 해결 툴이 뜬다. 사용자 인터페이스는 그리 좋지 않지만 일단 이해하고 나면 꽤 좋은 툴이다. 요즘 흔히 사용하는 병합 충돌 해결 툴인 KDiff3이며 로즈는 다음 화면을 보게 된다.

KDiff3에서는 네 구역으로 나뉘어 있는데 왼쪽 위는 원래 파일, 가운데 위는 로즈가 편집하는 버전, 오른쪽 위는 내가 편집한 버전이고 아래쪽은 로즈가 충돌을 해결해 병합한 파일을 만드는 편집기이다.

충돌을 해결하는 건, 각 충돌 내용을 살펴보고 어떻게 해결할지 선택하는 다소 간단한 일이다. 로즈는 제정신이 아니어서 바나나 망고 과카몰리가 나쁘지 않다고 결정했다.

그런데 로그가 데이트하는 것 같다고 얘기했던가? 하루는 그녀가 퇴근하며 데니스 프란츠(Dennis Franz)[3]처럼 생긴 남자와 함께 가는 걸 봤는데 최근 몇 년 중에 가장 기분 좋은 것 같았다.

로즈는 변경 내용을 저장하고 KDiff3을 종료한다.

이제 충돌은 해결됐다.

꼭 기억해야 하는 것은 다른 이의 일정에 따라 병합하지 않아도 된다는 점이다. 원할 때 hg pull을 사용하면 되고, 충돌을 병합하고 싶지 않으면 병합해야 할 때까지 기분 좋게 계속 작업한 후 커밋하면 된다.

확인하기

다음은 이 튜토리얼을 읽은 후 알아야 하는 것이다.

  1. 다른 이와 함께 같은 코드 기반으로 작업한다.
  2. 다른 이가 만든 변경 내용을 가져 온다.
  3. 자신이 만든 변경 내용을 넣는다.
  4. 때때로 발생하는 병합 충돌을 해결한다.
  5. 개발자에게 생기는 우울 증세를 진단한다.

[1] 원문에서 내용과 그림이 맞지 않는다. merge, commit, log 확인 그림이 나오지만 내용에서는 병합만 하고 아직 커밋하지 않는 것으로 설명하며 아래에서 다시 commit, push를 하는 오류가 있다. 전체적으로 정리하면 merge, type, commit, log, push 순서이며 두 그림을 하나로 합쳐 이해하도록 한다.
[2] 매운 고추
[3] 영화 배우

You may also like...