注意: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可使用交互式添加或什至拆分提交的功能:您将需要安装RecordExtension
或CrecordExtension
。
但这不是Mercurial正常工作流程的一部分。
Git将提交视为一系列“ 文件内容更改”,并允许您一次添加一次更改。
你应该学习该功能及其后果:大多数Git的权力(如能够轻松恢复合并(或平分的问题,或恢复提交),违背了水银)来自于“文件内容”的模式。
tonfa(在个人资料中:“ Hg dev,pythonist”:数字...)在评论中加入:
索引中根本没有“ git-ish”,如果索引被认为有价值,则hg可以使用索引,事实上mq
或shelve
已经使用了索引。
好家伙。再来一次。
首先,我并不是要让一种工具看起来比另一种更好。我发现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 --base
,git diff --ours
,git diff --theirs
。
git commit --amend
如果同时未修改索引,则仅允许修改日志消息
我个人认为此行为不应成为默认行为,您希望人们提交经过测试或至少已编译的内容
虽然总体上是正确的(关于“已测试或已编译”的部分),但是Git允许您进行分支和合并(选择樱桃或重新定级)的方式允许您在临时的私有分支中(只要按下即可)进行提交。到远程“备份”存储库),同时在公共分支上重新执行这些“丑陋的提交”,并进行所有正确的测试。