我是Git的新手,正在使用Git扩展。我想问一下,当我提交目录时,这些文件是否会自动进入暂存区或者说它们会在没有进入暂存区的情况下被提交?
我能否在不暂存的情况下提交文件?
我是Git的新手,正在使用Git扩展。我想问一下,当我提交目录时,这些文件是否会自动进入暂存区或者说它们会在没有进入暂存区的情况下被提交?
我能否在不暂存的情况下提交文件?
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 commit
命令的持续时间存在。你可以从某些方面看到它:例如,您的预提交钩子是使用环境变量GIT_INDEX_FILE
运行的,该变量设置为显示临时文件的名称(默认设置未设置或设置为标准索引)。不幸的是,没有完美且简单的方法来测试这一点,因为git worktree add
会添加一个工作树,其标准索引不是.git/index
而是.git/worktrees/<id>/index
,其中<id>
是某个ID,而且不能保证将来不会更改。 - torekgit commit
命令,并在该编辑器等待您(人类)编辑提交消息时使用第二个窗口或类似工具来查看.git
目录内部,您可以找到临时索引。对于git commit --only
,实际上有三个活动索引文件;对于git commit --include
,则有两个。但是再次强调,这些都是没有真正承诺的实现细节。这有点不幸,因为它限制了您在预提交挂钩中所能做的事情。 - torekgit commit -m "一些信息" file1
来提交对 file1
的轻微更改(例如修复空格),这些更改与当前工作无关,而且不会干扰我暂存区的内容。(在阅读这个答案之前,我会取消暂存所有文件,暂存更改后的 file1
,然后提交,最后再重新暂存以前的文件以继续...那非常繁琐...git commit --only
真是太棒了)。 - Eric Mutta--amend
与此结合使用,通过使新提交的父项成为被剔除提交的父项来将先前尖端提交从分支中移除,从而修复上一个提交中的故障。但我通常发现过于花哨是有害的,最好只是进行一堆较小的提交,并使用 git rebase -i
来组合和修复事情。 - torek是的,你可以使用a
和m
来暂存和提交代码:
git commit -am "我的提交信息"
然而,我通常使用git add -u
,因为上述命令不会暂存未跟踪的文件。
git commit -a
(这里的-a将跳过暂存部分,但如果文件是新的且未被跟踪,则需要运行git add file_name.ext)
git add -u
可以在一个命令中为你暂存所有内容。 - Nixgit config --global alias.yabadabadoo !git add -u && git commit -a
这样的东西。 - Andrejs Cainikovs