如果我在“ git add”之后对文件进行了更改,则必须在提交之前再次添加它以包含最新更改。
是否可以在开始时添加一次文件(这样我就不会丢失它)并在最后提交所有更改?
答案 0 :(得分:1)
您可以以A.H. answered的身份使用git commit -a
,但我建议您不要这样做:以tymtam commented的身份,您会犯错。如果您使用使用git commit -a
,则较早的git add
在提交时就足够了,我们将在详细描述中看到。
git add
这里的真正问题是-嗯,这取决于您的观点,但是Git不会改变事物的其 gitty little mind-问题在于您的思维Git运作方式的模型可能与Git实际运作方式不符。具体来说,它并不能说明Git用 index 不断打脸的方式。
该索引也称为登台区域或缓存,具体取决于Git的调用者或执行者。准确地说,索引是是什么,通常并不能很好地描述。很难完成它的完整工作,因为它有多种用途,但是我发现的最好的简短描述是:索引包含将进入 next 提交的文件。 / strong>(这省略了索引的一些细微之处,例如在git merge
中如何使用索引,但保留了它的主要本质。)
这些存储在索引中的文件没有区别。它们是整个文件的完整副本!!当您运行git commit
时,Git 不使用工作树中的内容。相反,Git只是打包了索引 then 中的所有内容,并使用该内容进行新的提交。
这种工作方式是,当您第一次使用git checkout
选择要进行的提交时,Git会取出冻结的,只读的,压缩的,仅Git格式的文件 提交,将其解冻,解压缩,然后将每个文件的这些有用版本写入工作树中。
其他版本控制系统也可以这样做,但是其他系统则在这里停止:它们只有冻结的,提交的,VCS格式的文件以及解冻的,有用的工作树副本。因此,当您告诉其他系统进行一次 new 提交时,这些系统将一次,缓慢,谨慎地一次处理一个文件,遍历整个工作树,并通过压缩和压缩每个文件来准备每个文件。冻结它并为下一次提交做好准备。在较大的项目中,这可能需要花费几秒钟甚至是几分钟的时间:您调用“ make new commit”动词,然后休息一下或去吃午饭,因为长时间不会完成提交。
但是,Git可以做些不同的事情,可以说是更聪明,但也更令人沮丧。当您第一次git checkout
进行原始提交时,Git会获取每个文件的冻结副本,然后将它们解冻一些。它将每个文件的这些半冻结的,仅Git的副本放入其索引中。他们坐在那里,准备被冻结到 next 提交中。只有给定文件进入索引后,该文件才能被解压缩到工作树中,以便您可以使用它。
稍后,当您运行git add
时, now Git会查看工作树版本。有时,它还会在索引条目中使用一些其他保存的信息(有关工作树的已保存内容)来确定是否需要复制文件 ,但是原则上,Git所做的是复制文件重新回到索引 now 。在git add
时,Git会缓慢而痛苦地重新压缩为仅Git格式。它将文件的最新副本放入索引中,覆盖先前的副本。
当然,如果您再次更改工作树中的文件,则必须再次将其重新复制到工作树中。因此,您必须重新add
文件。添加步骤根本不会标记工作树文件。而是将工作树文件复制到索引副本中。
每个文件在索引中都有一个副本这一事实也是理解.gitignore
实际工作方式的关键。 是索引中文件的存在与否决定文件是否被跟踪。。只能忽略未跟踪文件,因此,如果文件在索引中,则在.gitignore
中列出该文件将无效。而且,由于git checkout
将所有冻结的文件复制到索引中,因此,如果某个提交中包含某些文件,则在您{ {1}},即使已在git checkout that-particular-commit
中列出。
请注意,.gitignore
有一个标志告诉它:对于索引中已经存在的每个文件,请检查是否更新了工作树副本。如果是这样,请对该文件进行git add
。(如果已将其从工作树中删除,则包括从索引中删除。),运行git add
。但是,由于它开始并带有索引中的 ,因此它会跳过所有全新的工作树文件。这些 untracked 文件保持未跟踪状态。
使用git add -u
与运行git commit -a
之前运行git add -u
基本上是相同的 1 。因此,对于所有在索引中然后的文件(包括自提取当前提交以来添加的文件),这将检查是否应将索引副本替换为工作树副本。但是不会添加任何未跟踪的文件。使用git commit
很方便,而且几乎可以正常工作。
1 如果混用其他一些git commit -a
选项,特别是git commit
或--only
,这里的“基本上”就会开始显示裂缝。这些会影响Git使用索引的方式,或者(对于--include
-在提交期间是否完全使用 standard 索引)。如此暗示,您可以创建专用的 temporary 索引文件。我不会在这里详细介绍这些细节,但是,例如--only
使用它来做一些花哨的技巧。
答案 1 :(得分:0)
没有诸如“从现在开始自动将所有内容添加到索引”之类的东西。您可以做的下一件事是
git commit -a
其中-a
的含义(引用手册)
-a, --all
Tell the command to automatically stage files that have been
modified and deleted, but new files you have not told Git about are
not affected.
您可以将其包装到自定义git别名中,如下所示:
git config --global alias.ci "commit -a"