我开了个藏宝箱,合并发生了冲突。与被列为重复的问题不同,我已经在我想保留的目录中有一些未提交的更改。我不只是想让合并冲突消失,还想让我的目录恢复到弹出窗口之前的状态。

我尝试了git合并-abort,但git声称没有合并正在进行中。是否有一种简单的方法来中止弹出,而不破坏我原来在目录中的更改?


当前回答

I'm posting here hoping that others my find my answer helpful. I had a similar problem when I tried to do a stash pop on a different branch than the one I had stashed from. On my case I had no files that were uncommitted or in the index but still got into the merge conflicts case (same case as @pid). As others pointed out previously, the failed git stash pop did indeed retain my stash, then A quick git reset HEAD plus going back to my original branch and doing the stash from there did resolve my problem.

其他回答

如果在git隐藏弹出之前没有阶段性的更改,那么下面两个命令应该可以工作。

git diff --name-only --cached | xargs git checkout --ours HEAD
git ls-tree stash@{0}^3 --name-only | xargs rm

第一种方法将从存储中反转任何合并,不管成功与否。第二个删除由隐藏引入的任何未跟踪的文件。

从man git stash:工作目录必须匹配索引。@DavidG指出,如果当前任何未分段修改的文件发生冲突,隐藏弹出将失败。因此,除了返回HEAD之外,我们不应该担心解除合并冲突。任何剩余的修改文件都与存储无关,并且是在存储弹出之前修改的

如果有阶段性的变化,我不清楚我们是否可以依赖相同的命令,你可能想尝试@Ben Jackson的技巧。建议表示赞赏。

下面是针对所有不同情况的测试设置https://gist.github.com/here/4f3af6dafdb4ca15e804

# Result:
# Merge succeeded in m (theirs)
# Conflict in b
# Unstaged in a
# Untracked in c and d

# Goal:
# Reverse changes to successful merge m
# Keep our version in merge conflict b
# Keep our unstaged a
# Keep our untracked d
# Delete stashed untracked c

我可以在“脏”目录上重新生成干净的git stash pop,具有未提交的更改,但尚未生成合并冲突的pop。

如果在合并冲突中,你试图应用的stash没有消失,你可以尝试检查git show stash@{0}(可选与-ours或-their),并与git statis和git diff HEAD进行比较。您应该能够看到哪些更改来自应用存储。

我用不同的方法解决了这个问题。事情是这样的。

首先,我碰到了错误的分支,产生了冲突。存储仍然完好无损,但是索引在冲突解决中,阻塞了许多命令。

简单的git重置HEAD会中止冲突解决,并留下未提交(和不需要的)更改。

几个git co <filename>将索引恢复到初始状态。最后,我用git co <branch-name>切换了分支,并运行了一个新的git stash pop,解决了没有冲突的问题。

如果你只有存储的更改,试试下面的一行。它删除了当前的每个局部更改。

Git checkout -f

一些想法:

使用git mergetool将合并文件拆分为原始部分和新部分。希望其中一个是包含你非隐藏更改的文件。 反向应用隐藏的diff来撤销这些更改。您可能必须手动分离合并冲突的文件(希望上面的技巧可以奏效)。

这两个我都没有测试过,所以我不确定它们是否能工作。