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

问题描述 投票:0回答:7

我开始更改我的代码库,没有意识到我处于旧主题分支上。为了转移它们,我想将它们隐藏起来,然后将它们应用到 master 的新分支上。我使用

git stash pop
将正在进行的更改转移到这个新分支,忘记了在创建新分支之前我没有将新更改拉到 master 中。这导致了一堆合并冲突,并丢失了我的更改的干净存储(因为我使用了 pop)。

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

git git-stash
7个回答
1059
投票

事实证明,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}

515
投票

幸运的是,在发生冲突时,

git stash pop
不会更改存储!

所以没什么好担心的,只需清理你的代码并重试即可。

假设您的代码库之前是干净的,您可以通过以下方式返回到该状态:

git checkout -f


然后做你忘记的事情,例如
git merge missing-branch

之后,只需再次触发
git stash pop
,您就会得到之前发生冲突的
相同存储。

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

最简单的命令,它在任何地方都适用,包括

128
投票

git merge

但是要小心!您将丢失未跟踪文件的所有更改。跟踪的文件保持完整

git reset --merge

这里的说明有点复杂,所以我将提供更简单的内容:

45
投票

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

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

  4. git stash pop
  5. 稍后当你准备好时再次重新弹出藏匿处

    
        

git checkout -f

35
投票
必须工作,如果你之前的状态是干净的。
注意:请注意 - 您将丢失文件中所有未跟踪的更改。

如果您像我一样并且有

2
投票
,您可以通过从

stash中查看每个单独文件的已知稳定版本来避免丢失该工作。希望这些文件与您正在处理的文件不同。另外,这就是为什么我们在进行时使用小提交,愚蠢的愚蠢。

git checkout main -- <file_with_conflicts>

我认为 

0
投票
也会解决这个问题,其中包括

包括

 如果您有未跟踪的文件和未合并的路径。

© www.soinside.com 2019 - 2024. All rights reserved.