82

所以我有很多更改和一些未跟踪的文件。我需要调整一些东西,所以我使用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仍然显示我隐藏的更改列表,但我不知道我现在做什么。

我怎样才能让自己摆脱困境?

4

4 回答 4

139

对于那些确实有未提交的工作,并希望在不丢失工作的情况下弹出他们的藏匿处的人,这里有一种方法(感谢@iFreilicht):

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

     git add -u .
    
  2. 现在你可以在没有 git 抱怨的情况下应用你的 stash(希望如此):

     git stash pop
    
  3. 现在取消暂存所有内容,但保留文件原样:

     git reset
    

如果第 2 步由于更改冲突而无法干净地修补,那么您将需要手动解决冲突。 git diff应该可以帮助您找到它们。

于 2016-07-21T02:02:54.287 回答
56

我解决了这个问题,我认为它一定是某种错误,因为我的工作目录是干净的并且是最新的。

我跑了git checkout .,然后git stash apply工作正常,我把所有东西都拿回来了,一点问题都没有。不过,我很想弄清楚究竟是什么导致了它失败。

于 2013-11-13T12:15:46.323 回答
3

使用 -ed制作的存储-u需要在 -ed 之前清除未跟踪的文件apply(并且pop只是apply+ drop)。

出于普遍的偏执,我将mv未跟踪的文件放在安全的地方,然后git stash apply,仔细检查所有内容,git stash drop一旦我确定一切都正确。:-)

于 2013-11-12T19:38:01.993 回答
0

这些解决方案都不适合我。我正在使用 git stash index 命令来恢复特定的存储 ID。因此,我最终将本地更改提交到本地仓库。然后 git stash index 为我工作。最后,我使用 git reset 回滚了我的提交(保留更改)。问题解决了。

于 2020-05-28T15:40:37.133 回答