我是Git的新手,我正在使用Git扩展。我想问一下,当我提交目录时,这些文件是否会自动进行暂存,或者这些文件是否在没有登台的情况下提交? 我可以在没有登台的情况下提交文件吗?
答案 0 :(得分:6)
是的,您可以在提交中使用a
和m
暂存和提交:
git commit -am "my commit message"
但是,我倾向于使用git add -u
,因为上面的命令不会播放未跟踪的文件。
答案 1 :(得分:3)
这里值得一提的是,所有这些方法都使用索引,也就是暂存区域,即缓存。
当Git进行新的提交时,它会使用“索引”中的任何内容。正如索引所暗示的那样,有一个特殊的,区别的东西: 索引,而不是 索引。但事实上,Git可以使用一些其他索引。我们需要知道“ 的索引是什么,以及 索引与其他索引相比意味着什么。
简短版本是指数是Git用于构建下一次提交的索引。我们从此提交中的内容开始,即当前或HEAD
提交。你运行git checkout master
或git checkout branch
或其他什么,Git用一堆文件填满你的工作树。它将相同的文件放入(单个,特殊,可分辨)索引中,也称为暂存区域。这意味着索引/暂存区域开始充满了许多文件:大多数情况下,工作树中的相同文件,您在哪里工作。例外情况是某些工作树文件可能未跟踪。
未跟踪的文件是不在索引中的文件。它真的很简单:索引中不的任何文件都是未跟踪的;跟踪索引中 的任何文件。索引中的那些与您git checkout
编辑的那些开头相同,git checkout
放在您的工作树中。
然后对一堆文件进行一系列更改。但是,如果您现在正在运行git commit
,则索引/暂存区域仍具有原始git checkout
版本,而不是修改后的工作树版本。因此,您必须git add
将更改的文件复制到索引中。
这有点麻烦,所以Git有git 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
提交(通过临时索引)中的任何内容。而且,您现在特别提交的内容现在也是git add
- 真正的索引,就像您在这些文件上运行git add
一样。