初学者水银:最终实用指南

受初学者Git的启发:明确的实践指南 。

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

初学者 – 一个没有很好地理解源代码控制的程序员。

实用 – 覆盖大多数用户经常遇到的情况 – 创build一个存储库,分支,合并,从远程存储库拉出/推送等等。

备注

  • 解释如何完成某件事情,而不是如何实施。
  • 每个答案处理一个问题。
  • 尽可能清楚,简洁地回答。
  • 编辑/扩展现有的答案,而不是在同一主题上创build一个新的答案。
  • 请提供Mercurial wiki或HG Book的链接,供希望了解更多信息的人使用。

问题:

安装/设置

  • 如何安装Mercurial?
  • 如何设置Mercurial?
  • 你如何创build一个新的项目/存储库?
  • 你如何configuration它忽略文件?

使用代码

  • 你如何得到最新的代码?
  • 你如何检查代码?
  • 你如何做出改变?
  • 您如何看待未提交的内容或当前代码库的状态?
  • 你如何从存储库中删除文件?
  • 你如何销毁不需要的提交?
  • 如何比较文件的两个版本,或者你当前的文件和以前的版本?
  • 你如何看到修改文件或存储库的历史?
  • 你如何处理二进制文件(如visio文档,或编译环境)?
  • 如何合并在“同一时间”更改的文件?
  • 你如何恢复Changeset?
  • 你如何回到以前版本的代码?
  • 如何从特定的变更集中提取补丁?
  • 你如何logging你重命名或删除一个文件,而不使用Mercurial命令?

标记,分支,发布,基线

  • 你如何为一组特定的文件“标记”或“释放”一组特定的修订版本,以便以后随时可以修改这些修订版本?
  • 你如何拉一个特定的“释放”?
  • 你如何分支?
  • 你如何合并分支机构?
  • 你如何将一个分支的部分合并到另一个分支?

其他

  • 良好的Mercurial GUI / IDE插件? 优点缺点?
  • 初学者应该知道的其他常见任务?
  • 我如何与Subversion进行交互?

其他Mercurial参考

  • Mercurial:权威指南
  • Mercurial Wiki
  • 见Mercurial | Peepcode Screencast
  • 掌握Mercurial | TekPub Screencast
  • 汞初始 – 基础水银教程

你如何configuration它忽略文件?

忽略configuration在一个名为.hgignore的普通文本文件中。 添加它就像一个正常的文件与:

hg add .hgignore 

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

您可以添加评论#

例:

 # python temporary files syntax: glob *.pyc #editor autosaves *~ # temporary data syntax: regexp temp 

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

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

要查看已更改的文件列表,请执行以下操作:

 $ hg status 

这将打印每个已经被改变的文件及其状态,其中可以包括:

  • M – 已修改。 该文件已被更改,更改没有被提交。
  • A – 已添加。 该文件之前没有被跟踪,但如果你提交Mercurial将开始跟踪它。
  • R – 删除。 之前跟踪过该文件,但如果您提交了Mercurial将停止跟踪它在这个和未来的提交。
  • ? – 未知。 该文件目前不被Mercurial跟踪。 提交不会影响它,除非你使用hg add添加它。
  • ! – 失踪。 该文件被跟踪,但Mercurial无法find它的工作副本。

要查看对文件实际进行的更改,请执行以下操作:

 $ hg diff 

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

 $ hg init my-repository 

我如何与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:纠正这个,如果它是错误的]


hgsubversion扩展 。 在很多方面,它是使用Subversion API与Subversion版本库进行通信的最复杂的解决scheme。 它的目标是成为hg-svn桥梁。 它允许完整的修改版本(完全克隆,拉和推),但是在写这篇文章时[XXX:修改这个如果/当它变得不正确]它仍然在开发中,还没有正式版本。 因此,它仅适用于最新的Mercurial(本文中为1.3)。

  • 它映射标签和分支(在所有带有tags/以区别于同名的分支)。
  • 它维护一个特殊的分支closed-branchesclosures在Subversion中删除的分支。
  • 要求 Subversion版本库按照trunk / branches / tags的约定进行布局。
  • 命令集通常是hg svn <subcommand>尽pipe它的目的是集成到你不需要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它支持push。 [我不知道推得多好。 有更多经验的人应该更新这个。]它有以下显着的特点:

  • 它为每个SVN标签生成一个Mercurial标签。
  • 它在每个变更集上放置一个本地标签来标记其SVN版本。
  • 它将每个Mercurial修订版放在以SVN分支命名的命名分支上。 例如branches/some-feature就像hg branch some-feature 。 它把树干放在trunk (即没有任何东西在Mercurial默认分支上,除非用户明确地切换到它。)
  • 它会尝试识别分支和标签,并创build它们,但如果它不能只是跳过它们。 当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 

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

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

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

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

上面的命令会显示“file.code”的rev1和rev2之间的区别。

对于“你如何比较你的当前文件和以前的修订?”

 $ hg diff {file.code} 

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

:d

你如何为一组特定的文件“标记”或“释放”一组特定的修订版本,以便以后随时可以修改这些修订版本?

 $ hg tag my-tag 

你也可以克隆你的仓库来创build一个特殊的标签仓库。

 $ hg clone working-repository my-tag-repository 

你如何分支?

$ hg分支我的分支

要么

$ hg clone original-repository my-branch

尽pipe应该注意到, 分支创build了一个“虚拟”目录(即,文件保持不变,但是hg把它们看作是在系统内部是不同的),而克隆创build一个实际的,完整的副本。 严格来说, 克隆不是分支的。

良好的Mercurial GUI / IDE插件?

GUI

  • TortoiseHg几乎任何操作系统。 包括Windows资源pipe理器集成 它也适用于Linux和一些其他操作系统:包括Max OS X.它有一个有点笨重的界面,起初使用起来有点不方便,但它非常完整和强大。
  • Murky在Mac OS X 10.5或更高版本上运行。 Murky非常适合探索存储库和基本命令,但是您还需要知道如何使用命令行。
  • MacHg是一个不错的Mac OS X Gui,它比Murky有更多的function和优化,但是你仍然需要命令行。
  • SourceTree最初是一个Mac客户端,最近刚推出了一个Windows版本。 相当漂亮的用户界面(至less在OS X上),支持大部分的汞function,包括搁置。

插件

  • VisualHG for Visual Studio
  • 用于Visual Studio 2008/2010的HgSccPackage
  • Eclipse的MercurialEclipse
  • Mercurial支持 NetBeans
  • Mercurial支持崇高的文本

你如何做出改变?

从当前的本地* mercurial存储库调用这个命令

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

别名:ci

  • 当前目录中有一个本地的mercurial仓库.hg

在哪里可以select:

  -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 / -Xfilter。
  • 如果未指定提交消息,则启动configuration的编辑器以提示您input消息。

如何设置Mercurial?

Mercurial将其configuration信息存储在* nix系统上的~/.hgrc以及Windows系统上的%UserProfile%\mercurial.ini中。 (在Windows 2000或Windows XP系统上, %UserProfile%通常是"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:权威指南 ” 第2章中的 “ 创buildMercurialconfiguration文件 ”。

你如何合并分支机构?

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

如何安装Mercurial?

如果您已经从Linux上的源代码安装,或者使用Windows安装程序,请进行良好的编辑。

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

使用Python的easy_install(使用Setuptools ):

 sudo easy_install mercurial 

这find最新版本(在写作时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的Windowsshell扩展。 Cygwin也可以安装Mercurial。

或者(这里的指令太冗长了),您可以从源代码构build Mercurial 的优化或纯Python版本。

你如何得到最新的代码?

Mercurial会记住从(在.hg / hgrc中)克隆存储库的位置,因此您可以简单地运行:

 hg pull 

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

 hg update 

更新工作目录。

 hg pull -u 

同时执行一个拉和更新。

你如何检查代码?

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

在哪里可以select:

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

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

你如何做出改变?

 $ hg commit -m "Commit message" 

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

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

 $ hg outgoing 

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

 $ hg outgoing -p 

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

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

 $ hg remove {file(s)} 

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

 $ hg remove -Af {file(s)} 

或来自Mercurial 1.3

 $ hg forget {file(s)} 

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

从这个问题

 $ hg update [-r REV] 

@van:如果以后你提交了,你将有效地创build一个新的分支。 那么你可能会继续在这个分支上工作,或者最终将现有的合并到它。

你如何恢复Changeset?

有几个选项可用

简单的方法(退出单个更改集)

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

硬道(手动差异和应用)

步骤1 :创build一个补丁文件来恢复在版本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文件将包含未能应用的diff的内容,您需要查看一下。

你如何看到修改文件或存储库的历史?

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

 $ hg log {file(s)} 

要么

 $ hg history {file(s)} 

并以相反的顺序查看列表

 $ hg log -r: 

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

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

 [extensions] transplant= 

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

 $ hg transplant -b foo 81 

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

 $ hg export -o patchfile changeset 

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

 $ hg import patchfile