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

Gre*_*ott 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")
Run Code Online (Sandbox Code Playgroud)

做了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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ala*_*yth 109

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

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

git ls-files -m | xargs -i git update-index --assume-unchanged "{}"
Run Code Online (Sandbox Code Playgroud)

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

git ls-files -m | xargs -I {} git update-index --assume-unchanged {}
Run Code Online (Sandbox Code Playgroud)

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

-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认同)

Tek*_*kub 31

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

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

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

Abu*_*sar 20

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

* text=auto
Run Code Online (Sandbox Code Playgroud)

至:

#* text=auto
Run Code Online (Sandbox Code Playgroud)

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

  • 删除 .gitattributes 中的 `text=auto` 设置对我有用,然后在我使用 `git reset --hard` 后,将该设置放回原处,文件不再显示为已修改! (2认同)

Eya*_*yal 11

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

git diff dir1/foo.aspx

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

git config core.filemode false

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

[核心]

filemode = false
Run Code Online (Sandbox Code Playgroud)

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

git reset HEAD dir1/foo.aspx

并且文件应该消失.

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


MCO*_*MCO 8

我遇到了同样的问题,有趣的是,这些文件在 Windows 上已更改,但从 WSL 查看它们时却没有更改。无论对行尾、重置等进行多少修改都无法改变它。

最终我在这个答案中找到了解决方案。为了方便起见,正文如下:


我已经使用以下步骤解决了这个问题

1) 从 Git 索引中删除每个文件。

git rm --cached -r .
Run Code Online (Sandbox Code Playgroud)

2) 重写 Git 索引以获取所有新行结尾。

git reset --hard
Run Code Online (Sandbox Code Playgroud)

解决方案是 git 站点https://help.github.com/articles/dealing-with-line-endings/上描述的步骤的一部分