【问题标题】:What's the difference between git diff and gif diff-indexgit diff 和 gif diff-index 有什么区别
【发布时间】:2014-06-13 04:15:27
【问题描述】:

当我想获取 git diff 文件时,发现有人在使用

git diff-index --cached  --diff-filter=AM --name-only  HEAD

如果我使用

git diff --cached --diff-filter=AM --name-only  HEAD 

可以得到相同的结果。 那么git diffgit diff-index 有什么区别呢? 什么时候必须使用git diff-index 而不是git diff

【问题讨论】:

    标签: git


    【解决方案1】:

    git diff-index 是与索引或工作树的差异:

    将在树对象中找到的 blob 的内容和模式与工作树中相应的跟踪文件或索引中的相应路径进行比较

    git diff 更通用,可以比较两个文件,或两个提交,或(如 diff-index)树和索引。

    在您的情况下,diff HEAD 确实会将 HEAD 与索引进行比较,diff-index 也会这样做。

    【讨论】:

    • 什么是索引?
    • @Will 索引是您准备下一次提交的地方。 Linux Torvalds 在 2005 年制作 Git 时,需要一个工具来添加多个更改而忽略其他更改,以便准备下一次 Linux 代码提交。更多信息:stackoverflow.com/a/4086986/6309
    • git diff-index 并不总是针对索引。正如文档所说:“将树与工作树或索引进行比较”
    • @Droopycom 同意。我已经相应地编辑了答案。
    【解决方案2】:

    diff-index 是一个较低级别的操作,它执行的操作更少但速度更快,因为它不查看内容,它只检查时间戳等元数据。只有 Linux,您可以通过以下方式验证这一点:

      strace -f -e file -o diff-index.log git diff-index HEAD
      wc diff-index.log
      less diff-index.log
    

    除非你有一些 git 性能问题需要解决,否则别管 diff-index。

    https://git-scm.com/docs/git-update-index#_using_assume_unchanged_bit

    https://public-inbox.org/git/loom.20160331T143733-916@post.gmane.org/

    【讨论】:

      【解决方案3】:

      在调查了这两个命令之间的区别后,我发现了奇怪的行为:

      看起来git diff-index 是敏感的,如果文件已更改但内容未更改。而git diff 在这种情况下不敏感。

      换句话说,如果您想知道文件是否未更改但您不关心上次更改的时间戳是否已更改,请使用git diff

      • 注意:我不确定我在这里是否正确。

      【讨论】:

        猜你喜欢
        • 2015-11-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 2017-02-14
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 2011-05-01
        相关资源
        最近更新 更多