最常见的Mercurial命令的Git等价物?

我一直在使用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? 

Git-HG rosetta石头不错

在那里没有提到的两个之间还有一些其他的陷阱。 当我以另一种方式(git – > hg)时,这个列表被从我自己的博客文章中分离出来。

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

Git .git / config,〜/ .gitconfig,使用git-config来修改这些值
Hg .hg / hgrc,〜/ .hgrc,使用hg help -c config

Git git commit -v
Hg hg diff | 减; hg commit

Git gitk
Hg汞观点,或从TortoiseHg thg

Git git gui
Mercurial不运送GUI来select变更集,只有控制台hg record命令。

Git git rebase
hg rebase 。 对于git rebase --interactive 交互有hg histedit或Mercurial Queues

Git git push URL; git远程添加起始URL
hg推送url; $ EDITOR .hg / hgrc; [path]默认=url

Git gitk,git log origin / master..HEAD
Hg汞外向

Git的 Git格式 – 补丁范围
Hg hg email -m文件名-o

Git git add。 ; 注意点
Hg hg add; 没有点需要。

Git git结帐REVISION-KEY
Hg hg更新CHANGESET

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

纪录
Git git add -p; git commit

Hg hg inc [URL]
Git没有真正的等价物。 你只能做相当于hg pull; hg log -r .: hg pull; hg log -r .:

出URL
Git请添加,如果你知道如何。

对于合并冲突解决,Mercurial中的hg resolve命令有几个选项可以改变行为:

Hg hg解决-m文件(通过手动修复冲突问题将文件标记为已解决)
Git git添加文件

Hg hg resolve -u FILE将文件标记为已解决
Git git reset HEAD FILE以取消文件

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

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

注意:Git和Mercurial之间最大的区别之一就是显式存在索引分段区域

从Mercurial的Git用户 :

Git是公开索引或登台区域概念的唯一的DistributedSCM 。 其他人可能会执行和隐藏它,但在其他情况下,用户意识到也不必处理它。

Mercurial的粗略等价物是DirState ,它控制工作副本状态信息以确定将被包含在下一个提交中的文件。 但无论如何,这个文件是自动处理的。
另外,通过在命令行上指定要提交的文件或使用RecordExtension ,可以在提交时更有select性。

如果你处理索引感觉不舒服,你会更好;-)


诀窍是,你真的需要了解索引来充分利用Git。 从2006年5月的这篇文章提醒我们(现在也是如此):

“如果你否认指数,你真的否认git本身。”

现在,这篇文章包含了很多使用起来更简单的命令(所以不要太依赖它的内容)),但总体思路仍然是:

您正在开发一项新function,并开始对文件进行微小的修改。

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

在这一点上,你的下一个提交将在当前分支上进行两个小修改

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

只logging此时添加到暂存区域(索引)的更改,而不logging工作目录中当前可见的主要更改。

 $ git branch newFeature_Branch $ git add myFile 

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

现在,通过“ hg record ”命令或其他扩展名交互添加甚至分割一个提交function是Mercurial可用的function:您将需要安装RecordExtensionCrecordExtension
但这不是Mercurial正常工作stream程的一部分。

Git将提交视为一系列“ 文件内容更改”,并让您逐个添加这些更改。
你应该研究这个特性及其后果:大部分的Git能力(比如与Mercurial相反的容易恢复合并(或者平分问题或者提交提交)的能力 )来自于这个“文件内容”范例。


tonfa (in profile:“Hg dev,pythonist”:figures …)在评论中插话:

在索引中根本没有“git-ish”,如果它被认为是有价值的,hg可以使用索引,实际上mqshelve已经做了一部分。

好家伙。 再来一次。

首先,我不是在这里使一个工具看起来比另一个好。 我觉得Hg很棒,非常直观,有很好的支持(特别是在Windows,我的主要平台上,尽pipe我在Linux和Solaris8或者10上工作)。

该指标实际上是Linus Torvalds与VCS合作的前沿和中心:

Git使用显式索引更新从第1天开始,即使在第一次合并之前。 这只是我一直以来的工作。 我倾向于有肮脏的树,在我的树中有一些我不想提交的随机补丁,因为这只是下一个版本的Makefile更新

现在,索引(不是仅仅在Git中才能看到的概念) “内容为王”范例的结合使得它非常独特,而且是“git-ish” :

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

注意: 这里的“内容”定义如下 :

Git的索引基本上被定义为非常多

  • 足以包含树的全部“ 内容 ”(这包括所有元数据:文件名,模式和文件内容都是“内容”的一部分,而且它们本身都是没有意义的!
  • 额外的“统计”信息,以允许显而易见的(但非常重要的)文件系统比较优化。

所以你真的应该看到索引作为内容

内容不是“文件名”或“文件内容”作为单独的部分。 你真的不能分开这两个
文件名本身是没有意义的(他们也必须拥有文件内容),文件内容本身也是无意义的(你必须知道如何达到它)。

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

从FAQ中 ,主要优点是:

  • 提供一个很好的粒度
  • 帮助您在相当长的一段时间内在树上保持一个无限制的修改
  • 对一个提交执行几个小步骤,检查你用git diff做了什么,并用git addgit add -uvalidation每一个小步骤。
  • 允许合并冲突的优秀pipe理: git diff --basegit diff --oursgit diff --theirs
  • 允许git commit --amend只修改日志消息,如果索引没有被修改的同时

我个人认为这个行为不应该是默认的,你希望人们提交经过testing或至less编译的东西

虽然你是正确的(关于“testing或编译”部分),但Git允许你进行分支和合并(cherry-picking或rebasing)的方式允许你在一个临时的私人分支中按照你想要的频率提交到远程“备份”存储库),同时在公共分支上重新执行这些“丑陋的提交”,并进行所有正确的testing。

水银:

 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 

这大致相同,没有删除:

 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相关的命令与其他人的工作相结合,你就可以进入整洁的东西。