【问题标题】:What is the difference between the working directory and the git Index?工作目录和 git 索引有什么区别?
【发布时间】:2011-10-01 21:40:44
【问题描述】:

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 是什么以及它如何被解释为暂存区。

你能解释一下吗?

【问题讨论】:

    标签: git git-commit git-index


    【解决方案1】:

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

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

    git commit -m "Message"
    

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

    【讨论】:

    • 这是对我理解的一个很好的改进,即工作目录和 git 索引之间的区别是git add。我是否应该将该措辞更正为“工作目录和 git 索引之间的区别是 git add -a
    • 不,你一开始是对的。工作目录和索引之间的区别在于您是否在文件上运行了 git add 并进行了更改。问题是运行git commit -a 有点像运行git add --update 然后git commit
    • 你远不是一无所知... :) 谢谢+1。
    • 哎呀...git add -a 我的意思是“git add plus commit -a”。我希望这不会改变你的答案。
    • 我觉得还是有道理的。在您最初的问题中,您说what is committed is what is currently in the index, not what is in your working directory 令人困惑。我认为这是因为您使用了git commit -a,而该声明不适用。
    【解决方案2】:

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

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

    【讨论】:

    • 这是不正确的,因为git commit -a 不会提交对新文件的更改。 OP 应该必须按照所述对新文件使用git add
    • @Clueless:这只是我回答的一小部分,与手头的问题几乎无关。请不要因此而投反对票。我已经编辑了我的答案。
    • @siride 我在工作目录中有一个完整的子目录,尽管使用了commit -a,但它一直在变化,但从未提交,因为我从未添加它。 @Clueless 感谢 +1 指出这一点,因为 @siride 的声明真的让我很困惑。
    • @WinWin:我没有注意你说你要添加新文件的部分。自从你在那里是正确的以来,我已经完全摆脱了它。很抱歉造成混乱!
    【解决方案3】:

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

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

    【讨论】:

    • 您的声明“git add 将文件从工作目录复制到索引。”正是我的理解所缺少的。谢谢+1。
    【解决方案4】:

    诀窍是:

    当你添加 (git add) 到索引时,你不必马上提交

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

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


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

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

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

    【讨论】:

    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2023-02-09
    • 1970-01-01
    相关资源
    最近更新 更多