Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git添加和Git提交混淆_Git - Fatal编程技术网

Git添加和Git提交混淆

Git添加和Git提交混淆,git,Git,我基本上知道git add和git commit的区别,前者表示“我想将此文件添加到下一个快照中”,后者表示“拍摄快照” 但是,当我运行git add file1然后从我的工作目录中删除file1,然后运行git commit时,它仍然可以工作。不知何故,快照是在添加时拍摄的,而不是在提交时拍摄的。我说的对吗?git commit通过 查看(添加文件的位置) 而不是通过查看(您将继续修改内容,包括添加或删除文件) 见“ 在您的情况下,删除文件后(但将其添加到索引后),git状态将为您提供:

我基本上知道
git add
git commit
的区别,前者表示“我想将此文件添加到下一个快照中”,后者表示“拍摄快照”


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

git commit通过

  • 查看(添加文件的位置)
  • 而不是通过查看(您将继续修改内容,包括添加或删除文件)
见“

在您的情况下,删除文件后(但将其添加到索引后),
git状态将为您提供:

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
第二,要“一点一点”地完成,必须使用git add,然后提交。

提交包含索引中的所有内容。

实际上,您所知道的内容中缺少了一些内容

添加该文件时,实际上有两个副本。您拥有工作树副本,这是您可以使用普通文本编辑器等查看和编辑的普通文件系统副本

但是,另外,索引中还有一个副本
git add
将文件及其内容从工作树复制到索引中。这是制作该特定文件的实际快照的地方

当您随后发出一个
git commit
时,索引将存储到commit中。在这一点上,工作树(也称为磁盘上)中的内容是或不是无关紧要的。指数才是最重要的

这就是为什么您会看到文件仍在添加中。它是用
git add
复制到索引的,即使您随后将其从磁盘中删除,
git commit
也将该索引用作提交的源


有一个单独的索引来组成下一次提交的结果是,您可以决定下一次提交将包含什么内容,而不仅仅是“此时磁盘上的所有内容”。好的git工具甚至可以让您将文件复制到索引中,只需部分更改,这样,如果您对一个文件进行了2次或更多更改,您就可以决定是将对该文件的所有更改都提交到下一次提交中,还是仅提交其中一次或几次。

您完全正确。不仅如此,当您添加文件时,文件仍保持原样。如果您以后更改它,然后提交,它将保存在修订中,与您请求添加它时的状态相同,而不是当前状态。修改过的文件也会发生同样的情况(以防您认为它只适用于新文件)。如果您提交了一个文件并对其进行了修改,git只会在添加该文件后将其与新内容一起保存,以便进行以下修订。

工作树=工作目录吗?@Giant8是的,这些术语引用了相同的概念谢谢!然而,我仍然在想,拥有两个不同命令的真正实用程序是什么,为什么不让一个命令同时执行这两个命令呢。当有人想在以后使用
add
而不使用
commit
时,是否有一些有用的例子?@Giant8我一直在使用它。当你做了很多修改后,你最不想做的就是一次巨大的提交。您只添加一个小的一致子集,进行第一次提交,添加其余部分,一点一点,一路上进行小的提交。若在同一个文件中进行了多次修改,甚至可以添加文件的一部分而不是全部文件。请参阅“交互式登台”:@Giant8我已编辑了我的答案以回应您的评论。“一点一点”意味着首先在索引中添加“little”,然后提交。工作树是工作目录的另一个名称,对吗?是的,尽管我相信已经建立的git术语是“工作树”。但基本上它是磁盘上的文件和文件夹,这是正常操作系统工作流程的一部分,就像完全忽略整个git部分一样。“我相信”意味着我不是100%确定,谢谢!我仍然在想,拥有两个不同命令的真正实用程序是什么,为什么不让一个命令同时执行这两个命令呢。如果有人想在以后使用
add
而不使用
commit
,是否有一些有用的情况?@Giant8没有,但恰恰相反。您可以在不添加所有更改的文件的情况下提交,因为您实际上已经做了两个或更多单独的更改。例如,您可能已经重构了一个类,以便更好地分离其中的职责,并在其他地方添加了对从数据库读取数据的支持。这两件事最好是两次提交,并附上适当的注释,而不是将它们混为一谈。因此,您可能希望在提交之前只添加部分文件,然后再添加其余的文件,依此类推。如果您的虚拟提交只是提交工作文件夹的当前状态,那么确实,您只需要在较小的部分中进行更改,并在其间提交。您可以执行一个
git commit-a…
,它将在实际提交之前自动添加所有更改的文件,本质上是将
git add
git commit
组合到一个命令中。那么拥有两个不同命令的真正实用程序是什么,为什么不只拥有一个同时执行这两个命令的命令呢。当有人想在以后使用
add
而不使用
commit
时,是否存在一些有用的情况?实际上?对您可以修改几十个文件,然后选择您真正想要提交的文件。有什么好抱怨的?索引(提交时将用于实际修订)是git的奇迹之一。以防万一,您可以始终使用git commit-a
,但我不喜欢它。我喜欢选择要提交的部分。这还允许一个工作流。你可以添加你认为已经准备好的东西。。。然后你就可以享受改装的奢侈了
git commit -am "Let's add everything"