初学者水银:最终实用指南
受初学者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: glob
或syntax: 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-branches
closures在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]\
。
作为一个起点,您应该在.hgrc
或mercurial.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或文件系统目录。 例如:
- http://bitbucket.org/scrum8/django-wmd-editor/
- /家/用户名/库/ Django的大规模毁灭性武器 – 编辑/
- SSH://myusername@scrum8.com/~/repository/django-wmd-editor/
目的地是源代码将在您的本地文件系统中的位置。
你如何做出改变?
$ 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