목공책 하나 들이셔요~

2013년 12월 18일 수요일

[Hg] 1. Mercurial 기초 다지기

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

Mercurial은 버전 컨트롤 시스템입니다. 개발자는 소스코드를 관리하기 위해 이것을 사용합니다. Mercurial은 큰 두가지 목적을 가지고 있습니다.

1. 각 파일의 옛날 버전으로부터의 변화를 추적하고 관리합니다.
2. 다른 버전의 코드들을 병합할 수 있습니다. 그래서 각 팀원들은 개별적으로 작업하고 나중에 그 변화들을 병합하여 하나의 코드로 만들 수 있습니다.

Mercurial이 없다면 당신은 예전 버전의 소스코드들을 모두 담고 있는 여러개의 디렉토리를 만들어야 합니다. 아래 그림처럼요...


이런 식의 소스 관리는 지루하고 디스크도 많이 차지하고 혼란스럽기까지 합니다. 버전 컨트롤 시스템을 쓰면 소스코드 관리를 더 잘할 수 있습니다.

대부분의 사람들이 Mercurial을 커맨드 라인으로 실행합니다. Mercurial 커맨드 라인 명령은 Windows, Unix, Mac 등에서 가능하며 Mercurial 커맨드는 hg 입니다.

아무런 인자없이 hg만 입력하고 엔터를 치면 주로 많이 사용되는 커맨드들에 대한 설명이 나옵니다. 혹은 hg help를 입력하면 전체 커맨드 리스트를 볼 수 있습니다.


버전 컨트롤의 잇점을 얻으려면 레포지토리(repository)가 필요합니다. 레포지토리는 당신의 모든 파일들에 대한 옛날 버전에 대한 정보를 보관합니다. 디스크 저장공간을 줄이기 위해 모든 버전의 파일 전체를 기록하지는 않습니다. 오로지 변화된 부분들의 축약된 리스트만을 저장합니다.

옛날에는 레포지토리를 만든다는 것이 매우 큰 문제였습니다. 반드시 어딘가에 중앙서버가 있어야 했고 그곳에 어떤 소프트웨어를 깔아야 했습니다. Mercurial은 분산형이기 때문에 근사한 중앙서버가 없어도 됩니다. 단지 당신의 컴퓨터만 있으면 모든 기능을 수행할 수 있습니다. 그리고 레포지토리를 만드는 것도 아주 쉽습니다. 그냥 코드들이 있는 최상위 디렉토리로 가기만 하면 됩니다.


위의 c:\hginit\CountDown 디렉토리가 코드가 있는 곳입니다. 이곳에서 hg init 이라고 입력합니다.


잠시 기다립니다. 아무 일도 일어나지 않은 것 같지만 자세히 들여다보면 .hg라는 이름의 디렉토리가 생겼음을 알 수 있습니다.


저게 바로 레포지토리입니다. 저 디렉토리가 Mercurial이 필요로 하는 전부입니다. 설정들, 오래된 버전의 파일들, 태그들, 그리고 비올때를 대비한 여분의 양말들.. 하지만 그 디렉토리로 들어가지는 마세요. 그 디렉토리를 직접 손대는 것은 혼란을 야기할 뿐입니다.

자 이제 새로운 레포지토리를 만들었으니 소스 파일들을 추가할 차례입니다. 이또한 쉽습니다. 그냥 hg add라고 치세요.


이제 커밋을 해야 하는 마지막 단계가 남았습니다. 파일이 추가된 변화를 기록하기 위해서 입니다.

왜 커밋이 필요할까요? Mercurial에서 커밋이 의미하는 바는 "어이~ 파일들이 제대로 준비된 것 같아. 이것들을 기억해 줘~"라고 얘기하는 것과 같습니다. 그리고 전체 작업 디렉토리의 복사본을 만드는 것과도 같습니다. 당신이 작업 영역에서 변화를 일으키는 작업을 하고 나서 커밋을 하면 됩니다.


커밋을 하게 되면 커밋 메시지를 입력할 수 있는 창이 뜨게 됩니다. 이건 단지 당신이 이번 커밋이 어떤 변화를 반영한 것인지를 기록하는 의미입니다. 당신이 이해할 수 있는 메시지를 기록하면 됩니다.


메시지를 저장하고 빠져나오면 당신의 파일들은 커밋 됩니다.

hg log라고 치면 변화에 대한 히스토리를 볼 수 있습니다. 이건 마치 레포지토리의 블로그와 같습니다.


이제 파일을 변경하고 어떤 일이 일어나는지 한번 봅시다.


위와 같이 텍스트를 변경하고 hg commit으로 커밋합니다.


Mercurial이 a.txt 파일 하나만 변경되었다는 걸 알고 있음을 볼 수 있습니다.


메시지를 넣고 커밋을 한 다음 다시 로그를 봅니다.


요즘 블로그처럼 최신의 뉴스를 윗쪽에 보여줌을 볼 수 있습니다.

그리고 몇개의 변경을 더 해 봅니다.


커밋합니다.


커밋 메시지를 입력합니다.


이제 로그가 어떻게 보이나요?


아주 재밌습니다. 저는 몇개의 변화를 만들었고 각 단계마다 레포지토리로 커밋을 했습니다.

여기서 당신이 어떻게 생각할지 압니다. "조엘, 이건 시간 낭비 같아요" 도대체 왜 이런 번거로운 커밋을 해야 하는 걸까요?

좀 참으세요 어린 메뚜기씨. 당신은 이제 이런 번거로운 절차의 잇점을 배우게 될 겁니다.

첫째로 당신이 편집에 큰 실수를 범했다고 해 봅시다.


게다가... 어이쿠~ 몇가지 중요한 파일까지 지워버렸다고 해 봅시다.


Mercurial이 있기 전이라면 보통은 시스템 관리자에게 달려가서 왜 백업시스템이 지난 8개월동안 제대로 작동되지 않는지 따져묻게 되는 그런 케이스가 될 겁니다.

하지만 Mercurial에게 감사하십시요. 당신이 저지른 변경이 바람직하지 않은 경우 hg revert라는 간단한 명령으로 즉시 마지막 커밋 시의 상태로 되돌릴 수 있습니다.


저는 여기서 --all 이라는 옵션을 주었는데 모든 파일을 원래 상태로 돌리라는 의미입니다.

그래서 당신이 Mercurial로 작업하는 순서는 다음과 같습니다.
  1. 코드를 변경합니다.
  2. 변경된 코드가 잘 동작하는지 확인합니다.
  3. 잘 동작한다면 commit 합니다.
  4. 잘 동작하지 않는다면 revert 합니다.
  5. 1)로 되돌아 갑니다.
계속 작업하다보면 당신은 종종 마지막 커밋으로부터 어떤게 변화되었는지 헷갈릴 때가 있습니다. 그런데 Mercurial은 당신을 위해 이 모든 변화를 추적하고 있습니다. hg status를 입력하면 어떤 파일들이 변화되었는지를 볼 수 있습니다.

예를 들어 파일을 생성하고, 편집하고, 지웠다고 합시다.


hg status는 어떤 식의 변경이 있는지를 나타내는 한 글자를 덧붙여서 변경된 파일들을 보여줍니다. "M"은 수정(modified)되었다는 의미이며, "!"은 파일이 없어졌음을 의미하며, "?"는 파일이 새로 생겼음을 의미합니다.

변경이 되었단는 a.txt 파일에 대해서 더 살펴봅시다. 당신이 이 파일을 어떻게 변경했는지 기억이 잘 나지 않는다면 hg diff 명령을 이용하여 마지막 커밋 이후 변경된 내용을 볼 수 있습니다.


얼핏보면 이 diff 형식은 암호같이 어렵습니다만 알고보면 간단합니다. -로 시작되는 라인은 없어진 것을 의미하고 +로 시작되는 라인은 새로 생긴 것을 의미합니다. 이 둘을 종합해서 보면 "Normal people"이 "Civilians"로 바뀌었다는 겁니다.

이제 삭제된 favicon.ico에 대해서 살펴봅시다. 만일 이걸 삭제할 의도가 아니었다면 그냥 hg revert로 되돌릴 수 있습니다. 하지만 이 파일을 삭제할 의도였다면 Mercurial에 이걸 알려주면 됩니다.


위와 달리 favicon.ico 파일 앞이 "!"이 아니라 "R"로 바뀌었음을 볼 수 있습니다. 이건 제거(removed)되었다는 걸 의미합니다. 그래서 다음번에 커밋할 때 실제 이 파일이 제거될 것임을 예고합니다. 물론 이 파일의 히스토리는 레포지토리에 저장되어 있을 것이기 때문에 나중에 복원할 수 있습니다.

이제 마지막으로 추가된 b.txt 파일을 봅시다.


"A"는 파일이추가(added)되었다는 걸 의미합니다. "?"에서 hg add 명령에 의해 "A"로 바뀐 것이며 다음번 커밋에 이 파일이 추가됨을 예고합니다.

hg status라고 길게 쓰기 귀찮다면 hg st라고만 쳐도 됩니다. Mercurial은 모호함이 없는 최소한의 커맨드만 쳐도 인식을 할 정도로 똑똑합니다.

"?"와 "!" 문자들에 대해 모두 해결이 되었다면 이제 이 변화들을 커밋하고 앞으로 나아갈 수 있습니다.


hg log의 출력물 중 changeset을 나타내는 라인을 살펴볼 필요가 있습니다. 두개의 숫자가 콜론으로 구별되는데 하나는 커밋될때 마다 증가하는 리비젼 번호를 나타내고, 16진수로 되어 있는 복잡한 숫자는 당장은 무시해도 되는 숫자입니다.

Mercurial은 이전 버전의 파일을 다시 복원할 수 있도록 충분한 정보를 레포지토리에 저장한다는 것을 상기하십시요.

hg cat 커맨드는 어떤 파일의 옛날 버전을 볼 수 있게 합니다. 예를 들어 a.txt를 본다면...


이 파일의 예전 버전이 어땠는지 보려면 hg log로부터 얻어진 체인지셋 번호를 hg cat 커맨드의 -r 옵션의 인자로 넣으면 됩니다.


파일이 길고 복잡한데 수정된 곳이 극히 일부분이라면 hg diff 커맨드와 -r 옵션을 사용하여 두 리비젼간의 차이를 쉽게 볼 수 있습니다. 예를 들어 리비젼 0과 리비젼 1과의 차이를 보는 예는 다음과 같습니다.


마지막으로 당신이 아직 피곤하지 않은 상태라면 아주 작은 것 하나를 더 알려드리겠습니다. 당신은 hg update명령을 사용하여 원하는 리비젼의 파일로 작업 파일을 변경할 수 있습니다. 물론 4개의 리비젼 밖에 없는데 hg update -r 103994와 같은 미래의 코드를 가져올 수는 없습니다.

가능한 것은 과거의 리비젼으로 돌아가는 것입니다. 예를 보세요.


hg update는 디렉토리 내의 모든 파일들을 앞 혹은 뒤의 시점으로 변경시킵니다. 만일 파일이 추가되거나 제거되었다면 그것도 제대로 반영됩니다. 아무 인자가 없이 hg update가 사용되면 가장 최근 버전으로 변경됩니다.

스스로 해보세요

첫번째 튜토리얼이 끝났습니다. 여러분들이 꼭 직접 해봐야 할 것들을 정리 했습니다.

1. 레포지토리를 만드세요
2. 레포지토리에 파일을 추가하고 제거해보세요
3. 변경을 만들고 커밋하기 전 어떤 변경이 있는지 확인하세요
4. 변경이 맘에 들면 커밋하세요
5. 변경이 맘에 들지 않으면 원래대로 돌리세요
6. 예전 버전의 파일을 보거나 작업 디렉토리를 앞 혹은 뒷 버전으로 변경시켜 보세요.

댓글 없음:

댓글 쓰기