我是 Git 新手,我正在使用 Git 扩展。我想问一下,当我提交目录时,这些文件是自动进行暂存还是在不暂存的情况下提交?我可以在不暂存的情况下提交文件吗?
2 回答
是的,您可以在提交中使用a
andm
进行暂存和提交:
git commit -am "my commit message"
但是,我还是倾向于使用git add -u
,因为上面的命令不会暂存未跟踪的文件。
这里值得一提的是,所有这些方法都使用索引,也就是暂存区,也就是缓存。
当 Git 进行新的提交时,它会使用“索引”中的任何内容。正如索引一词所暗示的那样,有一个单一的、特殊的、杰出的东西:索引,而不是索引。但实际上,Git 可以使用其他一些索引。我们需要知道“该”索引是什么,以及作为索引与其他索引相比意味着什么。
简短的版本是索引是 Git 用来构建下一次提交的东西。我们从这个提交中的内容开始,即当前或HEAD
提交。你运行git checkout master
或git checkout branch
其他什么,Git 用一堆文件填满你的工作树。它将相同的文件放入(单个、特殊、杰出)索引,也称为暂存区。这意味着索引/暂存区开始时充满了许多文件:大多数情况下,工作树中的相同文件,您在其中进行工作。例外是某些工作树文件可能未跟踪。
未跟踪的文件是不在索引中的文件。真的就这么简单:任何不在索引中的文件都是未跟踪的;跟踪索引中的任何文件。索引中的那些开始与你编辑的那些相同git checkout
,它们git checkout
放在你的工作树中。
然后,您对一堆文件进行大量更改。但是,如果您git commit
现在运行,索引/暂存区域仍然具有原始git checkout
版本,而不是修改后的工作树版本。因此,您必须git add
将更改的文件复制到索引中。
这有点麻烦,所以 Gitgit add -u
和git 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 做出新的提交之后,它也必须修复真正的索引,因为现在你已经提交了最新的file1
和file2
(如果你使用了,可能还有其他更新--include
)。如果你使用--include
了,临时索引就变成了真正的索引。
如果您使用--only
,这是最复杂的情况。在这里,Git 也将添加的文件复制到实际索引中,但除此之外,单独保留实际索引。这样,您之前上演的任何内容仍然是上演的。新提交包含提交中的任何内容HEAD
(通过临时索引),除了指定的文件(被git add
-ed 到临时索引中)。而且,您刚才特别提交的任何内容现在也被git add
-ed 到真正的索引中,就好像您git add
在这些文件上运行一样。