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

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

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

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

注: 解释如何完成某件事,而不是解释某件事是怎样的 实现的。 回答一个问题。 回答清楚,尽可能简洁。 上编辑/扩展现有答案,而不是创建新答案 同样的话题。 请为想了解更多的人提供Mercurial wiki或HG Book的链接。

问题:

安装/设置

如何安装Mercurial? 如何设置Mercurial? 如何创建一个新的项目/存储库? 如何将其配置为忽略文件?

使用代码

How do you get the latest code? How do you check out code? How do you commit changes? How do you see what's uncommitted, or the status of your current codebase? How do you remove files from the repository? How do you destroy unwanted commits? How do you compare two revisions of a file, or your current file and a previous revision? How do you see the history of revisions to a file or repository? How do you handle binary files (visio docs, for instance, or compiler environments)? How do you merge files changed at the "same time"? How do you revert a Changeset? How do you go back to a previous version of the code? How do you extract a patch from a specific changeset? How do you record that you renamed or deleted a file without using the Mercurial command?

标记、分支、发布、基线

你如何“标记”、“标记”或“发布”一组特定文件的特定修订,以便以后总是可以提取它? 你如何进行特定的“释放”? 你如何分支? 如何合并分支? 如何将一个分支的部分合并到另一个分支中?

其他

好的GUI/IDE插件Mercurial?优点/缺点? 还有其他初学者应该知道的常见任务吗? 如何与Subversion交互?

其他Mercurial参考资料

Mercurial:权威指南 Mercurial维基 满足Mercurial |偷窥码屏幕播放 掌握Mercurial | TekPub屏幕播放 Hg初始化-接地水银教程


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

$ hg init my-repository

你如何分支?

$ hg分支我的分支

or

复制my-branch

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


如何合并分支?

$ 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: glob或syntax: 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 - Modified. The file has been changed and the changes have not been committed. A - Added. The file was not tracked before, but if you commit Mercurial will begin tracking it. R - Removed. The file was tracked before, but if you commit Mercurial will cease tracking it in this and future commits. ? - Unknown. The file is not currently tracked by Mercurial. Committing will have no effect on it unless you use hg add to add it. ! - Missing. The file was tracked but Mercurial cannot find it in the working copy.

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

$ 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 tarball,提取存档,切换到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交互?

有三种方法:


convert扩展将把一个现有的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:如有错误请纠正]。


The hgsubversion extension. It is in many ways the most sophisticated solution as it uses the Subversion API to communicate with the Subversion repository. It aims to become the hg-svn bridge. It allow full round-tripping of revisions (full clone, pull, and push), However as of this writing [XXX: Amend this if/when it becomes incorrect] it is still in development and there are not yet official releases. As a consequence it works with only the most up-to-date Mercurial (1.3 as of this writing).

It maps tags and branches (preceding all tags with tags/ to distinguish them from equivalently named branches). It maintains a special branch closed-branches for closing off branches which are removed in Subversion. It requires that the Subversion repository be laid out according to the convention of trunk/branches/tags. The command set is typically hg svn <subcommand> though it aims at being integrated to the point that you don't need the 'svn' part (i.e. it wants to treat a Subversion clone as much as possible like any other Mercurial repository).;

它是这样工作的:

克隆:

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实用程序(位桶树)。直到最近,这只允许您克隆和提取Subversion存储库,但从hgsvn 0.1.7开始,它支持推送。我不知道它推力有多大。任何有经验的人都应该更新这个。它有以下显著特点:

It generates a Mercurial tag for every SVN tag. It puts a local tag on every changeset to mark its SVN revision. It puts every Mercurial revision on a named branch named after its SVN branch. For example branches/some-feature would be like hg branch some-feature. It puts the trunk on trunk (i.e. nothing is on the Mercurial default branch, unless the user explicitly switches to it.) It will try to identify branches and tags, and create them but if it can't it just skips them. This is handy when the Subversion repository is not following the conventional trunk/branches/tags layout.

它是这样工作的:

克隆:

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

http://bitbucket.org/scrum8/django-wmd-editor/ /home/username/repository/django-wmd-editor / ssh: / / myusername@scrum8.com/ ~ /仓库/ django-wmd-editor /

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


如何提交更改?

$ hg commit -m "Commit message"

如何提交更改?

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


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

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

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

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

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

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

$ hg diff {file.code}

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

:D


如何设置Mercurial?

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

首先,你应该在你的.hgrc或mercury .ini中设置你的Mercurial用户名:

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

Windows系统上的TortoiseHg用户也可以执行hgtk userconfig命令

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


好的GUI/IDE插件Mercurial?

GUI

TortoiseHg for just about any OS. Includes Windows Explorer integration. It also works in Linux and a few other OS:es including Max OS X. It has a somewhat clunky interface and is a little awkard to use at first, but it is very complete and powerful. Murky runs on Mac OS X 10.5 or later. Murky is good for exploring the repository and basic commands, but you will need to know how to use the command line as well. MacHg is a nice Mac OS X Gui that has a little more functionality and polish than Murky, but you will still need the command line with it as well. SourceTree is a Mac client originally, with a Windows version available just recently. Pretty nice UI (at least on OS X), supports majority of Hg features, including shelve.

插件

VisualHG for Visual Studio HgSccPackage for Visual Studio 2008/2010 mercuraleclipse for Eclipse 对NetBeans的Mercurial支持 Mercurial对Sublime Text的支持


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

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

$ hg outgoing

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

$ hg outgoing -p

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

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

$ hg log {file(s)}

or

$ 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也会做同样的事情)

第二步:应用补丁文件:

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