我遇到问题,我无法撤销对文件的更改。在diff中,它显示所有行都被删除并且新粘贴了。但是文件的内容类似于分支中的初始提交。 Intellij IDEA显示存储库没有差异。
我是GIT的新人,请耐心等待。
答案 0 :(得分:1)
我最好的猜测是,你在Windows机器上,并且在.gitattributes
文件的某个地方,你有一个指令,告诉git执行行结束规范化(通过* text=auto
或类似的东西)。如果确实如此,那么当您签出文件时,其LF将转换为CRLF,并且当您提交文件时,其CRLF将转换为LF。
如果情况确实如此,那么最有可能发生的事情是,有问题的文件的存储库版本在某种程度上具有CRLF。当你检查出来时,工作副本当然也会有那些CRLF。现在这里有一个问题:当做git status
,git diff
等时,git将repo / index中的内容与工作目录中的实际内容进行比较,而不是将在完成行结束规范化之后提交,即将CRLF替换为LF。在这种情况下,git看到index / repo中的内容有CRLF,而 提交的内容只有LF,因此存在差异。
要查看是否是这种情况,请运行以下命令:
git hash-object path/to/filename
git hash-object --no-filter path/to/filename
git ls-files -s path/to/filename
第一个命令将显示将提交的哈希值。第二个命令显示工作目录中实际内容的哈希值。第三个命令显示索引中的内容的哈希值。如果第一和第二个哈希值不同,而第二个和第三个哈希值相同,那么你几乎肯定处于我所描述的情况。
所以问题是,如何摆脱它?一种简单的方法是简单地添加/提交“更改”。这将具有将LF放入存储库副本中的效果,从而解决了前面的问题。但是,如果每个使用存储库的人都在Windows上,那么无论如何都不需要行规范化。您可以通过将* -text
放入.gitattributes
文件中来删除它们(并删除它下面用于将文件类型设置为文本的任何行)。当我遇到这个问题时,这是我选择的选项,因为我不是我的版本控制系统更改我的文件内容的粉丝。