工作目录和git索引有什么区别?

时间:2011-07-09 14:48:03

标签: git git-commit git-index

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 个答案:

答案 0 :(得分:7)

诀窍是:

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

因此,如果你添加一些超级复杂的函数,然后继续更改并...最终完全打破它,你仍然可以提交,因为索引中的内容(你在10分钟之前添加的内容在进一步打破之前)失败的修改)不是你工作树当前的东西(现在已经无可救药地破坏了)。

因此,它可以帮助不时地向索引添加当前的开发工作,知道您可以随时提交最后一个稳定的&#34;陈述你已编入索引。


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

  

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

如果您运行git diff --cached(显示索引中的内容),您将只看到第一轮修改后的foo和后续git add。如果您执行git diff(显示工作目录中的更改),您将看到自git add以来所做的所有其他修改。

答案 3 :(得分:2)

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

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

git commit -m "Message"

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