git commit <file>和git commit --only有什么区别?

时间:2018-07-30 05:33:45

标签: git

enter image description here

enter image description here

这两个选项似乎功能相同。

也许是因为我的英语阅读能力差,所以我看不到它们之间的差异。

你能告诉我真相吗?

3 个答案:

答案 0 :(得分:2)

答案在您列出的文档片段中:

  

--only

     

通过采用命令行上指定路径的更新的工作树内容进行提交,而不考虑为其他路径暂存的任何内容。如果在命令行上指定了任何路径,则这是git commit的默认操作模式,在这种情况下,可以忽略此选项。

在命令行中添加文件路径时,--only不会向命令添加任何内容,并且对问题中描述的第二个选项所描述的语义适用。

另一方面,正如--only的其余描述所解释的,如果将其与--amend的{​​{1}}一起使用,则索引的内容(暂存文件)被忽略。

git commit --amend通过添加当前暂存的文件并更改其提交消息来修改当前提交。使用--allow-empty,不会修改提交的内容(暂存的文件将被忽略),仅更新提交消息。

我不清楚--only如何改变git commit --allow-empty的行为。

但是,--only在Git的日常工作中没有任何用处。添加它是为了帮助自动将其他VCS-es的存储库转换为Git。 F.e.创建分支时,Subversion将创建一个新提交,从Git的角度来看,该提交为空。 --allow-empty允许git-svn在将Subversion存储库转换为Git时创建这样的空提交。

答案 1 :(得分:1)

git commit-从给定文件中获取提交消息。在参数中,您应该输入要从存储库中获取的文件的名称。

git commit --only是git commit的默认操作模式。

答案 2 :(得分:1)

有三种使用git commit的方式(无论如何都没有--amend):

  • git commit,而不命名任何文件:这意味着提交当前索引。

  • git commit --only file1 ... fileN,您在其中命名一些文件 ,并使用--only选项。我们待会儿会描述。

  • git commit --include file1 ... fileN,您在其中命名一些文件 ,并使用--include选项。我们也会对此进行描述。

如果您选择列出一些非零数量的文件,但是省略了--only选项,则Git 会假定 --only选项。如果您不想使用--only选项,则必须指定--include选项。如果您选择在命令行上列出一些文件,则必须选择这两个选项之一,如果您没有选择,Git将为您选择。因此,--only只是--include相反

索引及其在提交中的作用

要正确理解这三种操作模式,您需要了解Git通过索引构建提交。通常,它使用 the 索引。那是上面列出的第一种模式:git commit,没有任何文件名,使用的是现在索引中的任何内容。

索引本身是某种隐藏的数据结构。它具有三个名称,反映了它的重要性,或者反映了较差的初始名称,即“索引”。第二个名称是 staging area ,因为索引的作用是充当您构建(或 stage next 的位置>提交即可。此事物的第三个名称(此索引或暂存区域)是缓存

索引开始时保存的是当前提交中所有文件的副本,该副本是您运行git checkout branch时提取的。这些文件从分支提示提交复制到索引/暂存区域,并复制到工作树中,您可以在其中进行处理。名称​​ index 来自这样一个事实,即索引会跟踪工作树:它对它进行 indexes 。 (请参见verb definitions here。)

常规提交的工作原理

在正常模式下运行git commit时,Git会立即打包索引中位于所在的所有文件-所有签出的提交中的文件都带有git add编辑的文件被工作树中的文件覆盖。这些文件成为新的快照。 Git会写出快照本身,您作为提交作者的名称和电子邮件地址以及其他元数据(例如日志消息)。它将新提交的 parent 设置到分支的上一个尖端,然后将新提交的哈希ID写入当前分支名称,以便新提交现在是当前提交。

由于Git刚刚从索引构建了 new 提交 ,所以新的,当前的提交和索引匹配。因此,通过修改工作树文件并将其复制到索引中,一切准备就绪即可进行 next 提交。

--only--include的工作方式

要使用--include构建新的提交,Git本质上只是将文件添加到索引中并进行提交。 1 非常简单:它看起来为尽管您先运行git add file1 ... fileN,然后又运行git commit。新提交是从此修改后的索引(现在为 the 索引)构建的,因为它现在与新的当前提交匹配。

对于--only,Git有问题。 索引(常规索引)可能已被修改,可能不再与当前提交匹配。因此,Git要做的是将当前提交提取到临时索引中,使用git add将工作树文件复制到该临时索引中,然后从该临时索引中构建提交。这部分并不那么复杂:新提交是通过索引构建的,而不仅仅是 the 索引。但是一旦完成,Git便回到问题所在:实际索引(您可能已修改的索引)与Git刚提交的新提交不匹配,并且可能与之前的提交不匹配。它不匹配任何东西,这是一个很大的混乱。

在成功提交之后,Git此时要做的是将那些相同文件复制到 real 索引中,以便索引中的file1 ... fileN已更新,以匹配您刚提交的内容。同时,实际索引中的所有剩余文件都将保留,但是它们在您运行git commit --only之前就已查找。

请注意,您已经在真实索引中小心地暂存的文件(例如,使用git add --patch)既不匹配工作树也不匹配旧的(不再是当前的)提交,仍然可能是您暂存的方式他们。但是,如果您将这些文件之一命名为--only文件之一,那么精心准备的版本现在就消失了!由于后提交git add,它已被工作树版本取代。


1 在内部,它更复杂:Git仍会建立临时索引,这与--only一样。但是,如果提交成功,则临时索引变为常规索引。因此,这比--only复杂。