我突然出现了一个合并冲突.与列为重复的问题不同,我已经在目录中保留了一些未提交的更改.我不只是想让合并冲突消失,而且还要让我的目录恢复到pop之前的状态.
我试过了git merge --abort,但是git声称没有合并正在进行中.是否有一种简单的方法可以在不破坏我最初在目录中进行的更改的情况下中止流行音乐?
jmo*_*moz 251
我的用例:刚尝试弹出错误的分支并发生冲突.我只需要撤消pop,但将其保存在存储列表中,这样我就可以在正确的分支上弹出它.我这样做了:
git reset HEAD --hard
git checkout my_correct_branch
git stash pop
Run Code Online (Sandbox Code Playgroud)
简单.
Ken*_*sta 227
我一直用
git reset --merge
我不记得它曾经失败过。
Ben*_*son 47
好吧,我想我已经解决了"git stash unapply".它比git apply --reverse你需要反向合并操作更复杂,以防万一有合并完成git stash apply.
反向合并要求将所有当前更改推送到索引中:
git add -u然后反转merge-recursive,是由做git stash apply:
git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1现在你将只留下非藏匿变化.他们将在索引中.git reset如果您愿意,可以使用它来取消更改.
鉴于你的原始git stash apply失败,我认为反向也可能失败,因为它想要撤消的一些事情没有完成.
这是一个示例,显示工作副本(via git status)如何再次清理:
$ 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)
Run Code Online (Sandbox Code Playgroud)
Dav*_*idG 43
编辑:从git help stashpop部分的文档:
应用国家可能会因冲突而失败; 在这种情况下,它不会从隐藏列表中删除.您需要手动解决冲突并随后手动调用git stash drop.
如果使用--index选项,则尝试不仅恢复工作树的更改,还尝试恢复索引的更改.但是,如果存在冲突(存储在索引中,因此您无法再像以前那样应用更改),则可能会失败.
尝试将所有repo硬编辑到一个新目录中(所以你有一份副本)并运行:
git stash show 如果您关心它,请将输出保存在某个地方.
然后:git stash drop丢弃冲突的存储然后:git reset HEAD
这应该让你的回购处于以前的状态(希望,我仍然无法重复你的问题)
===
我试图重新解决你的问题,但是当我使用时,我得到的git stash pop是:
error: Your local changes to the following files would be overwritten by merge:
...
Please, commit your changes or stash them before you can merge.
Aborting
Run Code Online (Sandbox Code Playgroud)
在一个干净的目录:
git init
echo hello world > a
git add a & git commit -m "a"
echo hallo welt >> a
echo hello world > b
git add b & git commit -m "b"
echo hallo welt >> b
git stash
echo hola mundo >> a
git stash pop
Run Code Online (Sandbox Code Playgroud)
我没有看到git尝试合并我的更改,它只是失败了.您有任何我们可以遵循的重复步骤来帮助您吗?
如果您不必担心所做的任何其他更改,并且您只想返回上一次提交,那么您可以执行以下操作:
git reset .
git checkout .
git clean -f
Run Code Online (Sandbox Code Playgroud)
好的,我想我已经找到了一个工作流程,可以让您回到需要的位置(就好像您没有完成弹出操作一样)。
提前备份!我不知道这是否适合您,因此请复制您的整个存储库,以防万一它不起作用。
1)修复合并问题并通过选择来自补丁的所有更改来修复所有冲突(在tortoisemerge中,这显示为one.REMOETE(他们的))。
git mergetool
Run Code Online (Sandbox Code Playgroud)
2) 提交这些更改(它们已通过 mergetool 命令添加)。给它一个“合并”的提交消息或你记得的东西。
git commit -m "merge"
Run Code Online (Sandbox Code Playgroud)
3) 现在,您仍然会拥有最初开始的本地未暂存更改,以及补丁中的新提交(我们可以稍后删除它)。现在提交未暂存的更改
git add .
git add -u .
git commit -m "local changes"
Run Code Online (Sandbox Code Playgroud)
4) 反转补丁。这可以通过以下命令来完成:
git stash show -p | git apply -R
Run Code Online (Sandbox Code Playgroud)
5) 提交这些更改:
git commit -a -m "reversed patch"
Run Code Online (Sandbox Code Playgroud)
6) 摆脱补丁/取消补丁提交
git rebase -i HEAD^^^
Run Code Online (Sandbox Code Playgroud)
由此,删除其中包含“merge”和“reversed patch”的两行。
7) 取回未更改的更改并撤消“本地更改”提交
git reset HEAD^
Run Code Online (Sandbox Code Playgroud)
我用一个简单的例子来运行它,它可以让你回到你想要的地方——就在弹出存储之前,你的本地更改和存储仍然可以弹出。