목공책 하나 들이셔요~

2013년 12월 23일 월요일

[Hg] 4. Mercurial의 병합

이 글은 Joel Spolsky가 저술한 Mercurial 튜토리얼 시리즈 중에서 다섯번째 글인 "Merging"를 번역한 것입니다. 원문은 다음 링크를 참조하세요. http://hginit.com/04.html

버전 컨트롤 시스템이 해야 할 가장 중요한 일은 여러명이 한 코드를 편집할 수 있게 지원해 주는 것입니다.

로즈와 제가 구아카몰 레서피를 수정하고 싶다고 상상해 보세요. 로즈는 아보카도의 질을 높이고 싶어합니다. 그녀는 작업을 시작하기 전에 먼저 중앙 레포지토리로부터 최신 버전을 당겨(pull) 옵니다. 그래서 그녀는 최신 버전을 가지고 수정 작업에 들어 갑니다.


그리고 다음과 같이 수정합니다.


수정을 마친 그녀는 커밋을 하고 중앙 레포지토리로 변경 사항을 밀어 넣습니다.


비슷한 시각에 저는 그 파일의 다른 부분을 편집합니다.


저는 커밋은 할 수 있지만 중앙 레포지토리에 밀어(push) 넣지는 못합니다.


여기서 나오는 메시지는 Mercurial에서 가장 쓸모 없는 메시지입니다. 이건 이렇게 바뀌어야 합니다.  "이런~ 당신이 아직 가져가지 않은 변경사항이 레포지토리에 있습니다. 지금 푸쉬하지 말고 먼저 최신 변경사항을 당겨 온 다음 병합을 먼저 하세요"


그래서 최신 버전을 당겨 옵니다.


뭐가 당겨져 왔는지 궁금하세요? 그럼 hg log -P . 커맨드를 쳐보세요.


오 이건 로즈가 좀 전에 변경한 코드네요. 그렇다면 제 레포지토리는 지금 어떤 상황일까요?


제 레포지토리는 여러개의 헤드를 가지고 있습니다. 그래서 이렇게 보일 겁니다.


두개의 헤드가 보이시나요? 이 변경본은 제가 작업하는 동안 로즈가 체인지셋 #7을 바탕으로 수정작업한 것입니다. 저도 역시 체인지셋 #7을 수정하였습니다. 자 이제 병합이 필요할 때입니다.


hg merge 라는 병합 커맨드는 두 개의 헤드를 가져다가 하나로 만듭니다. 그리고 그것을 제 작업 디렉토리에 남겨둡니다. 아직 커밋을 하지 않았으므로 병합이 제대로 되었는지 확인해 볼 타이밍입니다.


잘 병합된 것 같군요. 아보카도는 하스(Hass)이고 칠리는 할라피뇨(Jalapenos)로 바뀌었습니다. 그래서 저는 커밋을 하고 중앙 레포지토리로 푸쉬를 합니다.


저는 두개의 체이지셋을 푸쉬했습니다. 하나는 제가 수정한 할라피뇨에 대한 수정본이고 하나는 병합된 것입니다.

한 파일에서 동시에 두 군데를 변경했지만 충돌이 일어나지 않았음에 주목하세요. 그것은 로즈와 제가 파일에서 다른 부분을 편집했기 때문입니다. 그러므로 병합은 아주 아주 쉽습니다. 이게 보통 흔히 일어나는 케이스입니다. 왜냐하면 대부분의 조직에서 각각의 프로그래머들은 다른 파트의 코드를 코딩하도록 할당되기 때문입니다.

때로는 당신이 아무도 업무분장을 하지 않는 멍청한 조직에 속할 수도 있습니다. 하지만 잘 관리되는 조직에 있다고 할지라도 병합할 때 가끔씩 충돌(conflict)이 일어날 수 있습니다. 이때는 사람이 직접 개입해서 충돌을 해결해야 합니다. 이제 그런 경우를 한번 살펴보겠습니다.

로즈는 먼저 저의 할리피뇨에 관한 변경사항을 중앙 레포지토리에서 당겨 받습니다.


자 이제 순수한 충돌이 일어나면 어떻게 되는지 실험해 보도록 하겠습니다.

저는 레서피에 바나나를 추가했습니다.


저는 바나나에 대한 변경사항을 커밋합니다.


자 한편 로즈는 정확히 같은 자리에 망고를 추가합니다.


잘 익은 망고가 추가되었습니다.


자 이번에는 로즈가 병합을 하도록 합니다.


병합시 충돌이 감지되면 갑자기 병합 충돌 해결 도구 창이 뜹니다. 이 도구의 이름은 KDiff3라는 건데 좀 구식의 UI지만 직관적입니다.


KDiff3는 4개의 창을 가지고 있습니다. 상단 좌측은 원래 파일(충돌이 일어나기 전 파일)이고, 상단 중앙은 로즈(자신)가 작성한 버전이며, 상단 우측은 다른 사람이 작성하여 충돌을 야기시킨 버전입니다. 하단은 충돌 해결을 위해 직접 편집할 수 있는 창입니다.

충돌을 해결하는 것은 그리 어렵지 않습니다. 로즈는 바나나 망고 구아카몰도 괜찮을 것 같아 둘을 모두 살리기로 했습니다.


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


이렇게 해서 병합 충돌이 해결되었습니다.

한가지 염두에 두어야 할 것은 모든 충돌을 당신이 해결할 필요는 없다는 겁니다. 당신은 원할때 언제나 hg pull로 소스코드를 당겨올 수 있으며 충돌을 해결하고 싶지 않으면 그냥 계속 작업하고 커밋하면 됩니다. 나중에 충돌을 어떻게 해결할 지 방안이 서면 그때가서 해도 됩니다.

스스로 해보세요

이 튜토리얼을 읽고 반드시 알아야 할 내용들입니다.

1. 다른 사람과 같이 코드를 작성하세요.
2. 다른 사람의 변경 사항들을 가져오세요
3. 당신의 변경 사항을 푸쉬하세요.
4. 가끔씩 발생하는 병합 충돌을 해결하세요.
5. 프로그래머의 우울증에 대해서 알아보세요.

댓글 없음:

댓글 쓰기