我正在学习如何使用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"已更改,我希望将其添加到下一次提交中吗?
答案 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"
之类的消息。
另请注意,您可以并且可能经常需要在特定提交中仅存储文件的某些部分,并在单独的提交中将其他更改存储到同一文件中。