【发布时间】:2014-02-13 22:06:35
【问题描述】:
我之前可以通过执行“丢弃”功能通过 SourceTree 撤消更改,该功能在后台会生成以下命令:
git -c diff.mnemonicprefix=false -c core.quotepath=false reset -q HEAD -- myproj.csproj
git -c diff.mnemonicprefix=false -c core.quotepath=false checkout HEAD -- myproj.csproj
突然这不起作用。我做了丢弃,没有发生错误,重新释放视图,但文件仍然“修改”。然后我尝试在命令行中执行相同的操作,结果相同:
c:\myproject> git reset HEAD
Unstaged changes after reset:
M myproj.csproj
为什么仍将其列为非分阶段更改?
我已验证该文件确实是可写的(没有进程持有锁)
更新
git checkout 也不起作用:
C:\myproject>git checkout myproj.csproj
C:\myproject>git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: myproj.csproj
#
no changes added to commit (use "git add" and/or "git commit -a")
更新 2 也试过了:
git checkout --git checkout -- .git checkout HEAD
,没有一个能解决我的问题
更新 3 - 更进一步:
结果是,当我进行结帐时,.csproj 确实恢复到正确的版本,但是签出的版本使用不同的 换行编码。签入版本具有用于换行的 CR-LF (0D-0A),而签出版本只有 LF (0A)。因此 git 认为文件在每一行上都是不同的。为什么会这样?
更新 4: 添加了 SourceTree 发出的第二行 git 命令。我第一次没有注意到,这就是为什么我认为git reset HEAD 会做任何事情。这并没有改变根本问题仍然与 CR/LF 相关的事实(我认为)
总结 我从来没有找到解决这个问题的方法,但我通过签入文件“解决了”它。我最初的问题没有包含 SourceTree 确实发出了正确的命令来回滚我想要的信息,所以这里的大多数答案都解决了这个问题。 真正的问题仍不清楚,但我的主要理论是它与 CR/LF 相关。
【问题讨论】:
-
我的更新使它不再重复。该问题的答案在我的情况下不起作用。不过,这可能是一个过于本地化的问题……我们拭目以待。
-
这次更新让这个问题突然变得很有趣。
-
我倾向于放弃 - 通过签入新的换行编码“解决”了这个问题。
git config --global core.autocrlf true和false都没有帮助。如果有人有更多建议,我有一个 repo 的克隆供进一步测试。 -
首先我关闭了SourceTree。然后我将 core.autocrlf 和 core.safecrlf 都设置为 true,就像这里 cmets 中所说的那样 - stackoverflow.com/questions/1575682/…。之后我使用了 git reset --hard。幸运的是,所有变化都消失了。
标签: git