首页 > 解决方案 > git add 和 git commit 混淆

问题描述

git add我基本上知道“我想将此文件添加到我的下一个快照”和git commit“拍摄快照”之间的区别。

但是,当我运行git add file1然后file1从我的工作目录中删除然后运行git commit它仍然可以工作。不知何故,快照是在添加时拍摄的,而不是在提交时拍摄的。我对吗?

标签: git

解决方案


git commit 通过

  • 查看索引(您添加文件的位置),
  • 不是通过查看工作树(您继续修改内容,包括添加或删除文件)

请参阅“ Git 中 HEAD、工作树和索引有什么区别?

在您的情况下,删除文件后(但将其添加到索引后), agit status会给您:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   go.mod

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    go.mod

该文件是:

  • 准备好成为下一次提交的一部分
  • 本地删除

Agit restore -- <myFile>足以在本地恢复它。


工作树(或工作目录)是实际签出文件的树。
工作树通常包含 HEAD 提交树的内容,以及您已进行但尚未提交的任何本地更改。


这个想法是准备你的下一次提交,而不是盲目地将你当前的所有修改放入一个巨大的提交中。
最好进行小的连贯提交而不是巨大的提交,以获得合乎逻辑的历史记录,并使未来git bisect更容易。

您甚至可以暂存(添加到索引)文件的一部分交互式暂存

OP补充说:

想象一下,提交完成了实际提交和添加的工作。
让我们称之为虚构的提交。
您仍然可以使用虚构的提交一点一点地完成这项工作

首先:该命令(添加所有并提交)确实存在:

git commit -am "Let's add everything"

其次,要“一点一点”,你必须使用 git add,然后提交。
提交会获取索引中的所有内容。


推荐阅读