입문서 - 변경의 첫경험

KoreanTutorialHistory까지 따라한 결과, KoreanTutorialClone에서 복제my-hello 저장소에 이르렀습니다.

여러가지 변경을 별도의 저장소에 분리하는 것은, Mercurial로 개발을 실천함에 있어 좋은 습관입니다. 이것은 관계 없는 코드가 섞이는 것을 막고, 이에 보다 각각의 작업을 개별적으로 테스트하는 일이 즐겁게 됩니다. 이 모델에 따라 시작해봅시다.

여기서의 간단한 목표는, "hello, world" 프로그램의 출력에 한 줄 더 추가하는 것입니다. 가장 먼저, 이 간단한 목표를 이루기 위한 프로젝트용으로 my-hello를 복제한 my-hello-new-output라고 불리는 새로운 저장소를 만듭니다.

$ cd ..
$ hg clone my-hello my-hello-new-output

이 경우, clone 명령이 잘 실행되었으면 아무것도 표시되지 않습니다.

주의: 새로운 저장소에 설명적인 이름을 붙이는 것에 주의하세요. 기본적으로는, 저장소의 목적이 한눈에 들어오게 하는 이름을 붙입니다. Mercurial로는 저장소복제가 손쉽게 가능하기 때문에, 조금씩 다른 저장소들 금방 많이 쌓아두게 됩니다. 이들 저장소의 이름에 설명적인 이름이 붙이지 않는다면, 쉽게 식별하기 힘들 것입니다.

그러면, 새로운 저장소에 변경을 가해봅시다. 작업 디렉토리 (이것은 모든 파일이 있는 디렉토리를 부르는 이름입니다)에 넣어, 좋아하는 에디터로 소스 코드를 변경해 봅시다.

$ cd my-hello-new-output
$ vi hello.c

hello.c의 내용은 원래 이렇습니다:

/*
 * hello.c
 *
 * Placed in the public domain by Bryan O'Sullivan
 *
 * This program is not covered by patents in the United States or other
 * countries.
 */

#include <stdio.h>

int main(int argc, char **argv)
{
        printf("hello, world!\n");
        return 0;
}

main을 편집하여 출력하는 줄을 두 줄로 늘려 봅시다.

(...)

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

다 마쳤으며, 에디터를 종료합니다. 이 편집으로, 변경집합을 만들 준비가 되었습니다.

그러나, 혹시 만약 작업을 중단하여, 어떤 변경이 변경집합에 포함되는지를 잊어버렸다면 어떻게 할까요? 바로 그때, status 명령을 씁니다.

$ hg status
M hello.c

간단한 출력입니다만, 접두사인 M이, hello.c가 변경(modified)되어 다음 변경집합에 포함된다는 것을 가르쳐줍니다.

diff 명령을 쓰면, 그 파일에 대한 변경을 실제로 조사하는 것이 가능합니다.

$ hg diff
diff -r 82e55d328c8c hello.c
--- a/hello.c   Fri Aug 26 01:21:28 2005 -0700
+++ b/hello.c   Fri Sep 30 10:27:47 2005 +0800
@@ -12,5 +12,6 @@
 int main(int argc, char **argv)
 {
        printf("hello, world!\n");
+       printf("sure am glad I'm using Mercurial!\n");
        return 0;
 }

<!> 변경을 파기하여 원래 상태로 돌려놓고 싶은 경우는, revert 명령을 써서 파일을 변경하지 않은 상태로 돌려놓는 것이 가능합니다. 다만, 그것이 진정 하고 싶은 것인지 확인해주세요.

$ hg revert

변경집합을 작성하는 행위를, 반영한다고 부릅니다. commit 명령을 써서 반영을 실행합니다.

$ hg commit

이것은 에디터를 열어, 암호와 같은 줄을 몇개인가 표시합니다.

주의: 기본 에디터는 vi입니다. 이것은 EDITORHGEDITOR 환경변수를 써서 변경하는 것이 가능합니다. 또한, 메니페스트의 해시는 어떻게 쳐서 파일에 보존하는가에 따라 다릅니다.

(빈줄)
HG: manifest hash 14595beb70bcfb74bf227437d70c38878421c944
HG: changed hello.c

맨 처음 줄은 공백으로, 그 다음 행은 변경집합에 포함될 파일을 가리킵니다.

변경집합반영하는 데에는, 이유를 써넣지 않으면 안됩니다. 이것은 통상 변경집합 코멘트라 부릅니다. 이렇게 입력해 봅시다.

Express great joy at existence of Mercurial
HG: manifest hash 14595beb70bcfb74bf227437d70c38878421c944
HG: changed hello.c

다음으로, 저장한 다음 에디터를 종료합니다. 여기까지 잘 되었다면, commit 명령은 종료하여 아무것도 표시되지 않습니다. <!> 만약 텍스트를 저장하지 않고 에디터를 종료하면, commit는 조작을 중단하며 반영하기 전에 마음을 바꿀 수 있습니다.

그러면, 이 상태에서 status 명령을 어떤 상황을 알려줄까요?

$ hg status

아무것도 없습니다! 방금 가한 변경은 변경집합반영되어 있으므로, 반영이 필요한 변경된 파일이 존재하지 않습니다. Tip은 이제까지 작업한 디렉토리의 내용과 일치하고 있습니다.

다음 작업을 위해, 갱신이력을 조사하는 것이 가능합니다.

$ hg log
changeset:   2:a58809af174d
tag:         tip
user:        mpm@selenic.com
date:        Fri Aug 26 01:26:28 2005 -0700
summary:     Express great joy at existence of Mercurial

(...)

보입니다! 반영변경집합입니다.

주의: 사용자 이름, 일시, ChangeSetID와 당연히 변하는 것이죠.

KoreanTutorialClone에서 논의했듯이, 새로운 변경집합은 이 저장소에만 존재합니다. 이것은 Mercurial의 얼개에 있어 매우 심대한 부분입니다.

변경을 공유하는 단계는, KoreanTutorialShareChange 에서 다룹니다.


CategoryKorean

KoreanTutorialFirstChange (last edited 2009-05-19 19:31:02 by localhost)