无法弹出git存储,提示“合并将覆盖以下文件中的本地更改”

99

所以我有一堆改变和一些未跟踪的文件。我需要调整一些东西,所以我使用了git stash -u,修改了一些内容,提交了这些更改,推送了它们,然后尝试使用git stash pop

由于我修改了一些我已经存储的文件,所以我得到了以下信息:

error: Your local changes to the following files would be overwritten by merge:
    file_1.py
    file_2.py
Please, commit your changes or stash them before you can merge.
Aborting

这看起来很奇怪,当我运行命令时,我的检出很干净,我提交了所有的新更改。

似乎 git stash pop 操作解开了一半的更改和未跟踪的文件,但如果我再次尝试 git stash pop ,我会得到如下输出:

some_file.html already exists, no checkout
some_other_file.html already exists, no checkout
yet_another_file.html already exists, no checkout
Could not restore untracked files from stash

git stash show 仍然显示我的暂存更改列表,但我现在不知道该怎么做。

我该如何解决这个问题?


可能是重复的问题:无法将存储应用于工作目录 - Wilfred Hughes
当本地有更改时相关操作:git stash -> 将存储的更改与当前更改合并 - iFreilicht
4个回答

177

对于那些 有未提交的工作,并且想要弹出他们的储藏夹(stash)而不会失去这些工作,这里有一种方法(感谢 @iFreilicht):

  1. 暂存任何未提交的更改:

 git add -u .
现在你可以应用你的存储库而不会让git抱怨(希望如此):
 git stash pop
  • 现在将所有内容取消暂存,但保留文件当前的状态:

  •  git reset
    

    如果步骤2由于冲突的更改而无法成功修补,则您需要手动解决冲突。使用git diff可以帮助您找到它们。git mergetool可能会通过打开您的编辑器并显示先前和当前的文件来提供帮助。


    12
    每当我这样做时,感觉自己没有正确使用git...不过还没有找到其他的替代方案。 - Joost
    6
    我成功找到了第二种方法:不要提交,而是对所有将被覆盖的文件运行 git add <files>。然后您可以pop,再用 git reset HEAD 取消暂存。这一定是某种错误。 - iFreilicht
    @Joost 为什么不使用stash而不是commit,然后再删除stash堆栈的顶部?`git stash save "junk"` `git stash drop` `git stash pop` - LastStar007
    5
    LastStar007,我们希望保留当前的“垃圾”,并弹出隐藏的内容。 - joeytwiddle
    1
    太好了,谢谢。经常发生这种情况,因为我需要在另一个分支上进行紧急工作,所以我会隐藏更改。然后我回到原始分支并继续工作,而不弹出我的隐藏内容...这很混乱。这完全解决了这个问题。 - little_birdie
    显示剩余3条评论

    62

    我解决了这个问题,我认为这必须是某种错误,因为我的工作目录是干净和更新的。

    我运行了git checkout .之后,git stash apply正常工作了,我没有遇到任何问题,我很想知道实际上是什么导致它失败的。


    1
    记录一下,即使在一个干净的工作目录中进行操作,我仍然会遇到相同的错误。 - Taylor D. Edmiston
    7
    这对我有用,强调 .。有人能解释一下这为什么有效吗? - Jamie M.
    7
    对于不了解的人来说,"."是“递归地选择所有非被忽略文件”的别名,不要与"*"混淆。但这是5年前的事情,你现在应该知道了。@JamieM. - user337598
    2
    我也有一个干净的目录,但我遇到了同样的错误,这个解决方案对我没有起作用。我尝试了 git stash apply --index,它起作用了,无法解释这个参数的作用,但根据文档,“尝试重新创建索引”。 - Milvintsiss

    3

    使用-u选项创建的暂存区在进行apply操作之前需要清除未跟踪的文件(而pop实际上是apply+drop)。

    出于普遍的谨慎,我会将未跟踪的文件mv到安全的位置,然后执行git stash apply,仔细检查所有内容,并确保正确无误后再执行git stash drop。 :-)


    这似乎不起作用,我从一个干净的工作目录开始,没有未跟踪的文件,没有需要移动的东西! - fredley
    嗯,可能是git stash中的一个错误(我以前发现过一个)...如果您能重现这个问题,尤其是使用一个小例子,那将会很有趣。 - torek

    0

    这些解决方案都对我没用。我一直在使用git stash index命令来恢复特定的stash id。所以,最后我将我的本地更改提交到本地仓库。然后git stash index就可以正常工作了。最后,我使用git reset(保留更改)回滚了我的提交。问题解决了。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接