4

我是 Git 新手,我正在使用 Git 扩展。我想问一下,当我提交目录时,这些文件是自动进行暂存还是在不暂存的情况下提交?我可以在不暂存的情况下提交文件吗?

4

2 回答 2

10

是的,您可以在提交中使用aandm进行暂存和提交:

git commit -am "my commit message"

但是,我还是倾向于使用git add -u,因为上面的命令不会暂存未跟踪的文件。

于 2013-03-01T15:49:21.467 回答
8

这里值得一提的是,所有这些方法都使用索引,也就是暂存区,也就是缓存。

当 Git 进行新的提交时,它会使用“索引”中的任何内容。正如索引一词所暗示的那样,有一个单一的、特殊的、杰出的东西:索引,而不是索引。但实际上,Git 可以使用其他一些索引。我们需要知道“该”索引是什么,以及作为索引与其他索引相比意味着什么。

简短的版本是索引是 Git 用来构建下一次提交的东西。我们从这个提交中的内容开始,即当前或HEAD提交。你运行git checkout mastergit checkout branch其他什么,Git 用一堆文件填满你的工作树。它将相同的文件放入(单个、特殊、杰出)索引,也称为暂存区。这意味着索引/暂存区开始时充满了许多文件:大多数情况下,工作树中的相同文件,您在其中进行工作。例外是某些工作树文件可能未跟踪

跟踪的文件是不在索引中的文件。真的就这么简单:任何不在索引中的文件都是未跟踪的;跟踪索引中的任何文件。索引中的那些开始与你编辑的那些相同git checkout,它们git checkout放在你的工作树中。

然后,您对一堆文件进行大量更改。但是,如果您git commit现在运行,索引/暂存区域仍然具有原始git checkout版本,而不是修改后的工作树版本。因此,您必须git add将更改的文件复制到索引中。

这有点麻烦,所以 Gitgit add -ugit commit -a. 但是这两个都只是查看索引中的内容,然后将它们的新工作树版本复制到索引中。所以git commit -a -m "commit message"不会添加工作树中但不在索引中的文件,即当前未跟踪的文件这与: 仅更新跟踪的文件相同。git add -u

这里有点复杂

除了上述之外,git commit还可以将路径名作为参数:

git commit -m "some message" file1 file2

例如。但这意味着--only标志,即file1提交和中的更改file2。您还可以运行:

git commit -m "some message" --include file1 file2

这会覆盖--only.

所有这些工作的方式是 Git 可以使用不同的索引,而不是标准索引。使用 时--only,Git 所做的是从HEAD提交中构建一个新的临时索引。然后,Git 将工作树中的指定文件复制到这个临时索引中,替换旧版本或添加新文件。然后 Git 从这个临时索引进行提交:新提交与提交具有所有相同的文件HEAD,除了由于--only file1 file2.

当您使用 时--include,Git 通过复制当前索引而不是HEAD再次提取来创建其临时索引。所以现在你git add到目前为止所拥有的任何东西都在临时索引中。然后 Git 添加指定的文件,并进行新的提交。

在所有情况下,在 Git 做出新的提交之后,它也必须修复真正的索引,因为现在你已经提交了最新的file1file2(如果你使用了,可能还有其他更新--include)。如果你使用--include了,临时索引就变成了真正的索引。

如果您使用--only,这是最复杂的情​​况。在这里,Git 也将添加的文件复制到实际索引中,但除此之外,单独保留实际索引。这样,您之前上演的任何内容仍然是上演的。新提交包含提交中的任何内容HEAD(通过临时索引),除了指定的文件(被git add-ed 到临时索引中)。而且,您刚才特别提交的任何内容现在也被git add-ed 到真正的索引中,就好像您git add在这些文件上运行一样。

于 2017-09-14T18:42:02.237 回答