Git:如何还原2个顽固地停留在"已更改但未提交"的文件?

Greg Hendershott 79 git github revert

我有一个repo,有两个文件,据说我在本地更改.

所以我坚持这个:

$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   dir1/foo.aspx
#       modified:   dir2/foo.aspx
#
no changes added to commit (use "git add" and/or "git commit -a")

做了git diff说整个文件内容已经改变了,即使从眼球看起来似乎是不真实的(似乎有差异的共同行范围似乎没有看到).

有趣的是我不记得在本地更改这些文件.此仓库与一个远程仓库(私人,GitHub.com,FWIW)一起使用.

无论我尝试过什么,我都不能放弃这些局部变化.我尝试了所有:

$ git checkout -- .
$ git checkout -f
$ git checkout -- dir1/checkout_receipt.aspx
$ git reset --hard HEAD
$ git stash save --keep-index && git stash drop
$ git checkout-index -a -f

换句话说,我已经尝试了如何在Git中丢弃未分级的更改中描述的所有内容加上更多.但是这两个文件仍然被"改变但未提交".

什么导致两个文件被卡住这样看似"un-revert-table"?

PS在上面的列表中显示我已经尝试过的命令,我错误地写了git revert我的意思git checkout.对不起,谢谢那些回答我应该尝试的人checkout.我编辑了问题来纠正它.我肯定已经尝试过了checkout.

Alan Forsyth.. 109

我花了好几个小时试图解决一个类似的问题 - 我检查过的一个远程分支,它固执地显示四个文件为'已更改但未更新',即使删除所有文件并git checkout -f再次运行(或此帖子的其他变体)!

这四个文件是必要的,但我当然没有修改过.我的最终解决方案 - 说服Git他们没有被改变.以下适用于所有已检出文件,显示"已修改"状态 - 确保您已经提交/存储了任何已经修改过的文件!:

git ls-files -m | xargs -i git update-index --assume-unchanged "{}"

在Mac OSX上,然而xargs运行有点不同(丹尼尔评论):

git ls-files -m | xargs -I {} git update-index --assume-unchanged {}

我下次已将此作为占位符添加到我自己,但我希望它也可以帮助其他人.

-Al

  • 我有一对夫妇的顽固文件,跑到现在这个命令,git的状态鞋没有改变,但是当我试图改变分支的git还告诉我,我不能改变的分支,因为这两个文件有局部变化.不知道我做错了什么,但它似乎只是掩盖了问题而不是修复它?运行该命令后,我也无法提交文件.我的解决方案是删除它们,提交和交换分支. (9认同)
  • 这正是我所需要的,虽然Mac上的xargs似乎运行方式有点不同(我正在运行10.10 Yosemite).这最终对我有用:`git ls-files -m | xargs -I {} git update-index --assume-unchanged {}` (6认同)
  • 谢谢!我尝试了我能找到的所有其他答案中提到的所有技巧 - 没有效果.在Mac上无法按原样使用该行,只需在每个文件上运行git update-index --assume-unchanged <filename>,这就会使问题消失. (5认同)
  • 要恢复命令的效果:`git ls-files -v | grep'^ h'| 切-c3- | xargs -i git update-index --no-assume-unchanged"{}"` (3认同)
  • 当您希望对此文件进行本地修改时,不应该使用"--assume-unchanged"选项吗?就像你签出一个模板网站配置文件并用敏感的信息更新它,不应该存储在存储库中? (2认同)
  • 此解决方案无法解决问题.它隐藏了它.在`assume-unchaged`之后,有一些事情无法执行,就像@ RodH257一样.我相信对于像`git checkout - file`,`git stash`和`git reset --hard HEAD`这样的命令不起作用的情况最正确的答案是,正如已经回答的那样编辑`.gitattributes` (2认同)

Tekkub.. 31

文件中的行结尾是什么?我打赌他们是CRLF.如果是,请查看本指南:http://help.github.com/line-endings/

简而言之,您需要确保将git设置为在提交时将行结尾转换为LF,然后提交这些文件.repo中的文件应始终为LF,检出的文件应该是操作系统的本机,假设您正确设置了git.

  • 我不同意行结尾应该*总是*在回购中的LF(特别是如果其他人已经提交了CRLF)并且OS应该始终是原生的.我的Windows编辑器和环境(主要用于PHP,HTML,CSS等)可以很好地处理LF行结尾. (5认同)

Abu Assar.. 20

这就是我在我的情况下修复相同问题的方法:open .gitattributes change:

* text=auto

至:

#* text=auto

保存并关闭,然后恢复或重置,感谢@Simon East提示


Eyal.. 11

另一种可能性是差异(阻止您使用checkout命令恢复这些文件)是文件模式之一.这就是发生在我身上的事.在我的git版本上你可以通过使用来发现它

git diff dir1/foo.aspx

它会显示文件模式的变化.但它仍然不会让你回复它们.对于那个用途

git config core.filemode false

或者通过添加在文本编辑器中更改你的git .config

[核心]

filemode = false

执行此操作后,您可以使用

git reset HEAD dir1/foo.aspx

并且文件应该消失.

(我从答案中得到了所有这些如何使git忽略模式更改(chmod)?)