Mercurial for Beginners:The Definitive Practical Guide

时间:2009-07-23 08:06:09

标签: version-control mercurial

灵感来自Git for beginners: The definitive practical guide

这是有关使用Mercurial为初学者进行实用使用的信息的汇编。

初学者 - 一个已经触及源代码控制而不太了解它的程序员。

实用 - 涵盖大多数用户经常遇到的情况 - 创建存储库,分支,合并,从/向远程存储库提取/推送等等。

  

备注

     
      
  • 解释如何完成某些事情而不是某些事情   实现。
  •   
  • 每个答案处理一个问题。
  •   
  • 尽可能简明扼要地回答。
  •   
  • 编辑/扩展现有答案,而不是在答案上创建新答案   同一主题。
  •   
  • 请为想要了解详情的人提供指向Mercurial wikiHG Book的链接。
  •   

问题:

安装/设置

使用代码

标记,分支,发布,基线

其他

其他Mercurial参考

22 个答案:

答案 0 :(得分:16)

如何将其配置为忽略文件?

忽略是在存储库根目录中名为.hgignore的普通文本文件中配置的。添加它就像普通文件:

hg add .hgignore

有两种语法选项可用于文件匹配,glob和regexp。 glob是类似unix的文件名扩展,regexp是正则表达式。您可以通过在一行上添加syntax: globsyntax: regexp来激活每个。之后的所有行将使用该语法,直到下一个语法标记。您可以拥有任意数量的语法标记。默认语法是regexp,因此如果您只使用regexp,则不需要任何语法标记。

您可以使用#

添加评论

示例:

# python temporary files
syntax: glob
*.pyc

#editor autosaves
*~

# temporary data
syntax: regexp
temp

忽略仅适用于非托管文件(即尚未签入的文件)。要忽略受版本控制的文件,可以使用开关-I和-X。

答案 1 :(得分:7)

您如何看待未提交的内容或当前代码库的状态?

要查看已更改的文件列表:

$ hg status

这将打印已更改的每个文件及其状态,其中包括:

  • M - 已修改。该文件已更改,并且尚未提交更改。
  • A - 已添加。之前未跟踪该文件,但如果您提交,Mercurial将开始跟踪它。
  • R - 删除了。该文件之前已被跟踪,但如果您提交,Mercurial将在此提交和将来的提交中停止跟踪它。
  • ? - 未知。 Mercurial目前未跟踪该文件。除非您使用hg add添加它,否则提交将不会对其产生任何影响。
  • ! - 失踪。该文件已被跟踪,但Mercurial无法在工作副本中找到它。

要查看实际对文件所做的更改:

$ hg diff

答案 2 :(得分:6)

如何创建新项目/存储库?

$ hg init my-repository

答案 3 :(得分:5)

如何比较文件的两个版本,或者您当前的文件和以前的版本?

两者都使用hg diff。使用hg diff时,将显示工作副本和提示(最新提交)中的所有更改。

对于“如何比较文件的两个修订版?”

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

上面的命令将在“file.code”的rev1和rev2之间显示不同。

对于“您如何比较当前文件和以前的版本?”

$ hg diff {file.code}

上面的命令将显示当前版本的“file.code”和最新版本(最新提交的)之间的不同。

:d

答案 4 :(得分:5)

如何与Subversion接口?

有三种方式:


convert extension将现有的Subversion存储库克隆为Mercurial存储库。它与Mercurial一起提供。它的工作方式大致如下:

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 extension。它在很多方面都是最复杂的解决方案,因为它使用Subversion API与Subversion存储库进行通信。它旨在成为 hg-svn桥。它允许完全舍入修改(完全克隆,拉动和推动),但在撰写本文时 [XXX:如果/当它变得不正确时修改此项目它仍在开发中并且有尚未正式发布。因此,它只适用于最新的Mercurial(撰写本文时为1.3)。

  • 它映射标记和分支(在tags/的所有标记之前,以区别于等效命名的分支)。
  • 它维护一个特殊的分支closed-branches,用于关闭在Subversion中删除的分支。
  • 要求根据trunk / branches / tags的惯例布置Subversion存储库。
  • 命令集通常是hg svn <subcommand>,但它的目的是集成到你不需要'svn'部分的位置(即它想要尽可能多地处理Subversion克隆,就像任何其他Mercurial一样)库);

它的工作原理如下:

克隆:

hg svnclone <Subversion URL> 

OR(仅适用于svn://个网址)

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 tree)。直到最近,这只允许您克隆并提取Subversion存储库,但从hgsvn 0.1.7开始它支持推送。 [我不知道它是如何推动的。任何具有更多经验的人都应该更新。]它具有以下显着特征:

  • 它为每个SVN标记生成一个Mercurial标记。
  • 它在每个变更集上放置一个本地标记,以标记其SVN版本。
  • 它将每个Mercurial修订版放在以其SVN分支命名的命名分支上。例如branches/some-feature就像hg branch some-feature。它将主干放在trunk上(即Mercurial默认分支上没有任何内容,除非用户明确切换到它。)
  • 它将尝试识别分支和标签,并创建它们,但如果它不能,则只是跳过它们。当Subversion存储库不遵循传统的trunk / branches / tags布局时,这很方便。

它的工作原理如下:

克隆:

hgimportsvn <Subversion URL>

拉​​:

hgpullsvn

推:

hgpushsvn

传入:

hgpullsvn -n

传出:

hgpushsvn -n

签出整个存储库:

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

只检查行李箱:

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

答案 5 :(得分:4)

你如何分支?

$ hg branch my-branch

$ hg clone original-repository my-branch

虽然应该注意分支创建一个“虚拟”目录(即文件保持不变,但是hg将它们视为系统内部不同),而 clone 创建一个实际的完整副本。严格来说,克隆不是分支。

答案 6 :(得分:4)

Mercurial的优秀GUI / IDE插件?

GUI

  • TortoiseHg适用于任何操作系统。包括Windows Explorer集成。它也适用于Linux和其他一些操作系统:包括Max OS X.它有一个有点笨重的界面,起初有点笨拙,但它非常完整和强大。
  • Murky在Mac OS X 10.5或更高版本上运行。 Murky非常适合探索存储库和基本命令,但您还需要知道如何使用命令行。
  • MacHg是一个不错的Mac OS X Gui,它比Murky具有更多的功能和润色,但你仍然需要它的命令行。
  • SourceTree最初是Mac客户端,最近才提供Windows版本。相当不错的UI(至少在OS X上)支持大多数Hg功能,包括搁置。

插件

答案 7 :(得分:4)

如何'标记'或'释放'特定文件集的特定修订集,以便您以后可以随时提取该文件?

$ hg tag my-tag

您还可以克隆存储库以创建特殊的标记存储库。

$ hg clone working-repository my-tag-repository

答案 8 :(得分:3)

您如何提交更改?

从当前的本地* mercurial存储库

调用此命令
hg commit [OPTION]... [FILE]...

别名:ci

  • 本地mercurial存储库在当前目录中有.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过滤器。
  • 如果未指定提交消息,则会启动已配置的编辑器以提示您输入消息。

答案 9 :(得分:3)

如何设置Mercurial?

Mercurial将其配置信息存储在* nix系统上的~/.hgrc和Windows系统上的%UserProfile%\mercurial.ini中。 (%UserProfile%在Windows 2000或Windows XP系统上通常为"C:\Documents and Settings\[username]\",在Windows Vista和Windows 7系统上通常为C:\Users\[username]\。)

首先,您应该在.hgrcmercurial.ini中添加以下内容来设置您的Mercurial用户名:

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

Windows系统上的TortoiseHg用户也可以运行hgtk userconfig

另请参阅“Creating a Mercurial configuration filechapter 2中的”Mercurial: The Definitive Guide“。

答案 10 :(得分: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或文件系统目录。例如:

目标是源代码在本地文件系统中的位置。

答案 11 :(得分:3)

您如何获得最新代码?

Mercurial会记住克隆存储库的位置(在.hg / hgrc中),因此您只需运行:

hg pull

从origin-repository中提取最新代码。 (这不会更新工作目录)

hg update

更新工作目录。

hg pull -u

一次执行pull和update。

答案 12 :(得分:3)

如何安装Mercurial?

如果您已在Linux上从源代码安装或使用Windows安装程序,请编辑得很好。

Mac OS X 10.4(Tiger),10.5(Leopard)

使用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 installer package(截至2009年7月26日的1.2.1)抱怨它需要Python 2.5。从the documentation开始,Fink和Macports似乎安装了1.2版本。

的Linux

大多数显式Linux软件包似乎都落后于当前版本,因此请使用easy_install(如上所述)或下载Mercurial tarball,解压缩存档,更改为mercurial目录,然后运行:

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

(来自Introducing Mercurial, a distributed version control system

有一个binary package of the latest version of MercurialTortoiseHg是一个Windows shell扩展,用于安装Mercurial。 Cygwin也可以安装Mercurial。

或者(此处链接的说明过于冗长),您可以从源代码build an optimisedpure Python版本的Mercurial。

答案 13 :(得分:3)

如何合并分支?

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

答案 14 :(得分:1)

您如何提交更改?

$ hg commit -m "Commit message"

答案 15 :(得分:1)

您如何看到在推送时将向上游存储库发送哪些更改?

使用hg outgoing获取将设置为默认存储库的变更集列表:

$ hg outgoing

要获取实际的代码更改,请使用-p--patch)。这将完整输出每个变更集:

$ hg outgoing -p

答案 16 :(得分:1)

您如何看待文件或存储库的修订历史记录?

显示整个存储库或文件的修订历史记录

$ hg log {file(s)}

$ hg history {file(s)}

see the list in reverse order

$ hg log -r:

答案 17 :(得分:1)

如何从存储库中删除文件?

从存储库中删除文件,并在下次提交时将其删除:

$ hg remove {file(s)}

从存储库中删除文件,但不删除该文件

$ hg remove -Af {file(s)}

或来自Mercurial 1.3

$ hg forget {file(s)}

答案 18 :(得分: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

(或者,没有 - 反向的hg diff -r108 -r107会做同样的事情)

第2步:应用补丁文件:

patch -p1 < revert-change.patch

某些差异可能无法应用,例如:

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

.rej文件将包含无法应用的差异内容,您需要查看。

答案 19 :(得分:1)

您如何回到以前版本的代码?

来自this question

$ hg update [-r REV]

@van:如果稍后提交,您将有效地创建一个新分支。然后,您可以继续仅在此分支上工作,或者最终将现有分支合并到其中。

答案 20 :(得分:1)

如何从特定变更集中提取补丁?

$ hg export -o patchfile changeset

然后您可以使用以下命令将其导入另一个分支:

$ hg import patchfile

答案 21 :(得分:1)

如何将一个分支的部分合并到另一个分支?

在.hg / hgrc

中启用'移植'扩展程序
[extensions]
transplant=

加载目标分支然后移植目标修订版 例如:樱桃挑选修订版81从分支'foo'进入当前分支

$ hg transplant -b foo 81