Git 表示文件已被修改,即使它没有

Git says a file is modified even though it's not

所以我在我的分支 internal_env_board2 并且我正在尝试切换到分支 battery_board.但是,当我尝试这样做时出现错误:

$ git checkout battery_board
error: Your local changes to the following files would be overwritten by checkout:
        internal_env_board/internal_env_board2/internal_env_board_with_LCD_BOM.xlsx
Please commit your changes or stash them before you switch branches.
Aborting

我很生气,因为我知道我没有修改这个 .xlsx 文件。我唯一做的就是打开 excel 文件,查看其内容,然后再次关闭它。出于某种原因 git 认为此文件中有更改。我尝试使用 git diff 来查找工作树副本和最近提交的副本之间的差异,并得到以下信息:

$ git diff HEAD internal_env_board_with_LCD_BOM.xlsx
diff --git a/internal_env_board/internal_env_board2/internal_env_board_with_LCD_BOM.xlsx b/internal_env_board/internal_env_board2/internal_env_board_with_LCD_BOM.xlsx
index 0fb3369..10c945e 100644
Binary files a/internal_env_board/internal_env_board2/internal_env_board_with_LCD_BOM.xlsx and b/internal_env_board/internal_env_board2/internal_env_board_with_LCD_BOM.xlsx differ

我很难理解这个 diff 命令的输出。它只是告诉我它们不同,但不是如何不同。

所以我想我的两个问题是:

1.为什么 git 认为我只是因为我打开了一个文件而修改了它?

2。如何读取 git diff HEAD 命令的输出?

更新评论中的后续问题


  1. 好吧,您可能对错误的工具感到恼火。如果文件的 stat 信息发生变化,git 认为文件已被修改 - 即通常它的大小或 "last modified" 时间戳现在与您签出时不同。我们很难说为什么数据会发生变化。我可以说 Excel 的某些(如果不是全部)版本在定义 "change" 方面相当激进。我已经看到移动活动单元格被视为更改,如果保存了这样的东西,那么文件 不同的,即使它的有用内容不是。

使用 stat 信息是 git 检查工作树更改的方式,因为 (1) 它对于行为良好的程序是可靠的(特别是,当且仅当该文件在任何合理的情况下都没有被更改); (2) 尝试检查内容会非常缓慢。 (git 确实有一些技巧,只要被比较的两个版本都在索引中或已提交,就可以进行快速内容比较;但那是另一回事了。)即使是内容比较也是逐字节检查文件本身 - 不是电子表格数据的逐个单元格比较,因为 git 不知道任何关于 Excel 的具体信息;因此,如果 Excel 实际上以任何方式修改了文件,git 无论如何都会将其标记为已修改。

  1. 默认情况下,git diff 不会尝试告诉您很多关于二进制文件的更改,因为它不假定它可以以有意义的方式这样做。在您显示的输出中,第一行确认正在比较的文件名;第二行给出了一些关于 git 如何识别文件版本的管理信息;第三行说这个文件是二进制的,因此默认工具不能给你细节,除了说它们确实不同,事实上。 (回到上面的第 (1) 点,确认某些东西 - 可能 Excel - 确实对文件进行了更改,这就是为什么 git 说它已被修改。)

如果你能找到一个更有意义地比较 Excel 文件的工具,你可以告诉 git 在比较这个文件的版本时使用它(通过 gitattributes);不过,我没有推荐这样的工具。


Is there a way to hold a gun to Git and say, "Hey I know there is a difference but discard it because I don't care and go to the new branch anyway"?

如果更改尚未 added(即 status 将其显示为未暂存的更改),您可以

git checkout -- path/to/the/file.xslx

如果更改已被 add 编辑(即 status 将其显示为已准备好提交的更改),您可以

git reset -- path/to/the/file.xslx

然后就unstaged了,可以按上面的方式处理。

为了将来参考,status 的输出会告诉您使用什么命令来还原更改。

你不能责怪 Git,如果 Excel(在某些情况下)每次打开文件时都修改文件。

此外,您不能指望 Git 以有意义的方式报告此类文件的更改:diff 提供文本文件的有用信息,.xlsx 是二进制文件。

查看答案 here and here and here 是否有帮助。

您也可以尝试确认您的 Excel 确实正在修改每个 .xlsx 的(时间戳 and/or 内容),只是打开 - 我没有遇到过。并且,作为最后的手段,您可以尝试在 XLSX 查看器或 LibreOffice Calc 中打开它。