在一个未受影响的文件中,git认为该文件已被删除然后再添加回来。我无法弄清楚原因。
就git而言,症状可以显示如下:
$ git diff-index --cached HEAD
:000000 100644 0000000000000000000000000000000000000000 8d1b41aeb85f3c2afc6e70e824902f3f365e416c A myfile.h
:100644 000000 8d1b41aeb85f3c2afc6e70e824902f3f365e416c 0000000000000000000000000000000000000000 D myfile.h
这对我来说很陌生。文件的校验和是相同的,文件的模式是相同的,但git仍然认为删除文件有一个更改,然后添加文件的更改,这是在索引和工作目录之间!
git status说
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: myfile.h
但是使用git reset HEAD myfile.h什么都不做,git checkout myfile.h也没有。物理删除文件并再次创建它也无法解决问题。
git reset --hard摆脱了这个问题,但在很多情况下,如果发生这种情况,就像在rebase中间一样,这不是一个选择。
在这种情况下,我也可以执行以下操作:
$ git rm --cached myfile.h
rm 'myfile.h'
$ git status
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: myfile.h
Untracked files:
(use "git add <file>..." to include in what will be committed)
myfile.h
$ git add myfile.h
$ git status
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: myfile.h
$ git diff
$
我想弄清楚为什么git认为这个文件被删除并添加了,但我不确定在哪个方向上进行调查。我如何向git询问关于它对我的索引的看法的更多信息,以便我可以弄清楚它为什么要删除/添加这个未更改的文件呢?
更新: 我还没有找到原因,但我有更多的信息要分享。 我试图比较引用git报告差异的情况的git树对象和不报告差异的情况。 事实证明,有问题的文件的父目录上的git ls-tree在一个帐户上看起来不同:文件的顺序。
100644 blob e79f590c93e9a971c9c443558f35067898d2587f myeee.h
100644 blob 8d1b41aeb85f3c2afc6e70e824902f3f365e416c myfile.h
040000 tree a9091c79f0d317f1d0ea596e538b50afde4b6251 myfile
100644 blob 47925e1b444f396a038052dc583310dc3a6b6021 myfile_again.h
与
100644 blob e79f590c93e9a971c9c443558f35067898d2587f myeee.h
040000 tree a9091c79f0d317f1d0ea596e538b50afde4b6251 myfile
100644 blob 8d1b41aeb85f3c2afc6e70e824902f3f365e416c myfile.h
100644 blob 47925e1b444f396a038052dc583310dc3a6b6021 myfile_again.h
这似乎是git看到的差异的根源......但我仍然不知道为什么会看到不同的东西。