Git说一个文件被修改,即使它没有

时间:2018-12-12 01:38:54

标签: git git-checkout git-diff

所以我在我的分支 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 命令的输出?

2 个答案:

答案 0 :(得分:2)

更新以评论中的后续问题


  1. 好吧,您可能会因为使用错误的工具而感到恼火。 git认为,如果文件的stat信息已更改,则该文件已被修改-即通常其大小或“上次修改的”时间戳现在与签出时不同。我们为什么很难说为什么数据会改变。我可以说,某些(如果不是全部)Excel版本在定义“更改”方面非常积极。我已经看到移动活动单元被视为更改,并且如果保存了这样的内容,则文件 是不同的,即使其有用的内容没有。

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

  1. 默认情况下,git diff不会尝试告诉您有关二进制文件的更改的更多信息,因为它不假定它可以以有意义的方式进行更改。在显示的输出中,第一行确认正在比较的文件名;第二行提供一些有关git如何识别文件版本的内务管理信息;第三行表示此文件是二进制文件,因此默认工具无法提供详细信息,除了说它们确实不同之外。 (回到上面的第(1)点,确认某些内容-可能是Excel-确实对文件进行了更改,这就是git说它已被修改的原因。)

如果您找到一个更有意义地比较Excel文件的工具,则可以告诉git在比较此文件的版本时使用它(通过gitattributes);不过,对于这种工具,我没有任何建议。


  

是否有办法将枪对准Git说:“嘿,我知道有区别,但要丢弃它,因为我不在乎,还是去新的分支机构?

如果尚未add进行更改(即status将其显示为未分阶段的更改),则可以

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

如果更改已add完成(即status将其显示为已提交的更改),则可以

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

然后它将被取消登台,并且可以按上述方式进行处理。

为了供将来参考,status的输出确实会告诉您要使用哪些命令来还原更改。

答案 1 :(得分:1)

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

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

查看答案hereherehere是否有帮助。

您可能还会尝试确认您的Excel确实只是在开放状态下修改了每个.xlsx(时间戳和/或内容)-我没有遇到过。而且,作为最后的选择,您可以尝试使用XLSX查看器或在LibreOffice Calc中打开它。