撤消git stash pop导致合并冲突


517

我开始对我的代码库进行更改,但没有意识到我在旧主题分支上。为了转移它们,我想存放它们,然后将它们应用于master的新分支。我曾经git stash pop将进行中的更改转移到该新分支,但是忘记了在创建新分支之前并没有将新更改引入master。这导致了一堆合并冲突,并且丢失了我所做更改的干净存储(因为我使用了pop)。

正确重新创建新分支后,如何恢复已隐藏的更改以正确应用它们?

Answers:


653

事实证明,如果Git不能很好地应用,它足够聪明以至于不会丢下任何东西。我可以通过以下步骤达到所需的状态:

  1. 要取消合并冲突,请执行以下操作git reset HEAD .:(请注意尾随点)
  2. 要保存冲突的合并(以防万一): git stash
  3. 返回主站: git checkout master
  4. 要获取最新更改: git fetch upstream; git merge upstream/master
  5. 更正我的新分支: git checkout new-branch; git rebase master
  6. 要应用正确的隐蔽更改(现在是堆栈中的第二个): git stash apply stash@{1}

14
非常感谢!#6确实是我一直在寻找的答案。可以添加a git stash drop作为摆脱#2多余垃圾的最后一步。
austinmarton 2014年

1
如果有未合并路径#2将无法正常工作,这反而输出这里所描述的错误:stackoverflow.com/questions/5483213/...
艾蒂安

5
并非完全正确-如果Git无法干净应用,它将把它保存在存储列表中。请参阅以下有关这些文档的信息git stash pop:“应用状态可能会因冲突而失败;在这种情况下,不会从存储列表中删除该状态。您需要git stash drop手动解决冲突,然后手动调用。” (git-scm.com/docs/git-stash)–
卡罗琳·康威

4
真奇怪,这个答案和问题张贴在精确的同一分钟
呼叫我

13
@ call-me这是我认为人们实际上应该更经常执行的操作!注意“问问题”表单如何具有一个复选框,让您以相同的形式回答自己的问题:)。有时在编写困扰我的问题的过程中,这会发生在我身上,但是在尝试调整问题以使其对StackOverflow有利时,我最终想出了解决方案。这是前一阵子,所以我不记得这里是否是这种情况,但是我猜就是那样了。
acjay

339

幸运的是git stash pop没有改变藏匿在冲突的情况下!

因此,无需担心,只需清理代码并重试即可。

假设您的代码库之前是干净的,则可以使用以下命令返回到该状态:git checkout -f
然后做您忘记的事情,例如,git merge missing-branch
之后git stash pop再次触发并获得之前冲突的相同存储库。

注意:存储是安全的,但是,工作目录中未提交的更改不是安全的。他们可能会搞砸。


16
我了解的是,您可以简单地再次清理并弹出,但不能撤消它。如果弹出窗口与其他未提交的更改混合在一起,则必须手动清理。
haridsv

这是一个非常简单的解决方案,对我来说非常有用。它假定您可以还原在本地已更改的所有内容(在弹出存储区之前/之后没有任何更改),我认为这适用于大多数情况。如果您需要保存在意识到这是一个问题之前发生的其他更改,则在大多数情况下,您应该能够在强制签出之前提交这些文件。
Project707 '17

对我而言并非如此。我称它为git stash pop尝试自动合并,冲突并保留它。
Trevor Hickey

1
@TrevorHickey这个答案的重点是,在发生冲突的情况下,存储空间保持不变,您可以git stash pop根据需要随时调用它,直到结束而没有冲突。因此,发生冲突后,是的,工作目录陷入混乱,但是,您可以清理它并git stash pop再次调用。
flori

5
此命令撤销最后藏匿应用是非常有用的:git checkout -f
Lefi Tarik

16

这里的说明有点复杂,所以我将提供一些更简单的方法:

  1. git reset HEAD --hard 放弃对当前分支的所有更改

  2. ... 根据需要执行中介工作

  3. git stash pop 准备好以后再重新弹出存储库



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.