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

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

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

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

$ 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;
}

그래서 이 변경을 [:Commit:반영]합니다.

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

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

$ 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"]은 자동적으로 [:Merge:병합]하는 것이 가능하지 않습니다, 라고 하는 것은 각 [:ChangeSet:변경집합]에 따라, 같은 소스 파일의 같은 줄이 다른 식으로 변경되어 있기 때문입니다 (한편으로는 [:Commit:반영]한 것으로, 또 한편은 [:Pull:당겨오기]한 것입니다. 그 대신에, ["Mercurial"]은 수동 병합을 도와주는 프로그램을 시작하게 됩니다.)

$ hg merge

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

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

3-way에 대해 더 자세한 정보는, [http://revctrl.org/ Revctrl wiki]에 있는 [http://revctrl.org/ThreeWayMerge ThreeWayMerge]를 보시기 바랍니다.

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

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

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


CategoryKorean