为啥有人应该在 git commit 之前使用 git add?或者为啥有人应该使用 git add 呢?

Posted

技术标签:

【中文标题】为啥有人应该在 git commit 之前使用 git add?或者为啥有人应该使用 git add 呢?【英文标题】:Why should someone use git add before git commit? OR why should someone use git add at all?为什么有人应该在 git commit 之前使用 git add?或者为什么有人应该使用 git add 呢? 【发布时间】:2021-08-10 00:53:54 【问题描述】:

我不是 git 专家,我知道版本控制背后的整个想法是能够记录文件的历史。如果我们可以通过提交来跟踪对工作目录中文件所做的更改,那么我为什么要执行git add 来记录文件,而我只能git commit

我在 SO 上浏览了this 线程并发现了这个:

当我认为文件已准备好提交时,我会使用 git add,即使我知道要等到一段时间后才会提交。除此之外, git diff 报告索引(暂存区)中的内容与工作目录中的内容之间的差异。

这表明在git commit 之前执行git add 的好处。是否还有更多这样的好处,或者git add 是某人应该遵循的常见约定(但为什么?),或者在不使用git add 的情况下使用git commit 一直有效?

对不起,如果我听起来很愚蠢。提前致谢!!

【问题讨论】:

因为如果你不使用add,你就没有什么可以告诉git提交什么(除了要求git提交所有文件或在运行git commit时指定文件)。 一般来说,你使用暂存区来设置你已经更改的所有东西中的哪些东西将被提交......你可以修改50个文件并且只提交1或2个......你可以甚至更进一步,通过使用git add -i,您甚至可以告诉 git 修改文件的哪些部分将包含在下一个修订版中。 所以,总而言之,我想说:粒度 您可以在这里提出两个单独的问题:(1) 如何操作 Git 的索引,即暂存区? (2) 为什么会有一个暂存区? git add 是(部分,不是全部)问题#1 的答案;问题 #2 需要求助于哲学、形而上学、心理学或其他一些更模糊和/或动荡的思想领域。 但要记住的关键是git commit 不使用工作树中的内容。它提交 Git 的 index (或暂存区)中的内容。因此,在提交发生之前,必须将某些内容从工作树复制到暂存区。使用git commit -a 首先为您运行一个单独的复制到暂存区 步骤,但它的工作方式存在一些缺陷;你有时必须使用git add 【参考方案1】:

很长一段时间以来,我只是将 git 视为编程项目的某种“保存状态”(或快照), 我可以在历史中回到以前的状态 (当时我只是git add . 然后git commit

但是通过“暂存”,现在我可以在提交之前“预览”我想要提交的内容。 我发现将暂存视为提交的“打印预览”更容易:您可以在实际提交之前查看提交的内容 (在实际花费纸张和墨水之前,您可以看到打印的文档)

例如,我编辑了 9 个文件,3 个文件包含新功能,2 个文件包含错误修复,而 4 个文件未完成(可能是新功能或取消功能请求)

通过分期,我可以:

A. git add 这3个文件包含新功能,2个文件包含错误修复,然后将其提交为“生产就绪提交” (准备部署,例如:通过自动方式上传到公共 http 服务器)。 我的其他 4 个未完成的文件不会包含在提交中

B. git add 这三个文件包含新功能然后提交,然后 git add 这两个文件包含错误修复,然后使用不同的提交消息进行单独提交以获得更好的可追溯性

这个“分期”的另一个好处是让我有时间最后一次“审查”我的更改。在这个“最后审查”时间里,我可以更彻底地发现错误以防止错误(例如:错字)

我知道写git add filename_here 3-5次不太实用 在每次提交之前(或者更多次,如果你更改了更多文件),所以我使用像 lazygit 这样的 git 客户端来自动化暂存 (我只需单击要暂存的文件的文件名)

使用lazygit,我什至可以部分暂存文件(例如:7 行中只有 5 行更改)。当某些更改不是很精细时(例如:更改了包含类定义的文件,我更改了 3 个方法/函数的定义,其中 2 个方法/函数已准备好提交而 1 个尚未准备好),这将非常有用。

您可以使用其他 git 客户端进行“预览和点击”登台:sourcetree (windows)、gitextensions (windows/linux)

免责声明:我不拥有或贡献以上这些 git 客户端,我只是觉得它们非常有帮助并希望分享

【讨论】:

【参考方案2】:

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

“索引”保存了工作树内容的快照,正是这个快照被作为下一次提交的内容。因此,在对工作树进行任何更改之后,在运行 commit 命令之前,您必须使用 add 命令将任何新的或修改过的文件添加到索引中。

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

使用 git-add1 在使用 commit 命令之前逐步“添加”对索引的更改(注意:即使修改过的文件也必须“添加”)。

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

【讨论】:

以上是关于为啥有人应该在 git commit 之前使用 git add?或者为啥有人应该使用 git add 呢?的主要内容,如果未能解决你的问题,请参考以下文章

git commit 前8位为啥不重复

git回退之前版本

合并来自 git revert 的冲突 - 我应该接受当前的更改还是传入,为啥?

为啥我的git中没有commit and push

git 要commit之前先pull, 这样做法合理吗?

在 git commit 之前隐藏文件中的字符串