Hg Init: a Mercurial tutorial – Ground up Mercurial

혼자 작업하더라도 버전 제어의 이점을 얻으려면 머큐리얼을 사용하는 게 좋다. 이 튜토리얼에서는 디렉터리를 머큐리얼에 체크 인해서 이전 버전을 얼마나 쉽게 추적할 수 있는지 보여준다.


Ground up Mercurial

머큐리얼은 버전 제어 시스템이다. 개발자는 이를 소스 코드 관리에 사용하는데, 이것은 다음 두 가지 중요한 목적을 제공한다.

  1. 모든 파일에 대해 이전 버전을 모두 추적한다.
  2. 코드에서 다른 버전을 병합할 수 있으므로 동료가 독립적으로 작업한 후 변경 내용을 병합할 수 있다.

머큐리얼을 사용하지 않고 모든 코드를 담고 있는 디렉터리 복사본을 여럿 만들어 이전 버전을 유지할 수도 있다.

Folder

이는 장황하며 많은 디스크 공간을 소비하고 혼란스럽다. 버전 제어를 사용하는 게 더 나은 방법이다.

많은 사람들은 머큐리얼을 명령 행(command line)으로 작업하는데 명령 행은 윈도, 유닉스, 맥에서 모두 사용한다. 머큐리얼에 대한 명령은 hg이다.

다른 내용 없이 hg만 입력하면 사용할 수 있는 대부분의 일반 명령 목록을 보여주며, hg help를 입력해 완전한 명령 목록을 볼 수도 있다.

버전 제어의 이점을 얻으려면 저장소(repository)가 있어야 한다. 저장소에는 모든 파일에 대한 이전 버전을 모두 저장한다. 디스크 공간을 절약하기 위해 실제로는 이전 버전 모두를 저장하는 게 아니라 정확히는 변경 내용에 대한 간결한 목록을 저장한다.

이전에는 저장소를 만드는 게 큰 일이었다. 어딘가에 중앙 서버가 있어야 하고 소프트웨어를 서버에 설치해야 했다. 머큐리얼은 분산 환경이므로 멋진 중앙 서버 없이도 사용할 수 있다. 자신의 컴퓨터에서 온전히 실행할 수 있으며 저장소를 만드는 것도 너무 쉽다. 우선 코드가 있는 디렉터리에서 가장 상위로 간다.

코드가 있는 곳에서 hg init을 입력한다.

잠시 기다리면 무슨 일이 생기는가? 아무런 일도 없는 것처럼 보이지만 자세히 살펴보면 .hg라는 새 디렉터리가 생겼을 것이다.

바로 저장소이다! 이 디렉터리에는 설정, 이전 버전 파일, 꼬리표, 비 올 때 필요한 여분 양말 등 머큐리얼에서 필요한 모든 것이 있다. 그 안에 들어가지 마라. 그 디렉터리를 직접 어지럽힐 일은 거의 없다.

좋다. 이제 신선한 새 저장소도 생겼으니 소스 파일을 모두 추가할 차례다. 이 건 너무 쉽다. hg add를 입력한다.

한 단계 더 남았다. 변경 내용을 커밋해야 한다. 무슨 변경이냐고? 파일을 모두 추가한 변경 말이다.

왜 커밋을 해야 할까? 머큐리얼에서 커밋이란 “이봐, 지금 파일 상태를 기억해 줘.”라고 말하는 거다. 이는 전체 디렉터리 복사본을 만드는 것과 같으며 무언가를 변경할 때마다 커밋해야 한다.

머큐리얼에서는 커밋 메시지를 적을 수 있도록 편집기를 띄우는데, 커밋 메시지란 무엇을 변경했는지 상기시키기 위해 적는 내용이다.

저장 후 종료하면 파일은 커밋된다.

변경 이력을 보려면 hg log를 입력한다. 이는 저장소에 대한 블로그와 같다.

이제 파일을 변경해 무슨 일이 생기나 보자.

다른 변경을 했으므로 hg commit으로 커밋할 수 있다.

a.txt 파일 하나만 변경한 것을 머큐리얼에서 안다는 것에 주목한다.

이제 커밋하고 로그를 보자.

요즘 블로거처럼 머큐리얼에서는 최신 내용을 먼저 보여준다.

재미 있으라고 하나 더 변경하겠다.

커밋한다.

다음은 커밋 메시지이다.

이제 로그는 어떻게 보일까?

좋다. 꽤 재미있다. 변경한 다음에는 항상 저장소에 커밋했다.

여러분이 어떻게 생각할지 안다. 조엘, 이 건 정말 시간 낭비예요.“ 라고 생각할 거다. 왜 이렇게 쓸데 없어 보이는 커밋을 해야 할까?

인내심을 가져라, 어린 메뚜기여. 여러분은 이로부터 이득을 얻는 법을 배울 것이다.

하나. 큰 편집 실수를 했다고 하자.

그런 후, 이런, 덤으로 중요한 파일 한 쌍을 삭제한다.

머큐리얼을 사용하기 전에는 시스템 관리자에게 달려가 소리치며 지난 8 개월 동안 멀쩡하던 백업 시스템이 ‘잠시’ 멈춰 버렸는지 뼈에 사무치도록 슬픈 질문을 하기에 딱 좋을 것이다.

모두가 타코(Taco)라고 부르는 시스템 관리자는 너무 부끄러워 팀에 다른 동료와 함께 점심을 먹지도 못한다. 회전 의자에서 일어날 정도로 드문 그런 일 때문에, 점심으로 먹는 멕시코 요리에서 소스 방울이 떨어져 좌석 다리 사이 부분이 삼각형 모양의, 살사 소스 색으로 얼룩져 있는 걸 여러분은 알게 될 거다. 왜냐하면 그 의자가 모든 이에게 등에 통증을 일으키는, 스테플(Staples)에서 특별히 $99에 파는 일반 의자가 아니라 창업주 자신들이 쓰려고 사는 최고급 허먼 밀러(Herman Miller) 제품일지라도 아무도 그의 자리를 보장하기 않기 때문이다.

아무튼, 그렇다. 백업은 없다.

고맙다 머큐리얼. 잘못 변경해 기분이 좋지 않을 때는 그저 hg revert 명령을 입력해 마지막 커밋한 시점으로 디렉터리 상태를 즉시 되돌릴 수 있다.

명령행 인자 –all은 모든 파일을 원래 상태로 되돌릴 때 사용한다.

그러므로 머큐리얼로 소스 코드에 작업할 때는 다음과 같다.

  1. 변경한다.
  2. 동작하는지 확인한다.
  3. 잘 동작하면 commit 한다.
  4. 잘 동작하지 않으면 revert 한다.
  5. 1번으로 간다.

시간이 흘러 감에 따라 어디쯤 왔는지, 마지막 변경 후 무엇을 바꿨는지 혼란스러울 수 있다. 머큐리얼에서는 그 모든 걸 계속 추적하므로 hg status만 입력하면 변경한 파일 목록을 보여 준다.

내가 파일을 만들고 어떤 건 고치고 어떤 건 삭제했다고 하자.

hg status는 변경한 모든 파일 앞에 무슨 일이 생겼는지 알려주는 문자를 붙여 나열한다. ‘M’은 파일을 변경했다는 걸 나타낸다. ‘!’는 파일이 있어야 하지만 없어졌다는 것을, ‘?’는 해당 파일에 대한 정보가 없다는 걸 나타낸다.

이 변경 내용에 대해 하나씩 살펴보자. a.txt는 변경한 파일인데 무엇을 변경했을까? 무엇을 변경했는지 잊을 수도 있다! 이런, 난 아침에 뭘 먹었는지조차 대부분 기억하지 못한다. 이는 특히 걱정스러운데 아침은 항상 치리오스[1]이기 때문이다. 아무튼 a.txt를 바꿨다. 그런데 뭘?

그걸 확인하는 명령이 있다. hg diff는 마지막으로 커밋한 이후 파일을 어떻게 바꿨는지 정확히 알려준다.

형식이 다소 암호처럼 보이겠지만 중요한 부분은 삭제한 걸 나타내는 음수 기호로 시작하는 줄과 추가한 것을 나타내는 양수 기호로 시작하는 몇 줄이다. 그러므로 여기서는 ‘Normal people’을 ‘Civilians’로 바꾼 것을 알 수 있다.

이제 사라진 파일 favicon.ico 차례다. 이전처럼 삭제하려 한 게 아니면 hg revert를 사용할 수 있지만 정말로 제거하려 한다고 하자. 파일을 제거(또는 추가)할 때마다 머큐리얼에 알려야 한다.

‘R’은 ‘제거’를 뜻하므로 다음에 커밋하면 이 파일은 지워진다(파일에 대한 이력은 저장소에 남으므로 언제든지 다시 가져올 수 있다.). 마지막으로 새 파일 b.txt를 추가해야 한다.

‘A’는 ‘추가’를 뜻한다. 여러분은 내가 지금까지 계속 굼뜨게 hg status를 입력한 걸 알고 있을까? 머큐리얼에서는 명령을 정확히 하는데 필요한 만큼만 글자를 입력하면 되는데 st로 시작하는 다른 명령은 없다.

?와 ! 문제를 해결했으므로 계속 진행해 변경 내용을 체크 인할 수 있다.

hg log 내용에서 볼 것이 한 가지 더 있다. 체인지셋(changeset) 부분에는 모든 커밋에 대한 번호가 있는데, 첫 리비전에 있는 ‘0’처럼 짧고 간단한 것과 지금은 여러분이 무시해도 되는 길고 우스꽝스러워 보이는 16진수 두 가지이다.

머큐리얼에서는 모든 파일에 대해 이전 버전을 재구성할 수 있도록 충분한 정보를 저장소에 유지한다는 걸 기억하자.

무엇보다도 hg cat은 단순한 명령이지만 파일에 대한 어떤 이전 버전이라도 그 내용을 출력하는데 사용할 수 있다. 예를 들어 현재 a.txt가 어떤지 보자.

이전 내용을 보기 위해 로그에서 체인지셋 번호만 선택하면 되며 cat 명령에 -r(리비전) 인자를 사용한다.

파일 내용은 길고 복잡한데 일부분만 변경했다면 hg diff 명령에 -r 인자를 사용해 두 리비전 사이에 차이를 출력할 수 있다. 예를 들어 리비전 0과 1 사이에 변경 내용을 보려면 다음과 같다.

지금까지 지치지 않았다면 마치기 전에 마지막으로 작은 내용 한 가지를 더 알려주겠다. hg update를 사용하면 원하는 어느 리비전으로든 갈 수 있다. 물론 아주 멋진 일이겠지만 미래로는 못 간다. 리비전이 4까지 밖에 없는데 hg update -r 103994를 입력하면 정말 멋진 반중력 공상과학 미래지향적 소스 코드 버전을 얻을 것이다. 물론, 불가능하다.

가능한 이전 버전이 무엇인지 다음을 보자.

hg update는 실제로 시간을 옮겨 가며 디렉터리 안에 있는 모든 파일을 바꾼다. 그 당시 파일을 추가하거나 제거했으면 똑같이 추가하거나 제거한다. 아무 인자 없이 hg update를 사용하면 최신 버전으로 바꾼다.

확인하기

좋다! 지금까지가 첫 번째 튜토리얼이다. 이제 할 줄 알아야 하는 건 다음과 같다.

  1. 저장소를 생성한다.
  2. 저장소에 파일을 추가하고 제거한다.
  3. 변경 후 커밋하기 전에 어떤 내용을 바꿨는지 확인하고
  4. 맘에 들면 커밋하거나
  5. 맘에 들지 않으면 되돌린다.
  6. 이전 버전 파일 내용을 보거나 디렉터리를 시간적으로 옮겨 본다.

[1] 시리얼 제품명