所以我在我的分支 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
命令的输出?
答案 0 :(得分:2)
更新以评论中的后续问题
git
认为,如果文件的stat
信息已更改,则该文件已被修改-即通常其大小或“上次修改的”时间戳现在与签出时不同。我们为什么很难说为什么数据会改变。我可以说,某些(如果不是全部)Excel版本在定义“更改”方面非常积极。我已经看到移动活动单元被视为更改,并且如果保存了这样的内容,则文件 是不同的,即使其有用的内容没有。使用stat
信息是git检查工作树更改的方式,因为(1)它对于行为良好的程序是可靠的(特别是因为,只有在文件没有被修改时,修改的日期才应该匹配)在任何合理情况下更改); (2)尝试检查内容会非常缓慢。 (git
确实有一些技巧,只要被比较的两个版本都在索引中或已提交,就可以进行快速的内容比较;但这是另一回事了。)即使是内容比较也将是逐字节检查文件本身-而不是电子表格数据的逐单元比较,因为git
并不完全了解Excel;因此,如果Excel实际上以任何方式修改了文件,则git
会根据设计将其标记为已修改。
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)