Git add: 为什么我必须手动指定要提交的文件?

Git add: Why do I have to manually specify which files to commit?

我正在学习如何使用 git。所以,我创建了一个新的存储库,其中包含一个文件 "foo.txt"。要将其添加到版本控制中,我 运行 git add foo.txt。然后,我对文件做了一些修改,运行git commit。这似乎更新了存储库。

然后我对该文件做了一些进一步的修改。在此之后,我再次运行 git commit。然而,这一次,它 returns 和 no changes added to commit。但是,如果我在 运行 提交之前 运行 git add foo.txt,它确实会进行更改。

为什么我似乎每次都必须 add 我的文件?我希望能够在更改后 运行 git commit,而不必告诉 git 我更改了哪个文件。

我必须手动指定要提交的文件是否正常?还是我做错了什么?我不能告诉 git 每次 "foo.txt" 更改时,我都希望将它添加到下一次提交吗?

git 中的暂存区和已提交的快照之间存在差异。在您使用 commit 命令时的解释中,您实际上提交了 foo.txt 的版本,就像您使用 add 命令时一样。简而言之,add 只暂存准备提交的文件。需要 commit 命令来保存快照。

有时您对多个文件进行了更改,但希望它们在不同的提交中,暂存区可让您选择要提交的内容和时间,而不是一次性转储所有内容。还有其他用途,但这可能是初学者最容易理解的。

不过,如果您只是保存代码库的快照,则用处不大。 https://git-scm.com/book/en/v2/Getting-Started-Git-Basics 有一个很好的开始使用指南 git

git add 不像 svn add 那样工作,它的目的不是 "start tracking this file"。它的目的是"stage this content for the next commit".

如果您碰巧 运行 它在一个未跟踪的文件上,git 将开始跟踪该文件,并在下一次提交时包含该文件的当前内容。它只是跟踪内容 - 它是一个要跟踪的新文件这一事实或多或少是添加文件内容的副作用。

如果您修改了跟踪文件,请使用 git add 将该更改的内容添加到您的下一次提交中。

如果您随后 再次修改文件,您将需要再次 git add 以暂存您所做的新更改。

您还可以使用 git add -p 添加部分更改。这将让您仅暂存对文件所做的 一些 更改,但不能添加其他更改。 (它会像 diff 那样将更改分块,并询问您是要添加还是忽略每个块。)

这一切都是为了灵活性。您可以非常精细地控制将哪些更改添加到提交中,完全按照您的喜好。或者,您可以 git commit -a 一次扫除所有内容,如果您想要这样的话。

因为对所有文件的所有更改并不总是属于同一个提交。

例如,如果我在重构主页的同时也在开发一项用于在用户之间发送消息的新功能,那么这些更改彼此无关。因此,我对主页的提交可能包含 "Refactor homepage to include cool photos" 之类的消息,而消息发送功能提交可能包含 "Implement message-sending functionality between users".

之类的消息

另请记住,您可以并且可能经常需要在特定提交中仅存储文件的某些部分,并将其他更改存储到同一文件在单独的提交中。