Git最常见的Mercurial命令的等效项?


89

我一直在使用Mercurial,但想快速演示一下Git。

什么是Git等效项:

hg init . # start a project in the current directory
hg addremove # look for any added or deleted files
hg commit -m "comment" # commit any uncomitted changes
hg status # what have i changed since the last commit?

3
我很想看到一张表格,其中至少在流行的DVCS之间显示了所有等效命令,如果有人在这里提出答案时碰巧碰到了它。我没有在快速的Google搜索中找到一个。
Mark Rushakoff 09年

Answers:


104

Git-HG罗塞塔石块还不错

两者之间还有其他一些陷阱。当我以另一种方式(git-> hg)从我自己的博客帖子中抄录此列表时。

Hg .hgignore语法:glob与git的.gitignore行为相同。

Git的 .git/config~/.gitconfig,使用git-config来修改值
汞柱 .hg/hgrc~/.hgrc,使用hg help -c config

Git的 git commit -v<br> hg diff | less; hg commit

Git的 gitk<br> hg view, or thg from [TortoiseHg][1]

Git git gui<br> Hg Mercurial不会提供GUI选择更改集,而仅提供控制台hg record命令。

Git git rebase<br> Hg hg重新设置基准。因为git rebase --interactivehg histedit或Mercurial Queues

Git的 git push URL ; git remote add origin URL<br> hg push URL; $EDITOR .hg/hgrc ; [paths] default = URL

Git的 gitk, git log origin/master..HEAD<br> hg outgoing

Git的 git format-patch RANGE<br> hg email -m filename -o

Git git add . ;注意点
Hg hg add ;不需要点。

Git的 git checkout REVISION-KEY<br> hg update CHANGESET


为了填补空白,Mercurial提供了一些最有用的命令:

hg record
吉特 git add -p; git commit

Hg hg inc [URL]
Git无实际等效项。您只能做相当于hg pull; hg log -r .:

Hg hg out URL
Git如果您知道怎么做,请添加。

为了解决合并冲突,hg resolveMercurial中的命令具有一些更改行为的选项:

hg resolve -m FILE(文件标记为手动固定了冲突问题已得到解决)
的Git git add FILE

Hg hg resolve -u FILE将文件标记为未解析
Git git reset HEAD FILE取消暂存文件

Hg hg resolve -l(列出具有已解决/未解决冲突的文件)
Git- git status干净合并的文件会自动添加到索引中,没有冲突的文件

Hg hg resolve FILE(合并后,尝试重新合并文件)
Git没有相当于我知道的重新合并的工具。


4
也许这应该是维基。
Keyo

1
对于gitk,有一个用于Mercurial,hgview的图形克隆(请注意,它与“ hg view”命令不同)
tonicebrian

1
一个小建议:交换Hg和Git文本(因为Mercurial用户使用Git)
Chris S

1
尽管hg record不是很友好,但是hg crecord(来自crecord扩展名)是基于curses的文本UI,非常易于使用。
DenilsonSáMaia 2014年

1
@ ozzy432836我已经多年没有使用过Hg了,但是我认为这些是可以解决的。FWIW的默认操作hg resolve是我喜欢git的原因之一。默认情况下,hg resolve如果不传递任何参数,它将破坏您手动解决的合并!
richq

48

注意:Git和Mercurial之间最大的区别之一是索引登台区域的明确存在。

来自Git用户的Mercurial

Git是唯一公开索引或暂存区概念的DistributedSCM。其他人可以实现和隐藏它,但在其他情况下,用户也无需知道也不必对其进行处理。

Mercurial的大致等效项是DirState,它控制工作副本状态信息以确定下一次提交中要包含的文件。但是无论如何,该文件都是自动处理的。
此外,通过在命令行上指定要提交的文件或使用,可以在提交时进行更多选择RecordExtension

如果您对索引处理感到不舒服,则可以进行更好的转换;-)


诀窍是,您确实需要了解索引才能充分利用Git。正如2006年5月的这篇文章提醒我们的那样(现在仍然如此):

“如果您拒绝索引,那么您实际上会拒绝git本身。”

现在,该文章包含许多现在更易于使用的命令(因此,不要过于依赖其内容;)),但是总体思路仍然存在:

您正在使用一项新功能,并开始对文件进行较小的修改。

# working, add a few lines
$ git add myFile
# working, another minor modification
$ git add myFile

此时,您的下一次提交将在当前分支中进行2次小的修改

# working, making major modification for the new features
# ... damn! I cannot commit all this in the current branch: nothing would work

$ git commit

仅记录此时添加到登台区域(索引)的更改,而不记录当前在工作目录中可见的主要更改。

$ git branch newFeature_Branch
$ git add myFile

下一次提交将在新分支“ newFrature_Branch”中记录所有其他主要更改。

现在,通过' hg record'命令或其他扩展名,Mercurial可使用交互式添加或什至拆分提交的功能:您将需要安装RecordExtensionCrecordExtension
但这不是Mercurial正常工作流程的一部分。

Git将提交视为一系列“ 文件内容更改”,并允许您一次添加一次更改。
你应该学习该功能及其后果:大多数Git的权力(如能够轻松恢复合并(或平分的问题,或恢复提交)违背了水银)来自于“文件内容”的模式。


tonfa(在个人资料中:“ Hg dev,pythonist”:数字...)在评论中加入:

索引中根本没有“ git-ish”,如果索引被认为有价值,则hg可以使用索引,事实上mqshelve已经使用了索引。

好家伙。再来一次。

首先,我并不是要让一种工具看起来比另一种更好。我发现Hg非常棒,非常直观,并提供了良好的支持(尤其是在Windows的主平台上,尽管我也在Linux和Solaris8或10上工作)。

该索引实际上是Linus Torvalds与VCS一起工作的方式的中心位置:

Git从第1天开始就使用了明确的索引更新,甚至没有进行第一次合并。这就是我一直以来的工作方式。我往往有脏树,在我的树一些随机的补丁,我希望提交,因为它只是为下一个版本一个Makefile更新

现在的组合索引(这不仅是在Git中看到的一个概念),在“内容为王”的模式使得它非常独特,“混帐十岁上下”

git是一个内容跟踪器,文件名没有任何含义,除非与其内容相关联。因此,git add filename的唯一明智的行为是将文件的内容及其名称添加到索引中。

注意:此处“内容”定义如下

Git的索引基本上定义为

  • 足以包含树的总“ 内容 ”(并且包括所有元数据:文件名,模式和文件内容都是“内容”的所有部分,它们本身就毫无意义!
  • 附加的“统计”信息,可以进行明显而琐碎(但非常重要!)的文件系统比较优化。

所以,你真的应该看到指数内容

内容不是单独的“文件名”或“文件内容”。您真的无法将两者分开
单独使用文件名是没有意义的(它们也必须具有文件内容),同样,单独使用文件名也是毫无意义的(您必须知道如何访问)。

我要说的是git从根本上不允许您看到没有内容的文件名。整个概念是疯狂的,是无效的。它与“现实”无关。

FAQ中,主要优点是:

  • 细粒度提交
  • 帮助您在相当长的时间内在树中保留未提交的修改
  • 为一次提交执行几个小步骤,检查您的操作git diff,然后使用git add或验证每个小步骤git add -u
  • 允许合并冲突的优秀的管理:git diff --basegit diff --oursgit diff --theirs
  • git commit --amend如果同时未修改索引,则仅允许修改日志消息

我个人认为此行为不应成为默认行为,您希望人们提交经过测试或至少已编译的内容

虽然总体上是正确的(关于“已测试或已编译”的部分),但是Git允许您进行分支和合并(选择樱桃或重新定级)的方式允许您在临时的私有分支中(只要按下即可)进行提交。到远程“备份”存储库),同时在公共分支上重新执行这些“丑陋的提交”,并进行所有正确的测试。


1
索引中根本没有“ git-ish”,如果认为hg有价值,则可以使用索引,实际上mq或shelfve已经做过一部分。我个人认为这种行为不应该是默认的,您希望人们提交经过测试或至少已编译的内容。
09年

2
关于什么是一个Git索引,请参见stackoverflow.com/questions/4084921/...
VonC

在Mercurial中,您的最后一次提交(在推入之前)的行为类似于git的索引。您可以修改它,将其回滚,更改提交消息或通过将其阶段更改为公开来完成它。
Ruslan Yushchenko

12

水银:

hg init . # start a project in the current directory
hg addremove # look for any added or deleted files
hg commit -m "comment" # commit any uncomitted changes
hg status # what have i changed since the last commit?

Git等效项:

git init
git add -A
git commit -am "comment" # -a is not necessary along with the above add -A
git status

1
我(而且我认为大多数git用户)使用的git add -u数量超过-A;-u将暂存所有跟踪文件的更改,而忽略新的未跟踪文件。
u0b34a0f6ae

3
但是addremove添加了新的未跟踪文件:)
tonfa

3
我不同意那git status等于hg status。我是Hg的新手,没有像Git那样获得hg的状态工作。
莱奥波德·赫兹(LéoLéopoldHertz),2009年

1

大致相同,没有addremove:

git init # Start a project in the current directory
git status # Displays both changes and added/removed files
git commit -m "comment" # commit any uncommited changes

但是,这些是您单独工作时要使用的命令。当您想将更改与其他人的工作与和以及相关命令合并在一起时,就会感到很整洁git pullgit push


最重要的是,使用“ git show”(我相信与“ git diff”相同)来查看自上次提交以来所做的更改。
PHLAK

2
“混帐秀”(不带参数)显示你的变化最后一次提交。“ git diff”显示上次提交以来的更改。
达斯汀2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.