撤消导致合并冲突的git stash pop

acj*_*jay 458 git

我开始对我的代码库进行更改,但没有意识到我在一个旧主题分支上.要转移它们,我想将它们藏起来,然后将它们应用到主人的新分支中.我曾经git stash pop将正在进行的工作更改转移到这个新分支,忘记在创建新分支之前我没有将新的更改提取到master中.这导致了一堆合并冲突并且丢失了我的更改(因为我使用了pop).

一旦我正确地重新创建了新分支,我如何才能恢复我的隐藏更改以正确应用它们?

acj*_*jay 587

事实证明,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. 要应用正确的存储更改(现在堆栈上的第2个): git stash apply stash@{1}

  • 非常感谢!#6真的是我正在寻找的答案.可以添加一个`git stash drop`作为摆脱#2中不需要的藏匿的最后一步. (13认同)
  • @ call-me这是我认为人们应该经常做的事情!请注意"提问"表单中有一个复选框,让您以相同的形式回答自己的问题:).当我正在编写一个让我困扰的问题时,有时会发生这种情况,但在尝试调整问题对StackOverflow有利时,我最终找出了解决方案.这是不久前的,所以我不记得这是不是这样,但我猜这就是发生了什么. (10认同)
  • 不完全正确 - 如果它不能干净地应用,Git会将存储保留在存储列表中.请参阅这些关于`git stash pop`的文档:"应用状态可能会因冲突而失败;在这种情况下,它不会从存储列表中删除.您需要手动解决冲突并随后手动调用`git stash drop`. " (https://git-scm.com/docs/git-stash) (4认同)
  • 奇怪的是,此答​​案和问题在同一分钟的“确切时间”上发布的 (4认同)
  • 如果存在未合并的路径,#2 将不起作用,它会输出此处描述的错误:http://stackoverflow.com/questions/5483213/fatal-git-write-tree-error-building-trees (2认同)
  • 这不能正常工作。:-( 它撤消了更改,但在我的文件中留下了一堆噪音,例如:`<<<<<<<更新了上游`>>>>>>> 隐藏的更改` (2认同)

flo*_*ori 314

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

所以没什么,担心,只需清理你的代码并再试一次.

说你的代码库之前是干净的,你可以回到那个状态:git checkout -f
然后做你忘记的东西,例如,git merge missing-branch
之后git stash pop再次开火,你得到相同的藏匿,之前发生冲突.

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

  • 我的理解是你可以简单地清理并再次弹出,但你不能*撤消它.如果pop与其他未提交的更改混合在一起,则必须手动清理. (12认同)
  • 这个撤消最后一个存储的命令非常有用:`git checkout -f`! (4认同)
  • git checkout -f 是什么意思? (3认同)

ano*_*932 36

这里的说明有点复杂,所以我将提供一些更直接的内容:

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

  2. ... 必要时进行中介工作

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


All*_*h.G 31

git checkout -f
Run Code Online (Sandbox Code Playgroud)

必须工作,如果你以前的状态是干净的。

  • 请注意,您将丢失文件中所有未跟踪的更改。 (9认同)

Gab*_*son 20

git reset --merge

最简单的命令和适用于任何地方,包括。git stash pop.

小心!您将丢失对未跟踪文件的所有更改。

  • 而且您似乎也会丢失暂存、跟踪文件的所有更改。 (4认同)
  • 这里要小心!您将丢失未跟踪文件的所有更改。 (2认同)