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

我开始修改我的代码库,没有意识到我在一个旧的主题分支上。为了转移它们,我想隐藏它们,然后将它们应用到master的一个新分支。我使用git stash pop将正在进行的更改转移到这个新分支,忘记了在创建新分支之前我没有将新更改拉入master。这导致了一堆合并冲突和丢失我的更改的干净存储(因为我使用了pop)。

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

407644 次浏览

事实证明,Git足够聪明,如果它不能干净地应用,就不会丢弃藏匿。我可以通过以下步骤到达所需的状态:

  1. 取消合并冲突:git reset HEAD .(注意尾随点)
  2. 保存冲突的合并(以防万一):git stash
  3. 返回到master: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}

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

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

假设你的代码库以前是干净的,你可以回到那个状态:git checkout -f
然后做你忘记的事情,例如git merge missing-branch
在那之后,只要再次发射git stash pop,你就会得到相同的藏匿,这之前是冲突的。

请记住:存储是安全的,但是,工作目录中的未承诺更改当然不是。他们可能会搞砸。

这里的说明有点复杂,所以我要提供一些更简单的东西:

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

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

  3. git stash pop当您准备好时,在稍后的日期再次弹出藏品

git checkout -f

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

警告:小心-您将丢失所有未跟踪的文件更改。

git reset --merge

最简单的命令,它适用于任何地方,包括git stash popgit merge等。

小心!您将失去对未跟踪文件的所有更改。跟踪的文件保持不变

如果你像我一样有要保留的未暂存更改,你可以通过从stash中检查每个文件的已知稳定版本来避免丢失这项工作。希望这些文件与你正在处理的文件不同。此外,这就是为什么我们使用小提交的原因,哑巴。

git checkout main -- <file_with_conflicts>