为什么在git commit之前需要使用git add?或者为什么需要使用git add?

4
我不是git的专家,但我知道版本控制的整个想法是要能够记录文件的历史。如果我们可以通过提交(commit)来跟踪工作目录中文件的更改,则为什么我需要执行 git add 来记录文件的记录,而不是直接进行 git commit
我阅读了这个 SO线程并找到以下内容:
“I use git add when I think a file is ready to be committed, even if I know I won't make the commit until some time later. All else apart, git diff reports on the differences between what is in the index (staging area) and what is out in the working directory.”
这说明在git commit之前执行git add的好处。是否还有其他类似的好处,或者git add只是应该遵循的普遍约定(但为什么?),或者在不执行git add的情况下执行git commit始终有效?
抱歉如果我的问题听起来很愚蠢。提前感谢您的回答!

3
因为如果不使用add命令,除了要求git提交所有文件或在运行git commit时指定文件外,你几乎无法告诉git要提交什么(即没有其他可选项)。 - eftshift0
4
一般来说,你可以使用暂存区来设置哪些已更改的内容将被提交... 你可以修改50个文件,只提交1或2个... 你甚至可以更进一步,通过使用 git add -i 命令,你可以告诉 Git 在下一个版本中包括哪些修改文件的_部分_。 - eftshift0
总的来说,我会说:细粒度 - eftshift0
这里有两个不同的问题可以问:(1)我如何操作Git的索引,也称为暂存区?(2)为什么需要暂存区?git add是回答问题#1的一部分,而问题#2需要诉诸哲学、形而上学、心理学或其他更模糊和/或动荡的思想领域。 - torek
需要记住的关键是,git commit 不使用工作树中的内容。它提交的是Git的索引(或暂存区)中的内容。因此,在提交之前,必须将某些内容从工作树复制到暂存区。使用git commit -a会先为您运行一个单独的复制到暂存区步骤,但它的工作方式存在一些缺陷;有时您需要使用git add - torek
2个回答

2
长期以来,我一直将git视为编程项目的某种“保存状态”(或快照),可以在历史记录中返回到先前的状态 (那时我只是使用git add .然后git commit)。
但是通过“暂存”,现在我可以在提交之前“预览”要提交的内容。我认为更容易将暂存视为您的提交的“打印预览”: 您可以在实际提交之前查看提交的内容(就像您可以在实际花费纸张和墨水之前查看打印文档一样)。
例如,我编辑了9个文件,其中3个文件包含新功能,2个文件包含错误修复,而4个文件尚未完成(可能是新功能或取消的功能请求)。
有了暂存,我可以选择:
A. 添加这些包含新功能的3个文件和包含错误修复的2个文件,然后将其作为“生产就绪提交”进行提交 (准备部署,例如:通过自动化手段上传到公共http服务器)。我的其他4个未完成的文件将不包括在提交中。
B. 先添加这些包含新功能的3个文件,然后进行提交,然后添加这些包含错误修复的2个文件,然后进行单独的提交,并使用不同的提交消息以获得更好的追溯性。
在这个“分阶段”过程中的另一个好处是给我时间“复查”我的更改。在这个“最后审查”的时间里,我可以更彻底地发现错误,以防止出现错误(例如:拼写错误)。
我知道在每次提交之前为3-5个文件(或更多文件,如果您更改了更多文件)编写git add 文件名不太实用,因此我使用像lazygit这样的git客户端来自动进行分阶段(我只需单击要分阶段的文件名)。
使用lazygit,我甚至可以部分地分阶段文件(例如:只有7行中的5行已更改)。当一些更改不是非常细粒度时(例如:包含类定义的文件已更改,我更改了3个方法/函数的定义,其中2个方法/函数已准备好提交,而1个方法/函数尚未准备好)时,这非常有帮助。

lazygit preview

其他可以用于“预览和点击”暂存的 Git 客户端:Sourcetree(Windows)、GitExtensions(Windows/Linux)。
免责声明:我不拥有也不为上述 Git 客户端做出贡献,我只是觉得它们非常有帮助,想要分享。

1

git-add - 将文件内容添加到索引中。

"索引"保存着工作树的快照,下一次提交时就会将该快照作为提交的内容。因此,在对工作树进行任何更改并在运行 commit 命令之前,您必须使用 add 命令将任何新文件或修改过的文件添加到索引中。

可以通过以下几种方式指定要提交的内容:

使用 git-add1 逐步“添加”更改以在使用 commit 命令之前将其添加到索引中(注意:即使是修改后的文件也必须“添加”)。

https://git-scm.com/docs/git-commit


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