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

时间:2015-10-28 14:56:02

标签: git github version-control bitbucket

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

然后我对该文件进行了一些进一步的更改。在此之后,我又跑了git commit。但是,这一次,它返回git commit。但是如果我在运行提交之前运行no changes added to commit,它确实会进行更改。

为什么每次我似乎都需要git add foo.txt我的文件?我希望能够在更改后运行add,而无需告诉git我更改了哪个文件。

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

3 个答案:

答案 0 :(得分:5)

git add无法按svn add的方式工作,其目的不是“开始跟踪此文件”。它的目的是“为下次提交提供此内容”。

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

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

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

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

这一切都是为了灵活性。您可以非常精确地控制添加到提交中的更改,具体取决于您的喜好。或者,您可以git commit -a并立即清理所有内容,如果这是您想要的工作方式。

答案 1 :(得分:2)

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

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

如果你只是保存代码库的快照,那就不那么有用了。 https://git-scm.com/book/en/v2/Getting-Started-Git-Basics有一个很好的指南来开始使用git

答案 2 :(得分:0)

因为对所有文件的所有更改都不会始终属于同一个提交。

例如,如果我在重构主页的同时还在处理用户之间的消息发送新功能,则这些更改与彼此无关。因此,我对主页的提交可能会显示"Refactor homepage to include cool photos"之类的消息,而消息发送功能提交可能会显示"Implement message-sending functionality between users"之类的消息。

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