我开了个藏宝箱,合并发生了冲突。与被列为重复的问题不同,我已经在我想保留的目录中有一些未提交的更改。我不只是想让合并冲突消失,还想让我的目录恢复到弹出窗口之前的状态。
我尝试了git合并-abort,但git声称没有合并正在进行中。是否有一种简单的方法来中止弹出,而不破坏我原来在目录中的更改?
我开了个藏宝箱,合并发生了冲突。与被列为重复的问题不同,我已经在我想保留的目录中有一些未提交的更改。我不只是想让合并冲突消失,还想让我的目录恢复到弹出窗口之前的状态。
我尝试了git合并-abort,但git声称没有合并正在进行中。是否有一种简单的方法来中止弹出,而不破坏我原来在目录中的更改?
当前回答
使用git reflog列出在git历史中所做的所有更改。复制一个动作id,输入git reset ACTION_ID
其他回答
如果DavidG是正确的,它没有弹出隐藏,因为合并冲突,那么你只需要清理你的工作目录。赶快提交你关心的一切。(如果没有完成,可以稍后重置或压缩提交。)然后,你所关心的一切安全,git重置其他一切,git stash弹出转储到你的工作目录。
我可以在“脏”目录上重新生成干净的git stash pop,具有未提交的更改,但尚未生成合并冲突的pop。
如果在合并冲突中,你试图应用的stash没有消失,你可以尝试检查git show stash@{0}(可选与-ours或-their),并与git statis和git diff HEAD进行比较。您应该能够看到哪些更改来自应用存储。
合并——只有当你合并其他分支代码并且它有冲突时才会中止。
git merge --abort
如果stash pop有冲突,你可以使用:
git reset --merge
如果在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 unapply"。它比git apply -reverse更复杂,因为你需要反向合并操作,以防git stash apply做了任何合并。
反向合并要求所有当前更改都被推入索引:
Git add -u
然后反转由git stash apply完成的合并递归:
——$(Git write-tree) stash@{0}^1
现在你将只剩下非隐藏的变化。它们会在索引中。如果你愿意,你可以使用git重置来取消你的更改。
鉴于你最初的git stash应用失败了,我假设反向也可能失败,因为它想要撤消的一些事情没有完成。
下面是一个例子,展示了工作副本(通过git状态)如何再次干净:
$ git status
# On branch trunk
nothing to commit (working directory clean)
$ git stash apply
Auto-merging foo.c
# On branch trunk
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: foo.c
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git add -u
$ git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1
Auto-merging foo.c
$ git status
# On branch trunk
nothing to commit (working directory clean)