입문서 - 충돌하는 변경을 병합합니다

KoreanTutorialMerge에서는, 간단한 들여오기를 다루는 법을 배웠습니다.

Mercurial은 더욱 복잡한 병합도 다룹니다. 2명이 어떤 파일의 같은 줄을 편집하는 일이 그리 드문 것은 아니며, 대처법을 강구해야 합니다. 이런 문제를 충돌이라고 부릅니다; 충돌에 대해서 무엇을 해야하는가를 해명하는 것을, 해결이라고 부릅니다.

먼저 인위적으로 충돌하는 상황을 연출해봅시다. 앞서 했듯이, my-hello복제하는 일부터 시작해봅시다.

$ cd ..
$ hg clone my-hello my-hello-not-cvs

이번에는 hello.c의 출력에 새로운 행을 추가해봅시다:

$ cd my-hello-not-cvs
$ vi hello.c

main을 아래와 같이 변경합니다:

int main(int argc, char **argv)
{
        printf("hello, world!\n");
        printf("sure am glad I'm not using CVS!\n");
        return 0;
}

그래서 이 변경을 반영합니다.

$ hg commit -m 'Give thanks for dodging bullet'

KoreanTutorialFirstChange에서는, my-hello-new-output 에도 두번째 줄의 출력을 더한 변경집합을 작성했던 것을 기억해주세요. 여기서 그 변경을 당겨오기로 하면, 무슨 일이 벌어질까요?

$ hg pull ../my-hello-new-output
pulling from ../my-hello-new-output
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

여기까지는 좋습니다. Update해봅시다.

$ hg update
abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes

hg merge를 실행할 필요가 있습니다. 그러나, 여기에 변화가 있습니다. Mercurial은 자동적으로 병합하는 것이 가능하지 않습니다, 라고 하는 것은 각 변경집합에 따라, 같은 소스 파일의 같은 줄이 다른 식으로 변경되어 있기 때문입니다 (한편으로는 반영한 것으로, 또 한편은 당겨오기한 것입니다. 그 대신에, Mercurial은 수동 병합을 도와주는 프로그램을 시작하게 됩니다.)

$ hg merge

이 시점에서 어떤 일이 벌어지는가는, 컴퓨터에 설치된 프로그램에 의존합니다. 만약 준비성이나 운이 좋다면, 병합프로그램을 설치해두었기에, 병합프로그램이 뜹니다. 여기서, 2개의 변경 사이에 무언가 충돌하고 있는지를 확인하여, 그것을 어떻게 해야 해결하는지를 결정하는 것이 가능합니다.

Mercurial은 파일당 3-way 병합을 사용합니다. 이것은 병합처리에 3개의 입력파일이 있는 것을 의미하며, 다음과 같습니다.

3-way에 대해 더 자세한 정보는, Revctrl wiki에 있는 ThreeWayMerge를 보시기 바랍니다.

만일 병합프로그램을 설치하지 않고 있다면, 텍스트 편집기가 떠서, 병합할 필요가 있는 파일을 엽니다. 이것을 손수 하는 것은 매우 잘못할 가능성이 높고 지겹습니다. 편집기를 종료한 다음 hg rollback 명령을 써서 Pull의 결과를 취소한 다음, 병합프로그램을 설치하여, 한번 더 시도해보는 것이 가장 좋습니다.

주의: Mercurial은 어떤 프로그램을 실행할 필요가 있는지를 알아보기 위해 HGMERGE 환경변수와 설정 파일을 조사합니다. 만약 아무것도 설정되어 있지 않다면, hgmerge 스크립트를 실행합니다.

이제 KoreanTutorialConclusion으로 넘어가 마무리 지읍시다.


CategoryKorean

KoreanTutorialConflict (last edited 2009-05-19 19:30:57 by localhost)