Git stash pop- 需要合并,无法刷新索引。

191

我无法弹出我的stash,因为我合并了一个分支,这个分支显然与我的stash冲突,现在我的stash似乎无法被弹出。

app.coffee: needs merge
unable to refresh index

有人知道如何解决这个问题吗?


12
有趣的是,被接受的答案很“复杂”,而实际解决方案却非常简单:你甚至不需要提交有冲突的文件,只需将其添加即可。 - Javi
7
请翻译以下英文文本。仅返回翻译后的文本作为答案,不要将答案放在问题中。 - Black
@Javi 你是对的,这很有趣。 - 无夜之星辰
11个回答

111

首先,检查 git status
如 OP 所述,

实际问题是未解决的合并冲突,而不是储藏引起了合并冲突。

这时,git status 会将该文件标记为 "both modified"

解决方法:提交有冲突的文件。


解决方案:在这种情况下,只需添加并提交您的本地文件即可。
实际上,只需使用git add -- yourFile,或者(如果您不想进行那些更改)git reset -- yourFile(将其撤销)就足以通过错误消息。 如果您不想提交,只需使用git add yourFile即可。
然后,如果需要,可以使用git stash命令隐藏剩余的更改。
你可以在写下这篇回答时(2012年3月13日)的4天前找到一个类似的情况,链接如下:““无法拉取因为存在未合并文件””。
julita@yulys:~/GNOME/baobab/help/C$ git stash pop
help/C/scan-remote.page: needs merge
unable to refresh index

你所做的是解决合并冲突(编辑正确的文件并提交):
请参见“如何在Git中解决合并冲突?

博客文章的作者所做的是:

julita@yulys:~/GNOME/baobab/help/C$ git reset --hard origin/mallard-documentation
HEAD is now at ff2e1e2 Add more steps for optional information for scanning.

即放弃当前合并,允许应用 git stash pop
请参见 "在Git中中止合并"。

这是您的两个选项。


2
有时候我们也会在另一个分支上操作。例如,我有分支A并进行了一些更改,然后切换到分支B并进行了更改并提交了它们。现在我想回到分支A,但忘记在A上进行checkout并尝试应用stash。在这种情况下,也会出现相同的问题。我在上述情况中遇到了这个问题。 - Kapil Verma
我已经提交了所有更改,但是“git bash pop”命令却带回了那些冲突。我不明白为什么我必须提交更改,而我并不想对当前分支进行任何更改。我只想回到存储的分支。 - Philip Rego
抱歉,我的意思是“git stash pop”。我已经删除了存储,但下次遇到这个问题时我会尝试这个方法。谢谢。 - Philip Rego
实际上,只需要使用 git add -- 你的文件,或者(如果你不想要这些更改)git reset -- 你的文件(将其取消暂存)就足以解决错误信息。这个方法解决了我的问题。非常感谢。顺便说一句:这是非常愚蠢的要求。 - Joel Mellon
1
@JoelMellon 很好的观点。11年后,我编辑了我的回答,明确指出git add单独使用就足够了。 - VonC
显示剩余2条评论

51

以下是我解决问题的步骤:

  • git status(查看上一个stash、pull、stash pop和继续工作混合在一起的文件。)
  • git stash(查看需要合并的问题。)
  • git add .(添加文件以使我的本地工作解决自己的合并。)
  • git stash(无错误)
  • git pull(无错误)
  • git stash pop(无错误并继续工作)

1
谢谢!这对我很有帮助。 - Julien Baldy
13
非常好,对我来说,使用“git add .”而不进行提交可以解决这个问题。 - Paul Carlton

16

这比接受的答案简单得多。您需要:

  1. 检查 git status 并查看其中未合并的路径。修复冲突。如果您愿意稍后再做,可以跳过此步骤。

  2. 使用 git add <filename> 将所有这些未合并路径下的文件添加到索引中。

  3. 现在执行 git stash pop。如果有任何冲突,则需要再次解决这些冲突。


11
这导致同样的冲突一次又一次地发生。 - NaN

15

我遇到了这个问题,冲突解决并提交后,再次执行 git stash pop 时会恢复相同的存储(导致相同的冲突 :-( )。

我所做的(警告:首先备份您的储藏)是使用 git stash drop 来摆脱它。


9
那刚刚清空了我的私藏。我想再回去看看。 - Philip Rego
3
这就是我需要的答案,但对于其他人来说,你将会失去已藏起来的更改。如果你遇到了第一个藏匿的问题,但确实希望清除第一个藏匿以应用更深层次的第二级藏匿更改,这很有帮助。 - Corey Schnedl

7

首先,我们应该知道错误的根本原因,然后解决方案就会变得容易。虽然已经有答案指出了问题的原因,但它有些不完整(也不是解决方案)。

问题在于,一个或多个文件以前存在冲突,Git 仍然将它们视为未解决。尽管您可能已经编辑了这些文件并解决了冲突,但 Git 并不知道。

在这种情况下,您应该通知 Git:“嘿,以前合并中没有冲突!”请注意,合并不一定是由 git merge 引起的,也可能是由 git stash pop 等引起的。

通常,git status 可以告诉您 Git 现在知道什么。如果 Git 存在一些未解决的合并冲突,它将显示在一个单独的 Unmerged paths 部分中,文件标记为 both modified(总是?)。如果您已经注意到了,这个部分位于两个已暂存和未暂存部分之间。这意味着未合并的路径是您应该将其移动到已暂存或未暂存区域中的路径,因为 Git 只能使用这两个区域。

即使在最近的 Git 版本中,当您执行 git status 时,它也会告诉您如何做到这一点(哇!您应该问自己为什么还没有看到这个):

$ git status
...
Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add <file>..." to mark resolution)
        both modified:   path/to/file.txt
...

因此,要将其提交到暂存区(或许还要提交到版本库):
git add path/to/file.txt

为了使其未被暂存(例如,您现在不想提交它):

git restore --staged path/to/file.txt

注意:忘记写--staged选项可能会导致一个非常饥饿的龙吃掉你过去两天的工作,尤其是在没有使用好的文本编辑器或IDE的情况下。

注意:git restore命令还处于实验阶段,但已足够稳定可供使用(感谢@VonC的评论,详细了解更多信息)。


@VonC 谢谢。已采纳您的评论。 - MAChitgarha

5

如果在合并/冲突/操作之外出现此问题,则可能是您项目的git锁定文件导致了该问题。

git reset
     fatal: Unable to create '/PATH_TO_PROJECT/.git/index.lock': File exists.
rm -f /PATH_TO_PROJECT/.git/index.lock
git reset
git stash pop

2
有点害怕 reset 命令。能否解释一下为什么这会起作用? - SMBiggs

3

git reset 如果你不想提交这些更改。


2

我遇到了同样的问题,因为我在开发分支上做了一些更改,然后想切换到个人资料分支。所以我通过stash命令来保存这些更改。

git stash

然后在个人资料分支中,我也做了一些更改,现在想要回到开发分支,所以我必须再次使用stash命令来保存更改:

 git stash

但是当我切换到开发分支并尝试通过git命令获取暂存的更改时
git stash apply

我遇到了需要合并的错误

为了解决这个问题,首先我要检查存储列表:

git stash list

这段代码展示了我的存储列表,其中有两个存储,它们的名称显示为stash@{0}, stash@{1}

我需要从stash@{1}中进行更改,因此当我尝试使用此命令获取它时

git stash apply stash@{1}

所以出现了需要合并的错误

为了解决这个问题,请检查您的文件状态

git status

出现错误,指出“已修改”

为解决此问题,请运行以下指令。

git add .

它将添加丢失的修改过的文件 现在再次检查状态

git status 

现在没有错误了,可以应用存储

git stash apply stash@{1}

您可以对任意数量的存储文件执行此过程。


1

你需要将 app.coffee 添加到暂存区。

执行 git add app.coffee,然后你就可以应用你的存储(之后提交并推送)。


1

这个存储已经被应用到其他文件中了。

只有app.coffee需要手动合并。之后只需运行

git reset

取消暂存更改并继续操作。


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