git';s决定不提交新添加的文件当前内容,而是提交添加时的内容?

git';s决定不提交新添加的文件当前内容,而是提交添加时的内容?,git,version-control,Git,Version Control,所以,从我在Pro Git中读到的内容来看 事实证明,Git存放了一个文件 正如您运行 添加命令。如果你承诺 现在,版本 someFile原样 上次运行add 命令是它进入系统的方式 提交,而不是指定的文件版本 它在您的工作目录中查找 运行commit时。如果 您可以在运行后修改文件 添加,您必须运行 再次添加以将 文件的最新版本 似乎当您将文件添加到git存储库时,要么立即提交,要么在提交之前对同一文件进行任何修改,这些修改将不会保存在该提交中 这背后的原理是什么?git不跟踪文件,它跟踪更改

所以,从我在Pro Git中读到的内容来看

事实证明,Git存放了一个文件 正如您运行
添加
命令。如果你承诺 现在,版本
someFile
原样 上次运行
add
命令是它进入系统的方式 提交,而不是指定的文件版本 它在您的工作目录中查找 运行
commit
时。如果 您可以在运行后修改文件
添加
,您必须运行
再次添加
以将 文件的最新版本

似乎当您将文件添加到git存储库时,要么立即提交,要么在提交之前对同一文件进行任何修改,这些修改将不会保存在该提交中


这背后的原理是什么?

git不跟踪文件,它跟踪更改。因此,当您“添加文件”时,您不是在添加文件,而是在添加对该文件的更改,而在新文件的情况下,这些更改是您添加该文件时的所有内容。因此,如果在“添加文件”之后但在提交之前进行更改,则必须同时添加这些新更改,否则这些更改将无法提交。

几乎总是,在添加之后立即提交是有意义的,这就是为什么
commit
有一个
-a
选项,以及为什么几乎所有其他风投公司都不允许您拆分添加和提交,即使它们在内部是独立的阶段


在某些情况下,分开做是非常方便的。如果不确定是否要保留更改,并且仍在试验中,有些人会将临时区域用作一种临时提交。我希望我的所有提交都是可编译的,所以当我准备提交但有一大堆编译错误时,我有时会执行一个
add
。这使我能够在修复编译错误的同时,对所做的更改进行
diff
,以防弄糟任何东西。如果出于任何原因想要将更改拆分为多个提交,那么它也非常方便

它实际上与
git add
处理非新文件的方式非常一致

$ git checkout master # assume there is some file called code.c
# hack hack hack
$ git add code.c
# hack hack hack
$ git commit

这会在您进行git添加时添加文件。比如说,在svn中,您甚至不会进行添加,因为
svnadd
仅用于新文件。因此,这是一个额外的步骤(除非您像其他人所说的那样使用
git commit-a
),但它为您提供了更多的灵活性,在同一个文件中只提交一些更改,而不提交其他更改。一旦您熟悉git,您可能会爱上
git add-p
命令,原因正是如此:

这是否意味着通常我只应该在提交之前添加文件?您应该做最适合您的事情。就个人而言,我只在提交之前添加更改(如果更改本身有意义,通常会提交一系列不同的更改),其中包括任何新文件。YMMV,但如果你养成只在提交前立即添加文件的习惯,听起来会更舒服(至少现在是这样),这取决于你自己。正如Kromey所说,它不添加文件,而是添加更改。它也会首先添加到索引阶段。这就是改变“停留”的区域,直到它们被提交。如果您更改了一个已经存在的文件,您可以再次添加它(请记住:您添加了新的更改)。或者您也可以决定进行第二次提交。我也会在提交前很短时间内添加文件,但我经常提交(有时我会在稍后将它们“挤压”在一起),这种添加更改的概念有点误导。它确实增加了快照。从您添加快照时起,它仍然是一个快照,因此您当然可以从更改的角度来考虑它,但Git本身最终将它们视为快照。@吞食:在提交之前添加快照通常是一个好方法。一个小小的调整-如果您正在处理一个影响多个文件的更改,您可以在完成这些更改时添加单个文件,甚至在完成一个更改后添加单个文件,这样您就可以轻松地跟踪已完成的更改和未完成的更改。