如何中止 stash pop 操作?

558

我弹出了一个存储,但出现了合并冲突。与重复的问题不同,我已经在目录中有一些未提交的更改需要保留。我不仅想让合并冲突消失,还要将目录恢复到弹出之前的状态。

我尝试了git merge --abort,但是git声称没有进行任何合并。有没有一种简单的方法可以中止“stash pop”操作而不破坏我最初在目录中所做的更改?


你能否发布一下你正在使用的 Git 版本? - Tinman
相关问题中获取的相关信息:如果发生冲突,则不会从存储列表中删除存储。 - here
3
最佳答案看起来很复杂。我认为从一般实践角度来看,最好不要尝试在未清理的工作目录上执行类似于git stash pop的操作。这种情况下,您可以简单地使用git reset --hard,而您的存储仍然完好无损。(这更或多或少是@BradKoch链接主题所建议的)。 - Steven Lu
1
@StevenLu,我同意,但是如果您要将更改存储以将其移动到不同的分支中,则问题可能会发生在干净的工作目录中。存储会与存在于新分支上但不存在于旧分支上的提交发生冲突。 - Jake Stevens-Haas
显示剩余5条评论
16个回答

2
我可以在未提交更改的“脏”目录上复制干净的git stash pop,但是无法弹出生成合并冲突的存储。 如果在合并冲突时您尝试应用的存储未消失,则可以尝试检查git show stash@{0}(可选使用--ours--theirs),并与git statisgit diff HEAD进行比较。 您应该能够看到哪些更改来自于应用存储。

2
如果DavidG是正确的,那么这不会因为合并冲突而弹出存储。你只需要清理你的工作目录。快速提交你关心的所有内容。(如果你还没有完成,稍后可以重置或压缩提交)。然后,将所有你关心的东西安全地重置,以及git stash pop倾倒到你的工作目录中的其他所有内容。

2

如果在git stash pop之前没有进行过暂存的更改,那么以下两个命令应该能够起作用。

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

第一个命令可以撤销任何来自stash的合并,无论成功与否。第二个命令可以删除由stash引入的任何未跟踪文件。
man git stash中得知:工作目录必须匹配索引。 正如@DavidG所指出的那样,如果有任何当前未暂存的修改文件冲突,则stash pop将失败。 因此,我们不需要担心解开合并冲突,只需回到HEAD即可。 任何剩余的已修改文件都与stash无关,并且在stash pop之前被修改。
如果存在已暂存的更改,则不清楚我们是否可以依赖相同的命令,您可能需要尝试@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

我认为这是目前为止最正确的答案。思考得非常周到。 - Agent Friday

1

尝试使用 if 跟踪文件。

git rm <path to file>
git reset  <path to file>
git checkout <path to file>

0
使用 git reflog 列出所有在 git 历史中所做的更改。复制一个操作 ID 并输入 git reset ACTION_ID

2
Git在你弹出之前不会创建reflog条目(你需要有一个提交)。 - Casebash

-2
我在这里发布帖子,希望其他人能够从中获得帮助。当我尝试在不同的分支上执行stash pop时,遇到了类似的问题。在我的情况下,没有未提交或在索引中的文件,但仍然出现了合并冲突的情况(与@pid相同)。正如其他人之前指出的那样,失败的git stash pop确实保留了我的stash,然后快速的git reset HEAD加上返回到我的原始分支并在那里执行stash解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接