为什么在git add命令中需要文件名?

3
我正在学习Git命令。 我对git add和git commit的理解是:git add '文件名' 会对项目(整个工作目录)进行快照并将其暂存。git commit将已暂存的快照保存到仓库中。
我也知道git与SVN等软件在保存文件方面有根本区别。而SVN会在单个文件中保存增量更改,git则保存整个工作目录的快照。如果一个文件没有发生变化,git的快照将包含对该文件的引用,指向之前的快照。
我有一个问题。如果git add对整个工作目录进行快照,为什么我们需要在命令中提供单个文件名?Git无论如何都会对整个项目进行快照。

2
git add file [file ...] 仅添加指定的文件,而不是整个工作目录。但它允许您指定一个目录,这意味着“目录中的所有文件”; 如果您在工作树的顶部并指定“。”,那就相当于“工作树中的所有文件”。由于.gitignore文件等原因,这里有一些例外情况,但这基本上涵盖了大部分情况。 - torek
你可以使用git add -u命令将所有以前跟踪的文件添加到暂存区。 - o11c
我想知道为什么没有人提到 git add -A - user3159253
3个回答

2
因为你可能不想添加每个已添加或更改的文件。
例如,假设你修改了你的 xyzzy.c 文件,但你还下载了一张非常好的图片 taylor_swift.jpg 到当前目录(还没有移动到其他地方)。
你不希望后者的文件进入仓库,所以你只需要执行以下命令:
git add xyzzy.c

如果您只想添加一个文件,则可以使用以下命令:

git add 文件名

无论如何,如果您想要添加当前目录中的所有文件,只需执行以下操作:

git add .

git add .

我倾向于将其分为三个区域。

首先是您的工作区,您在该区域中已经检出了一个特定的“快照”,其中包含您所做的任何更改。

然后是暂存区,它保存下一次提交的文件。

最后是Git正式区域,它保存了所有已提交的更改。

如果您使用这种方式思考,add 将从工作区复制单个文件到暂存区,而 commit 将从暂存区复制所有文件到Git正式区域。


这意味着当Git对项目进行快照时,快照将包含在git add命令中提到的修改过的文件,而对于其他文件,它只会有一个指向先前相同文件存储位置的链接(即使文件已更改)。 - Mandroid
@Mandroid,我倾向于把它看作是三个区域。你的工作区域,在这里你已经签出了特定的“快照”,包括你所做的任何更改;暂存区域保存下次提交的文件;git-proper区域保存所有提交的更改。然后使用add将工作区中的单个项复制到暂存区,使用commit将所有内容从暂存区复制到git-proper区。 - paxdiablo
那个解释很有帮助,可以更好地形象化事物。 - Mandroid
有趣的例子。 - JackHasaKeyboard
@Mandroid:将它复制到答案中,因为你似乎认为它有帮助。 - paxdiablo

1
您对Git中的快照理解有误。正如Git网站上的文档[快照,而不是差异]所示,项目的快照是您在存储库中添加的每个文件的快照的聚合。这就是为什么您需要在git add命令中指定文件名的原因。
在告诉Git应该通过git add <filename>管理哪个文件之后,您可以使用git add -u来暂存您的修改,此时文件名是不必要的。

感谢提供链接,我的 git 快照理解有误。 - Mandroid

0

请查看关于git add的git文档。

简单地说,你可以使用git add .

这将包括整个目录/新文件/修改过的文件 - 准备提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接