为什么在 git diff 或 git status 之后,触摸文件的 git diff-index HEAD 结果会发生变化?

2024-01-02

If I touch在 git 存储库中跟踪的文件,然后运行git diff-index HEAD,它将打印输出M表明文件已被修改。例如,

$ touch foo
$ git diff-index HEAD
:100644 100644 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 0000000000000000000000000000000000000000 M  foo

我不确定这是否有意义,但这不是问题所在。问题是,如果我运行,为什么输出会改变(没有差异)git diff HEAD or git status?

$ touch foo
$ git diff-index HEAD
:100644 100644 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 0000000000000000000000000000000000000000 M  foo
$ git diff                  # no output
$ git diff-index HEAD       # no output

我希望结果,无论是什么,在不应该改变任何东西的命令中保持不变。


我们先看一下输出的含义:

:100644 100644 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 0000000000000000000000000000000000000000 M  foo

手册 http://git-scm.com/docs/git-diff-index内容如下,从左到右:

  1. a colon.
  2. “src”模式;如果创建或未合并,则为 000000。
  3. a space.
  4. “dst”模式;如果删除或未合并,则为 000000。
  5. a space.
  6. sha1 代表“src”; 0{40}(如果创建或未合并)。
  7. a space.
  8. sha1 代表“dst”; 0{40} 如果创建、取消合并或“查看工作树”。
  9. a space.
  10. 状态,后跟可选的“分数”数字。
  11. 使用 -z 选项时为制表符或 NUL。
  12. “src”的路径
  13. 使用 -z 选项时为制表符或 NUL;仅存在于 C 或 R 中。
  14. “dst”的路径;仅存在于 C 或 R 中。
  15. 使用 -z 选项时为 LF 或 NUL,以终止记录。

有趣的是第8点:

sha1 代表“dst”; 0{40} 如果创建、取消合并或“查看工作树”。

因此,在您的情况下,您会得到 40 个零,因此这意味着“创建”、“取消合并”或“查看工作树”。由于您只触及了该文件,并且它已经被跟踪,因此您可以消除前两个选项。这给我们留下了“看工作树”.

如果你这样做,使用git diff(它将尝试为所有更改生成实际内容差异,并因此实际查看文件内容),然后 Git 显然发现毕竟没有更改,因此后续调用不再说明任何内容。

这个观察让我相信默认情况下git diff-index只会快速查看文件,而不会实际比较任何内容。由于您修改了文件日期,Git 认为它“可能已更改”,并且需要更详细的查看才能正确找出它。

如果你跑git diff-index如果有一个选项要求它更彻底地查看文件,那么它也不会发现任何更改,例如当使用-p生成补丁的选项(这是一种git diff does).

所以假设一个文件可能只是性能优化could如果文件修改日期被更改,则被更改,但没有做出实际声明;相反,它只会留下一个“稍后再看”的标记。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 git diff 或 git status 之后,触摸文件的 git diff-index HEAD 结果会发生变化? 的相关文章

  • 执行 git Push 时出现“diff.renamelimit 变量”警告

    我将本地提交推送到远程 git 服务器并收到以下警告消息 remote warning only found copies from modified paths due to too many files remote warning y
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 自动同步两个 git 存储库

    是否可以保持同步两个 Github 存储库 远程 的特定文件夹 有两个 github 存储库 repoA 和 repoB 这两个存储库都有名为 ABC 的文件夹以及其他独特的文件夹 如果repoA的文件夹ABC中的任何文件有更新 我想自动更
  • TortoiseGit - 更改默认合并消息

    系统描述 Windows 7的 git版本2 10 1 windows 1 乌龟Git 2 3 0 0 I want 合并提交消息在不同的情况下有所不同fully自动方式 no manual amend Summary 在windows上
  • 如何使用 git --word-diff 显示空格差异?

    为了说明问题 参见diff https github com nim lang Nim commit 47c7fd037ed28b7de3d120b003d059d30e18f128 diff split diff 8af935b2312d
  • 使用 TFS REST API 获取 Git 提交的最新关联工作项

    我正在尝试获取关联的工作项使用 TFS REST API 进行 GIT 提交 https www visualstudio com en us docs integrate api git commits 我的请求 URL 如下所示 htt
  • 如何获取 git 存储库中所有文件的计数?

    如何获取 git 存储库中当前所有文件的计数 您可以使用以下命令获取 git 存储库中所有跟踪文件的计数 git ls files wc l 命令分解 The git ls files命令本身打印出存储库中所有跟踪文件的列表 每行一个 Th
  • 合并后 Git 分支和提交历史记录

    我正在开发一个项目 单独 对于我开发的每个功能 我都会创建一个新分支 处理该功能 然后将其合并到 master 中 所以通常我不会同时在两个不同的分支上工作 也不会在一个分支上工作时接触master 当我合并一个分支时 我看到 使用gitx
  • Android repo 脚本创建的 .repo/projects/ 中的裸 git 存储库的用途是什么?

    The 安卓源码 http android git kernel org 由以下人员管理repo http source android com source version control html 使用 repo 同步时 一个名为 re
  • 在种子项目上构建时如何组织 git 存储库

    我正在基于从 github 克隆的种子项目 MEAN io 构建一个网站 如何将这些文件与我自己的文件分开 由于该种子提供了广泛的文件框架 因此我自己的文件分布在整个项目中 我希望能够从种子中提取更新 但不能将其与我添加的文件混合 我知道我
  • 在 python 中找不到 git 可执行文件

    我试图使用访问密钥克隆 git 存储库 但是当我尝试运行它时 它抛出一个异常 说找不到 git 可执行文件 但我已经安装了 git 并且 in it py 显示了正确的路径 C Program Files Git bin 我还安装了 git
  • 有什么方法可以从提交的消息中获取提交的 SHA 值吗?

    当做一个git tag 我并不总是擅长记住 HEAD 6 例如 是包含的还是排他的 鉴于我的大多数提交都以问题号为前缀 我想知道是否有一些神奇的命令可以从其消息的一部分中搜索提交 SHA 我知道这很容易做到git log并从那里开始工作 但
  • git rebase 吃了我的提交!为我翻译“git reflog”输出?

    我已经完成了五次提交 我想在推送它们之前将它们全部合并为一次提交 出于某种原因 我决定尝试通过与通常使用的不同的方式来做到这一点 FWIW 我试图按照此处的说明进行操作http gitready com advanced 2009 02 1
  • Git - 使用多个遥控器来跟踪同一分支和服务器

    我正在尝试在我与其他人共享的远程服务器上设置 Git 存储库 唯一的问题是 它位于我的局域网中 而我并不总是属于其中 我希望能够有 2 个遥控器使用同一个分支 全部同步 几乎像符号链接 但带有配置 更困难的是 如果我尝试在 LAN 中使用外
  • gitignore 匹配子目录中带有前缀和后缀的文件

    我喜欢只跟踪以 es 开头并以 h 或 m 结尾的文件 所以我尝试了这个 exlude all except es h es m and exlude all except es h es m 但对于子目录中的文件都不起作用 当你忽略一切
  • 将 GIT 存储库中的文件标记为暂时忽略

    我们正在从 Perforce 迁移到 GIT 当然 我希望存储库中有一些文件 但个人开发人员不应该定期签入它们 诸如 eclipse 项目文件之类的东西 每个开发人员可能会获得初始的 project 文件 但随后会根据自己的环境稍微调整它
  • 在 Jenkins 项目中加载私有存储库子模块

    我目前正试图让詹金斯 克隆项目及其子模块 使用部署密钥配置为 Github 私有存储库验证 Jenkins CI https stackoverflow com questions 5212304 authenticate jenkins
  • 有没有办法强制 git merge 始终使用外部合并工具?

    有没有一种方法可以配置 git merge 使冲突解决始终通过外部合并工具进行 我正在编写语义合并的配置 并且存在这样的情况 git 错误地处理了这些情况 但可以通过语义合并正确解决 两个开发人员在同一文件的两个不同位置添加了相同的方法 问
  • 如何编辑 git 中任何提交的提交消息? [复制]

    这个问题在这里已经有答案了 假设我有 3 个未推送的提交 现在我想更改第一次或第二次提交的提交消息 更改第三次提交的提交消息很简单 使用git commit amend 怎么做 回到子问题 是否有一个git commit amend对于先前
  • 如何调试 git Remote set-url 不起作用

    我无法更改 git 远程 urlgit to https 如下图所示 git remote set url不工作 git remote v 来源 git github com userName repoName git 获取 原点 git

随机推荐

  • 授予角色时出现缺少权限错误

    我在尝试向服务器管理员授予角色时遇到问题 对于常规权限 它工作正常 但如果它是服务器管理员角色 或具有权限的其他角色 即使我是所有者 它也会给出以下错误 discord ext commands errors CommandInvokeEr
  • 快速关系数据库,可与 Python 简单使用[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 对于我的链接抓取程序 用 python3 3 编写 我想使用数据库来存储大约 100 000 个网站
  • Java 重写 hashCode() 方法有任何性能问题吗?

    如果我会覆盖hashCode 方法会降低应用程序的性能 我在应用程序的许多地方重写了这个方法 是的 如果 hashCode 方法的实现方式不好 则可能会降低散列集合的性能 hashCode 方法的最佳实现应该为唯一对象生成唯一的 hashC
  • Android webview 中的缓存

    Android webview中加载移动网页和非移动网页哪一种更快 加载缓存还是根本不加载 加载它的推荐样式是什么 现在 当我不在所有非移动网站上加载缓存时 加载速度比在本机浏览器中加载它们时要慢得多 不要使用这些 viewer getSe
  • Rails 使用什么 Ruby 技术来使我的控制器方法呈现视图?

    只是好奇是否有人知道在 Rails 框架中使用什么 Ruby 技术来完成以下任务 如果我不写 比如说 index方法在 Rails 控制器上 如果 URL 与该路由匹配 Rails 仍将呈现索引视图文件 这是有道理的 因为我的控制器继承自父
  • 对 C# 类中的属性进行排序

    我们需要解析的文件格式如下 v1 000 sammy endpoint blah 它是供应商向我们提供的有序固定宽度格式 因此这 5 个字段中的每一个都映射到类中的特定属性 实际格式有 gt 30 我想通过将序列应用于属性来使用反射来解析它
  • pandas:基于开始/结束日期的聚合

    它实际上是一个反聚合 因为我有一个这样构造的数据集 id type first year last year A t1 2009 2014 A t1 2010 2015 B t1 2007 2009 B t2 2008 2011 但我需要按
  • 处理 DDD 中的嵌套聚合

    我刚刚开始使用 DDD 并且在弄清楚如何适应数据的关系性质时遇到了一些困难 我拥有我相信会被视为我的聚合根的东西 但聚合也有它自己的聚合 不想违反德墨忒尔定律 我想知道我的想法是否错误 并希望一些 DDD 专家可以提供一些见解 我的聚合根是
  • 将 tibble 转换为带有列标题的数据框

    我从 Excel 工作表导入数据 如下所示 F4 Off lt readxl read xlsx myExcel xlsx sheet Offline col names TRUE range I1 L285 F4 Off F4 On lt
  • React - 替换 props.children 中的子组件

    正如在另一个中看到的question https stackoverflow com questions 32370994 how to pass props to this props children 可以使用 React Childr
  • Laravel - 使用哪个缓存驱动程序?

    这是我第一次处理缓存 尽管我浏览了 laravel 文档和其他各种网站以获取如何设置它的说明 但我仍然有点不知所措 不知道该使用哪个以及有什么不同缓存驱动程序可以 我当前的情况是 我有一个日程安排系统 您可以在其中创建本周课程的 pdf 文
  • 如何从电子中的 new BrowserWindow() 获取窗口对象?

    有没有办法重用窗口对象 这可能是必要的 因为相应的窗口可能是动态生成的 var electron require electron var app electron app var BrowserWindow electron Browse
  • 处理器在等待主内存读取时做什么

    假设 L1 和 L2 缓存请求导致未命中 处理器是否会停止运行 直到访问主内存为止 我听说过切换到另一个线程的想法 如果是的话 用什么来唤醒停滞的线程 现代 CPU 中会同时发生很多很多事情 当然 任何需要内存访问结果的事情都无法进行 但可
  • OpenCV+Eclipse+Android:错误org.opencv.video Video.java

    我一直在安装 OpenCV 这是教程 http docs opencv org doc tutorials introduction android binary package android binary package html 我阅
  • UWP:应用程序栏/命令栏中的图标大小

    我应该使用什么尺寸的图标应用栏 命令栏 https msdn microsoft com en us windows uwp controls and patterns app bars 我找不到东西磁贴和图标资源指南 https msdn
  • 如何更改ggplot2中图例标签上的科学记数法

    我编写此代码是为了创建地图 ggplot data Canada2015 Import 3 borders database world colour grey60 fill grey90 geom polygon aes x long y
  • 如何获取vim中当前正在比较的文件列表

    我正在编写一个 vim 插件 在其中我需要确定当前正在比较的所有文件 这就是那些diff已设置 我已经仔细阅读了手册 但找不到太多内容 是否有可能做到这一点 这个问题实际上与问题相关如何检测 vim 中窗口的位置 https stackov
  • Zend2 控制器中的 PHPExcel

    我正在尝试让 PHPExcel 与 Zend2 一起使用 实际上它正在工作 但不符合我的预期 我可以写入文件 但不能在不保存的情况下下载 我找到了一些例子 你只需做这样的事情 objPHPExcel header Content Type
  • putty网络错误权限被拒绝如何解决

    我使用 PuTTy exe 作为 SSH 客户端 但 putty exe 不适用于 64 位 Windows 操作系统 它在 32 位 Win 操作系统下完美运行 问题 我是否犯了一些错误 如果是这样 你能帮忙吗 有没有可以在 32 位和
  • 为什么在 git diff 或 git status 之后,触摸文件的 git diff-index HEAD 结果会发生变化?

    If I touch在 git 存储库中跟踪的文件 然后运行git diff index HEAD 它将打印输出M表明文件已被修改 例如 touch foo git diff index HEAD 100644 100644 257cc56