灵感来自Git for beginners: The definitive practical guide。
这是有关使用Mercurial为初学者进行实用使用的信息的汇编。
初学者 - 一个已经触及源代码控制而不太了解它的程序员。
实用 - 涵盖大多数用户经常遇到的情况 - 创建存储库,分支,合并,从/向远程存储库提取/推送等等。
备注:
- 解释如何完成某些事情而不是某些事情 实现。
- 每个答案处理一个问题。
- 尽可能简明扼要地回答。
- 编辑/扩展现有答案,而不是在答案上创建新答案 同一主题。
- 请为想要了解详情的人提供指向Mercurial wiki或HG Book的链接。
问题:
答案 0 :(得分:16)
忽略是在存储库根目录中名为.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
忽略仅适用于非托管文件(即尚未签入的文件)。要忽略受版本控制的文件,可以使用开关-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)
有三种方式:
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中删除的分支。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
开始它支持推送。 [我不知道好它是如何推动的。任何具有更多经验的人都应该更新。]它具有以下显着特征:
branches/some-feature
就像hg branch some-feature
。它将主干放在trunk
上(即Mercurial默认分支上没有任何内容,除非用户明确切换到它。)它的工作原理如下:
克隆:
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)
答案 7 :(得分:4)
$ hg tag my-tag
您还可以克隆存储库以创建特殊的标记存储库。
$ hg clone working-repository my-tag-repository
答案 8 :(得分:3)
从当前的本地* mercurial存储库
调用此命令hg commit [OPTION]... [FILE]...
别名:ci
选项可以是:
-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
备注强>:
答案 9 :(得分:3)
Mercurial将其配置信息存储在* nix系统上的~/.hgrc
和Windows系统上的%UserProfile%\mercurial.ini
中。 (%UserProfile%
在Windows 2000或Windows XP系统上通常为"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
另请参阅“Creating a Mercurial configuration file的chapter 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)
如果您已在Linux上从源代码安装或使用Windows安装程序,请编辑得很好。
使用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软件包似乎都落后于当前版本,因此请使用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 Mercurial。 TortoiseHg是一个Windows shell扩展,用于安装Mercurial。 Cygwin也可以安装Mercurial。
或者(此处链接的说明过于冗长),您可以从源代码build an optimised或pure 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)
$ 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