초보자를위한 머큐리 : 실용 가이드


237

초보자를위한 Git에서 영감을 얻은 결정적인 실용 가이드 .

초보자으로 Mercurial을 사용하는 방법에 대한 정보를 모은 것입니다.

초보자-소스 컨트롤을 잘 이해하지 못한 채 소스 컨트롤을 만진 프로그래머.

실용적-대부분의 사용자가 자주 겪는 상황-리포지토리 생성, 분기, 병합, 원격 리포지토리에서 가져 오기 / 푸시 등

참고 사항 :

  • 무언가가 어떻게 구현되는지가 아니라 어떻게해야하는지 설명하십시오.
  • 답변 당 하나의 질문으로 처리하십시오.
  • 가능한 명확하고 간결하게 답변하십시오.
  • 동일한 주제에 대해 새 답변을 작성하지 않고 기존 답변을 편집 / 확장하십시오.
  • 자세한 정보 를 원하는 사람들을 위해 Mercurial Wiki 또는 HG Book에 대한 링크를 제공하십시오 .

질문 :

설치 / 설정

코드 작업

태깅, 분기, 릴리스, 기준선

다른

다른 머큐리얼 참조

답변:


16

파일을 무시하도록 어떻게 구성합니까?

무시는 리포지토리의 루트에 .hgignore라는 일반 텍스트 파일로 구성됩니다. 다음을 사용하여 일반 파일처럼 추가하십시오.

hg add .hgignore

파일 일치에 사용할 수있는 구문 옵션에는 glob와 regexp가 있습니다. glob는 유닉스 계열의 파일 이름 확장이며 regexp는 정규 표현식입니다. 당신은 추가하여 각을 활성화 syntax: glob또는syntax: regexp자체적으로 줄을 합니다. 다음 구문은 다음 구문 마커까지 해당 구문을 사용합니다. 원하는만큼 구문 마커를 가질 수 있습니다. 기본 구문은 regexp이므로 regexp 만 사용하면 구문 마커가 필요하지 않습니다.

#로 댓글을 추가 할 수 있습니다

예:

# python temporary files
syntax: glob
*.pyc

#editor autosaves
*~

# temporary data
syntax: regexp
temp

무시는 관리되지 않는 파일 (즉, 아직 체크인되지 않은 파일)에만 적용됩니다. 버전 제어중인 파일을 무시하기 위해 스위치 -I 및 -X를 사용할 수 있습니다.


7
hg add파일 을 수동으로 무시한 경우 Mercurial이 파일을 추적 한다는 점을 언급하면 ​​유용 할 수 있습니다 . 당신은 같은 파일들을 가지고 예를 들어, deploy-test.conf, deploy-production.conf, 등을하고하지 (그들에 암호가있을 수 있습니다) 버전을 원하는하지만 당신은 버전으로 원하는 deploy-template.conf당신은 그냥 무시할 수 deploy*수동으로 추가합니다 deploy-templace.conf.
Steve Losh

7

커밋되지 않은 내용이나 현재 코드베이스의 상태를 어떻게 알 수 있습니까?

변경된 파일 목록을 보려면

$ hg status

상태와 함께 변경된 각 파일이 인쇄되며 여기에는 다음이 포함됩니다.

  • M-수정되었습니다. 파일이 변경되었으며 변경 사항이 커밋되지 않았습니다.
  • A-추가되었습니다. 파일은 이전에 추적되지 않았지만 Mercurial을 커밋하면 추적이 시작됩니다.
  • R-제거되었습니다. 파일은 이전에 추적되었지만 커밋하면이 커밋과 향후 커밋에서 파일 추적을 중단합니다.
  • ?-알 수 없습니다. 파일은 현재 Mercurial에서 추적하지 않습니다. 커밋은 hg add추가 하기 위해 사용하지 않으면 영향을 미치지 않습니다 .
  • !- 잃어버린. 파일이 추적되었지만 Mercurial이 작업 사본에서 파일을 찾을 수 없습니다.

실제로 파일에서 변경된 사항을 보려면

$ hg diff

6

새 프로젝트 / 리포지토리를 어떻게 만듭니 까?

$ hg init my-repository

5

Subversion과 어떻게 인터페이스합니까?

세 가지 방법이 있습니다.


변환 확장 의욕의 하나로 기존의 Subversion 저장소를 복제해야합니다. 머큐리얼과 함께 제공됩니다. 대략 다음과 같이 작동합니다.

hg convert <Subversion URL or directory> <path to new Mercurial repository>

예를 들어 SixApart memcached 리포지토리의 트렁크를 가져옵니다.

hg convert http://code.sixapart.com/svn/memcached/trunk

확장 기능은 Subversion 저장소에서 Mercurial로 조금씩 새 개정을 가져올 수 있습니다 (약간의 풀). 그러나 Mercurial 개정판을 가져 와서 Subversion으로 다시 보내는 것은 지원하지 않습니다 (푸시 없음). [XXX : 잘못된 경우 수정] .


hgsubversion 확장 . 여러 가지면에서 Subversion API를 사용하여 Subversion 저장소와 통신하므로 가장 정교한 솔루션입니다. 그것은 hg-svn 다리 가 되는 것을 목표로 합니다 . 개정판의 전체 라운드 트립 (전체 복제, 풀 및 푸시)을 허용하지만이 글을 쓰는 시점 [XXX : 부정확 한 경우 수정] 아직 개발 중이며 아직 공식 릴리스는 없습니다. 결과적으로 최신 Mercurial 과만 작동합니다 (이 문서 작성 당시 1.3).

  • 태그와 분기를 매핑합니다 (모든 태그 앞에 tags/ 같은 이름의 브랜치와 구별).
  • 특별한 지점을 유지합니다 closed-branchesSubversion에서 제거 된 를 종료 를 .
  • 그것 필요 서브 버전은 트렁크 / 지점 / 태그의 규칙에 따라 배치 할 저장소있다.
  • 명령 세트는 일반적으로 hg svn <subcommand>'svn'부분이 필요하지 않은 지점에 통합되는 것을 목표로하지만 (즉, 다른 Mercurial 저장소와 마찬가지로 Subversion 복제본을 최대한 많이 처리하려고합니다);

다음과 같이 작동합니다.

클론 :

hg svnclone <Subversion URL> 

OR ( svn://URL 만 해당 )

hg clone <svn:// URL>

손잡이:

hg svn pull

푸시:

hg svn push

들어오는:

hg svn incoming

나가는:

hg svn outgoing

전체 저장소를 체크 아웃하십시오.

hg svnclone http://code.sixapart.com/svn/memcached

hgsvn의 유틸리티 ( 의 bitbucket 트리 ). 최근까지만하면 Subversion 저장소를 복제하고 가져올 수 있지만 hgsvn 0.1.7푸시를 지원합니다. [나는 방법을 모른다 아니라 추진 . 더 많은 경험이있는 사람은 이것을 업데이트해야합니다.] 다음과 같은 특징이 있습니다.

  • 모든 SVN 태그에 대해 Mercurial 태그를 생성합니다.
  • 그것은 모든 지역 태그를 넣습니다 그것 SVN 개정을 표시 변경 집합.
  • 모든 Mercurial 개정판은 SVN 지점의 이름을 딴 명명 된 지점에 배치됩니다. 예를 들면 branches/some-feature다음과 같습니다 hg branch some-feature. 트렁크를 씌 웁니다trunk (즉, 사용자가 명시 적으로 전환하지 않는 한 Mercurial 기본 브랜치에는 아무것도 없습니다).
  • 브랜치와 태그를 식별하려고 시도하고 만들 수 없다면 그것을 건너 뜁니다. 이것은 Subversion 저장소가 기존 트렁크 / 분기 / 태그 레이아웃을 따르지 않을 때 유용합니다.

다음과 같이 작동합니다.

클론 :

hgimportsvn <Subversion URL>

손잡이:

hgpullsvn

푸시:

hgpushsvn

들어오는:

hgpullsvn -n

나가는:

hgpushsvn -n

전체 저장소를 체크 아웃하십시오.

hgimportsvn http://code.sixapart.com/svn/memcached

트렁크 만 확인 :

hgimportsvn http://code.sixapart.com/svn/memcached/trunk

2
방금 사용 hg convert했으며 많은 커밋이있는 svn 저장소가있을 때 실제로 오랜 시간이 걸립니다. 로컬 리포지토리를 설정하면 작업 svnsync속도를 크게 높일 수 있습니다. 특히 convert 명령에 잘못된 옵션이 있기 때문에 여러 번 수행해야 할 때 특히 그렇습니다.
Debilski

SVN 저장소의 로컬 사본이 있으면 이러한 모든 방법이 더 빠르다고 생각합니다. 그러나 항상 전체 저장소에 접근 할 수는 없습니까? svnsyncURL뿐만 아니라 리포지토리의 실제 파일에 액세스해야 한다고 생각했습니다 .
quark

hgsvn은 현재 유지 관리 모드 이므로 더 이상 적극적으로 개발되지 않습니다. 대신 hgsubversion을 사용하는 것이 좋습니다.
Jon L.

5

파일의 두 개정판 또는 현재 파일과 이전 개정판을 어떻게 비교합니까?

둘 다 사용 hg diff합니다. 언제hg diff 작업 사본 및 팁 (최신 커밋)에서의 모든 변경 사항을 사용 표시됩니다.

"파일의 두 개정판을 어떻게 비교합니까?"

$ hg diff -r{rev1} -r{rev2} {file.code}

위의 명령은 "file.code"의 rev1과 rev2가 다르게 표시됩니다.

"현재 파일과 이전 버전을 어떻게 비교합니까?"

$ hg diff {file.code}

위의 명령은 현재 버전의 "file.code"와 가장 최근의 개정판 (가장 최근에 커밋 된 버전)간에 다르게 표시됩니다.

:디


4

특정 파일 세트에 대해 특정 개정 세트를 '표시'하거나 '릴리스'하는 방법은 언제라도 나중에 가져올 수 있습니까?

$ hg tag my-tag

리포지토리를 복제하여 특수 태그 리포지토리 를 만들 수도 있습니다 .

$ hg clone working-repository my-tag-repository

3
왜 안돼 hg tag my-tag?
Steve Losh

4

어떻게 분기합니까?

$ hg 지점 내 지점

또는

$ hg 클론 원래 저장소 my-branch

브랜치 는 "가상"디렉토리를 생성 하지만 (즉, 파일은 동일하게 유지되지만 hg는 시스템 내에서 다른 것처럼 처리합니다) 클론 은 실제의 완전한 사본을 생성합니다. 엄밀히 말하면, 클론 은 분기되지 않습니다.


4
이것은 git 사람들이 추천을 위해 Mercurial 사람들을 항상 재미있게 만드는 헤비급 방법입니다. 초보자에게 가볍고 친숙한 방법은 다음과 같습니다.hg branch my-branch
Steve Losh

8
이 작업은 완전히 다른 두 가지 작업입니다.
stepancheg

2
: 나는 의욕에 분기에 도움이 될 수있는이 가이드 발견 stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial
mbillard

hg에서 영구적이지 않은 hg의 경량 브랜치 (
mergial

GoodEnough가 링크 한 기사는 책갈피를 사용하는 또 다른 간단한 방법을 제공합니다. 자체 브랜치가 필요하지 않은 변경 사항에는 꽤 좋습니다
Casebash

4

Mercurial을위한 좋은 GUI / IDE 플러그인?

GUI

  • 거의 모든 OS를위한 TortoiseHg Windows 탐색기 통합을 포함합니다. Linux와 Max OS X를 포함한 다른 OS에서도 작동합니다. 인터페이스가 다소 어색하고 처음에는 사용하기에 약간 어색하지만 매우 완벽하고 강력합니다.
  • Murky 는 Mac OS X 10.5 이상에서 실행됩니다. Murky는 저장소 및 기본 명령을 탐색하는 데 유용하지만 명령 행을 사용하는 방법도 알아야합니다.
  • MacHgMurky 보다 약간 더 기능적이고 세련된 Mac OS X Gui이지만 명령 행도 여전히 필요합니다.
  • SourceTree 는 원래 최근에 Windows 버전을 사용할 수있는 Mac 클라이언트입니다. 꽤 멋진 UI (적어도 OS X에서는)는 선반을 포함한 대부분의 Hg 기능을 지원합니다.

플러그인


3

변경 사항을 어떻게 커밋합니까?

현재 local * mercurial 저장소에서이 명령을 호출하십시오.

hg commit [OPTION]... [FILE]...

별명 : ci

  • 로컬 머큐리얼 리포지토리의 현재 디렉토리 안에 .hg가 있습니다.

옵션은 다음과 같습니다.

 -A --addremove     mark new/missing files as added/removed before committing
    --close-branch  mark a branch as closed, hiding it from the branch list
 -I --include       include names matching the given patterns
 -X --exclude       exclude names matching the given patterns
 -m --message       use <text> as commit message
 -l --logfile       read commit message from <file>
 -d --date          record datecode as commit date
 -u --user          record user as committer

명령 예는 다음과 같습니다.

hg commit -m "added readme" README

참고 사항 :

  • 파일 목록을 생략하면 "hg status"로보고 된 모든 변경 사항이 적용됩니다.
  • 병합 결과를 커밋하는 경우 파일 이름이나 -I / -X 필터를 제공하지 마십시오.
  • 커밋 메시지가 지정되지 않으면 구성된 편집기가 시작되어 메시지를 묻는 메시지를 표시합니다.

3

Mercurial을 설정하는 방법?

Mercurial은 구성 정보 ~/.hgrc를 * nix 시스템 및 %UserProfile%\mercurial.iniWindows 시스템에 저장합니다. ( %UserProfile%일반적 "C:\Documents and Settings\[username]\"으로 Windows 2000 또는 Windows XP 시스템에 있으며 일반적으로C:\Users\[username]\ Windows Vista 및 Windows 7 시스템에서.)

시작점으로 .hgrc또는에 다음을 입력하여 Mercurial 사용자 이름을 설정해야합니다 mercurial.ini.

# This is a Mercurial configuration file.
[ui]
username = Firstname Lastname <email.address@example.net>

Windows 시스템의 TortoiseHg 사용자는 대안으로 실행할 수 있습니다 hgtk userconfig

" Mercurial : The Definitive Guide "의 2 장에있는 " Mercurial 구성 파일 작성 "도 참조하십시오 .


3

지점을 어떻게 병합합니까?

$ cd repository-where-i-want-to merge
$ hg pull branch-i-want-to-merge
$ hg merge # if necessary

새로운 수은 사용자로서 그리고 일반적으로 소스 개정 관리를 처음 접하는 사람으로서 나는이 답변을 실제로 이해하지 못합니다. 게시물을 명확하게하고 확장 할 수 있습니까? 병합 명령을 사용하는 방법을 여전히 이해하지 못합니다.
Jamin Grey

3

Mercurial을 설치하는 방법?

Linux의 소스에서 설치했거나 Windows 설치 프로그램을 사용한 경우 멋지게 편집하십시오.

Mac OS X 10.4 (타이거), 10.5 (레오파드)

Python의 easy_install을 사용하십시오 ( Setuptools 사용 ).

sudo easy_install mercurial

최신 버전 (작성시 1.3.1)을 찾아 다음 위치에 설치합니다.

/Library/Frameworks/Python.framework/Versions/2.6/bin/

Python 2.6을 사용하면 Mercurial OS X 설치 프로그램 패키지 (2009 년 7 월 26 일 현재 1.2.1)에 Python 2.5가 필요하다는 불만이 제기됩니다. 에서 문서 , 핑크와 MacPorts를 버전 1.2을 설치하는 것이 나타납니다.

리눅스

대부분의 명시 적 Linux 패키지는 현재 버전보다 지연되는 것처럼 보이므로 easy_install (위와 같이)을 사용하거나 Mercurial tarball을 다운로드 하고 아카이브를 추출하고 수은 디렉토리로 변경 한 후 다음을 실행하십시오.

$ make
$ sudo make install    # do a system-wide install
$ hg debuginstall      # sanity check
$ hg                   # see help

( 분산 버전 제어 시스템 인 Mercurial 소개) )

윈도우

있다 의욕 최신 버전의 바이너리 패키지 . TortoiseHg 는 Mercurial을위한 Windows 셸 확장이며 설치합니다. 시그윈 은 Mercurial을 설치할 수도 있습니다.

또는 (여기에 너무 긴 지시 사항이 연결되어 있음) 소스에서 최적화 되거나 순수한 Python 버전의 Mercurial을 빌드 할 수 있습니다 .


1
소스로부터 수은을 구축하려면 파이썬 헤더가 필요합니다. 패키지 지향 배포판을 사용하는 경우 python-dev 또는 python-devel을 설치하십시오.
Nicolas Dumazet 2009

3

최신 코드는 어떻게 얻습니까?

Mercurial은 저장소가 (.hg / hgrc에서) 복제 된 위치를 기억하므로 간단하게 실행할 수 있습니다.

hg pull

원산지 저장소에서 최신 코드를 가져옵니다. (이것은 작업 디렉토리를 업데이트하지 않습니다)

hg update

작업 디렉토리를 업데이트합니다.

hg pull -u

풀과 업데이트를 동시에 수행합니다.


1
.hg/hgrc복제 는 원점을 기록 하므로 풀 / 푸시 할 때 원점 을 지정할 필요가 없습니다. 원하는 경우 [paths]섹션에 더 많은 경로를 추가 할 수 있습니다 .hg/hgrc.
Martin Geisler

3

코드를 어떻게 확인합니까?

hg clone [OPTION]... SOURCE [DEST]

옵션은 다음과 같습니다.

 -U --noupdate      the clone will only contain a repository (no working copy)
 -r --rev           a changeset you would like to have after cloning
    --pull          use pull protocol to copy metadata
    --uncompressed  use uncompressed transfer (fast over LAN)
 -e --ssh           specify ssh command to use
    --remotecmd     specify hg command to run on the remote side

여기서 source는 저장소에있는 원본 파일의 소스이며 원격 URL 또는 파일 시스템 디렉토리 일 수 있습니다. 예를 들면 다음과 같습니다.

대상은 로컬 파일 시스템에서 소스 코드가있는 곳입니다.


1

변경 사항을 어떻게 커밋합니까?

$ hg commit -m "Commit message"

1

푸시 할 때 어떤 변경 사항이 업스트림 저장소로 전송되는지 어떻게 알 수 있습니까?

hg outgoing기본 저장소로 설정 될 변경 세트 목록을 가져 오려면 사용하십시오 .

$ hg outgoing

실제 코드 변경을 얻으려면 -p( --patch)를 사용 하십시오. 그러면 각 변경 세트가 완전히 출력됩니다.

$ hg outgoing -p

1

저장소에서 파일을 어떻게 제거합니까?

저장소에서 파일을 제거하고 다음 커밋에서 파일을 삭제하려면 다음을 수행하십시오.

$ hg remove {file(s)}

저장소에서 파일을 제거하지만 삭제하지 않은 파일

$ hg remove -Af {file(s)}

또는 Mercurial 1.3에서

$ hg forget {file(s)}

1

이전 버전의 코드로 돌아가려면 어떻게합니까?

에서 이 질문에

$ hg update [-r REV]

@van : 나중에 커밋하면 효과적으로 새 브랜치를 만들게됩니다. 그런 다음이 분기에서만 계속 작업하거나 기존 분기를 병합 할 수 있습니다.


1

변경 세트를 어떻게 되돌 립니까?

사용 가능한 몇 가지 옵션

쉬운 방법 (단일 변경 세트 철회)

$ hg backout -m 'back out second change' tip
reverting myfile
changeset 2:01adc4672142 backs out changeset 1:7e341ee3be7a
$ cat myfile
first change

어려운 방법 (수동으로 차이 적용)

1 단계 : 패치 파일을 작성하여 개정판 107과 108 사이에서 변경된 사항을 되돌립니다.

hg diff -r107 -r108 --reverse  > revert-change.patch

(또는 --reverse가없는 hg diff -r108 -r107은 동일한 기능을 수행합니다)

2 단계 : 패치 파일을 적용하십시오.

patch -p1 < revert-change.patch

diff 중 일부는 적용되지 않을 수 있습니다. 예를 들면 다음과 같습니다.

Hunk #3 FAILED at 517.
1 out of 3 hunks FAILED -- saving rejects to file 'foo/bar.c.rej'

.rej 파일에는 적용에 실패한 diff의 내용이 포함되어 있으므로 살펴 봐야합니다.


1
이것이 무엇 hg backout입니까?
Wim Coenen

예, 그러나 hg 백 아웃은 단일 변경 세트 ID에서 백 아웃까지만 지원합니다. 확실히 언급해야하며, 이에 따라 업데이트됩니다
slf

1

파일 또는 리포지토리의 수정 내역을 어떻게 알 수 있습니까?

전체 저장소 또는 파일의 개정 내역을 표시하려면

$ hg log {file(s)}

또는

$ hg history {file(s)}

목록을 역순 으로 보려면

$ hg log -r:

1

한 지점의 일부를 다른 지점으로 병합하는 방법은 무엇입니까?

.hg / hgrc에서 '이식'확장을 활성화하십시오

[extensions]
transplant=

대상 분기를로드 한 다음 대상 개정을 이식하십시오.
예 : 분기 'foo'에서 현재 분기로 cherry pick 개정 81

$ hg transplant -b foo 81

최신 버전의 Mercurial은 이식 확장이 필요하지 않습니다. 내장 graft명령을 사용하여 동일한 작업을 수행 할 수 있습니다 . hg help graft더 많은 정보를 원하시면
DOOManiac

1

특정 변경 세트에서 패치를 어떻게 추출합니까?

$ hg export -o patchfile changeset

그런 다음 다음을 사용하여 다른 지점으로 가져올 수 있습니다.

$ hg import patchfile
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.