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
是什么以及如何将其解释为临时区域。
你能解释一下吗?
答案 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"
如果您这样做,您可以使用暂存区域仅提交您对工作目录所做的部分更改。