Mercurial初学者:最终实用指南

灵感来自初学者Git:权威的实用指南

这是一个关于在初学者中为实用使用Mercurial的信息汇编。

初学者——一个接触过源代码控制却没有很好地理解它的程序员。

实用——涵盖大多数用户经常遇到的情况——创建存储库、分支、合并、从远程存储库拉/推到远程存储库等等。

笔记:

  • 解释如何完成某事,而不是解释某事是怎样的 李实现。< / >
  • 回答一个问题。
  • 回答清楚,尽可能简洁。
  • 编辑/扩展现有的答案,而不是在 李相同话题。< / >
  • 请为想了解更多的人提供Mercurial维基HG的书的链接。

问题:

安装/设置

使用代码

标记、分支、发布、基线

其他

其他Mercurial参考资料

32895 次浏览

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

$ hg init my-repository

你如何分支?

$ hg分支我的分支

复制my-branch

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

如何合并分支?

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

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

Ignore是在存储库根目录中一个名为.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

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

你如何“标记”、“标记”或“发布”一组特定文件的特定修订,以便以后总是可以提取它?

$ hg tag my-tag

你也可以克隆你的存储库来创建一个特殊的标签存储库。

$ hg clone working-repository my-tag-repository

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

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

$ hg status

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

  • M -修改。文件已被更改,但更改尚未提交。
  • A -新增。之前没有跟踪该文件,但如果提交,Mercurial将开始跟踪它。
  • R -删除。该文件以前被跟踪过,但是如果您提交了,Mercurial将在这次和将来的提交中停止跟踪它。
  • ? -未知。Mercurial目前没有跟踪该文件。提交对它没有任何影响,除非你使用hg add来添加它。
  • ! -失踪。该文件已被跟踪,但Mercurial无法在工作副本中找到它。

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

$ hg diff

如何安装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安装包(截至2009年7月26日为1.2.1)抱怨它需要Python 2.5的问题。在的文档中,Fink和Macports似乎安装了1.2版本。

Linux

大多数显式Linux包似乎落后于当前版本,因此使用easy_install(如上所述)或下载的压缩文件,提取存档,更改到mercurial目录,并运行:

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

(从介绍Mercurial,一个分布式版本控制系统)

窗户

有一个最新版本Mercurial的二进制包TortoiseHg是Mercurial的Windows shell扩展。Cygwin也可以安装Mercurial。

或者(说明太长,所以在这里链接),你可以从源代码构建一个优化的纯Python版本的Mercurial。

如何获得最新的代码?

Mercurial会记住存储库是从哪里克隆的(在.hg/hgrc中),所以你可以简单地运行:

hg pull

从原始存储库中提取最新的代码。(这不会更新工作目录)

hg update

更新工作目录。

hg pull -u

同时执行拉取和更新。

如何与Subversion交互?

有三种方法:


转换扩展将把一个现有的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存储库(有点像pull)。但是,它不支持获取Mercurial的修订并将它们发送回Subversion(不推送)。[XXX:如有错误请纠正]


hgsubversion扩展。它在许多方面都是最复杂的解决方案,因为它使用Subversion API与Subversion存储库通信。它的目标是成为 hg-svn桥接器。它允许完全往返的修订(完全克隆,拉,推),然而,在撰写本文时,[XXX:如果/当它不正确时修改它]仍在开发中,还没有正式发布。因此,它只能在最新的Mercurial(在撰写本文时为1.3)上工作。

  • 它映射标记和分支(在所有标记之前用tags/来区分它们和等价命名的分支)。
  • 它维护了一个特殊的分支closed-branches来关闭在Subversion中被移除的分支。
  • 根据trunk/branches/tags的约定来布局Subversion存储库是需要
  • 命令集通常是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

如何签出代码?

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或文件系统目录。例如:

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

如何提交更改?

$ hg commit -m "Commit message"

如何提交更改?

从当前本地* mercurial存储库调用此命令

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

别名:词

  • 本地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过滤器。
  • 如果未指定提交消息,则启动已配置的编辑器以提示您输入消息。

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

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

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

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

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

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

$ hg diff {file.code}

上面的命令将显示不同的“文件”的当前版本。代码”和最新的修订(最新提交的)。

:D

如何设置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

另见“Mercurial:权威指南”的第二章中的“创建Mercurial配置文件”。

好的GUI/IDE插件Mercurial?

GUI

  • TortoiseHg适用于任何操作系统。包括Windows资源管理器集成。它也适用于Linux和其他一些操作系统,包括Max OS x。它有一个有点笨拙的界面,刚开始使用时有点笨拙,但它非常完整和强大。
  • 黑暗的运行在Mac OS X 10.5或更高版本上。dark很适合探索存储库和基本命令,但您还需要知道如何使用命令行。
  • MacHg是一个很好的Mac OS X Gui,它比dark有更多的功能和优化,但你仍然需要它的命令行。
  • SourceTree最初是一个Mac客户端,最近才有了Windows版本。非常漂亮的用户界面(至少在OS X上),支持大多数Hg功能,包括搁置。

插件

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

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

$ hg outgoing

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

$ hg outgoing -p

如何查看文件或存储库的修订历史?

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

$ hg log {file(s)}

$ hg history {file(s)}

请按倒序排列

$ hg log -r:

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

从存储库中删除一个文件,并在下次提交时删除它:

$ hg remove {file(s)}

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

$ hg remove -Af {file(s)}

或从Mercurial 1.3

$ hg forget {file(s)}

如何恢复变更集?

有几个选项

简单方法(撤销单个更改集)

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

Hard Way(手动区分和应用)

步骤1:创建一个补丁文件来恢复版本107和108之间的更改:

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

(或者,hg diff -r108 -r107加上no——reverse也会做同样的事情)

步骤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文件将包含应用失败的diff的内容,您需要查看一下。

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

这个问题

$ hg update [-r REV]

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

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

$ hg export -o patchfile changeset

然后你可以导入到另一个分支:

$ hg import patchfile

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

在。hg/hgrc中启用“移植”扩展名

[extensions]
transplant=

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

$ hg transplant -b foo 81