And*_*der 2 git git-diff git-checkout
所以我在我的分支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
Run Code Online (Sandbox Code Playgroud)
我很生气,因为我知道我没有修改这个 .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
Run Code Online (Sandbox Code Playgroud)
我在理解这个 diff 命令的输出时遇到了很多麻烦。它只是告诉我它们不同,但不是如何。
所以我想我的两个问题是:
1. 为什么git只因为打开了文件就认为我修改了文件?
2. 如何读取 命令的输出git diff HEAD ?
更新评论中的后续问题
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
Run Code Online (Sandbox Code Playgroud)
如果更改已被add编辑(即status显示为已更改暂存以提交),您可以
git reset -- path/to/the/file.xslx
Run Code Online (Sandbox Code Playgroud)
然后它就会被unstaged并且可以像上面那样处理。
为了将来参考,从的输出status确实会告诉您使用哪些命令来恢复更改。
| 归档时间: |
|
| 查看次数: |
1370 次 |
| 最近记录: |