9

git book定义了git 索引:

Git 索引用作工作目录和存储库之间的暂存区域。您可以使用索引来构建一组要一起提交的更改。创建提交时,提交的是当前索引中的内容,而不是工作目录中的内容

但是我仍然很难理解它,尤其是突出显示的“提交的内容不是我的工作目录中的内容”的声明。

到目前为止,在我有限的 git 工作中,工作目录中的所有内容总是被提交,如果我这样做:

git add <all new files in the working directory>
git commit -a -m "git will refuse to commit without this comment" 

git 然后提交所有修改过的文件以及所有新文件。

那么,实际上,我的工作目录暂存区吗?

我不确定那是什么git index以及它如何被解释为暂存区。

你能解释一下吗?

4

4 回答 4

7

诀窍是:

当您将 (git add) 添加到索引时,您不必立即提交

因此,如果您添加一些超级复杂的功能,然后继续更改并...最终完全破坏它,您仍然可以提交,因为您的索引中有什么(您在 10 分钟前添加的内容,然后通过进一步失败的修改破坏它)不是您当前工作树中的内容(现在已无可救药地损坏了)。

因此,它可以帮助不时向索引添加当前的开发工作,因为您知道您可以随时提交您索引的最后一个“稳定”状态。


另一种提交的方式不是你的工作树中的内容是当你git add --patch

在索引和工作树之间以交互方式选择补丁块并将它们添加到索引中。
这使用户有机会在将修改的内容添加到索引之前查看差异。

您可以将当前文件的一部分添加到索引中(就像您正在编写的三个函数之一),然后只提交.

于 2011-07-09T14:53:56.360 回答
5

索引是由 git 管理的目录树的副本。最初,它是 HEAD 提交中内容的副本。 git add将文件从工作目录复制到索引。 git commit从索引中的内容创建一个新的提交。

索引就像一个缓冲区——它不存储在 git 历史记录中,但对它的访问由 git 控制(与您的工作目录不同,它可以通过多种方式访问​​)。git 从索引提交,所以提交的是 git 控制的东西。

于 2011-07-09T14:56:35.493 回答
4

在您的特定情况下,答案是您正确理解了文档,但使用“快捷方式”命令提交整个工作目录。

如果您运行,git commit -a -m "Message"那么您的工作目录将被视为暂存区。有时这很方便,但您失去了按设计使用索引的能力。尝试以下命令:

git commit -m "Message"

如果您改为这样做,则可以使用暂存区域仅提交您对工作目录所做的部分更改。

于 2011-07-09T14:59:02.033 回答
3

索引/暂存区不是您的工作目录。你可以做一个简单的测试来看看这个。在您的工作目录中创建一个文件,例如,foo. 在文件中添加一些文本。然后做git add foo。现在foo再次编辑并添加(或删除)更多文本。

如果您运行git diff --cached(显示索引中的内容),您只会看到foo第一轮编辑和后续git add. 如果这样做git diff(显示工作目录中的更改),您将看到自git add.

于 2011-07-09T14:56:47.560 回答