我开了个藏宝箱,合并发生了冲突。与被列为重复的问题不同,我已经在我想保留的目录中有一些未提交的更改。我不只是想让合并冲突消失,还想让我的目录恢复到弹出窗口之前的状态。
我尝试了git合并-abort,但git声称没有合并正在进行中。是否有一种简单的方法来中止弹出,而不破坏我原来在目录中的更改?
我开了个藏宝箱,合并发生了冲突。与被列为重复的问题不同,我已经在我想保留的目录中有一些未提交的更改。我不只是想让合并冲突消失,还想让我的目录恢复到弹出窗口之前的状态。
我尝试了git合并-abort,但git声称没有合并正在进行中。是否有一种简单的方法来中止弹出,而不破坏我原来在目录中的更改?
当前回答
好吧,我想我已经设法找到了一个工作流程,可以让你回到你需要的地方(就像你没有做流行一样)。
事先做个备份!!我不知道这是否适用于你,所以复制你的整个回购以防它不起作用。
1)修复合并问题,并通过选择所有来自补丁的更改来修复所有冲突(在tortoisemerge中,这显示为一个)。REMOETE(他们的))。
git mergetool
2)提交这些更改(它们已经通过mergetool命令添加)。给它一个“合并”的提交消息或其他你记得的东西。
git commit -m "merge"
3)现在你仍然会有你最初开始的本地未分阶段的变化,从补丁中重新提交(我们可以稍后摆脱这个)。现在提交未分阶段的更改
git add .
git add -u .
git commit -m "local changes"
4)反转补丁。这可以通过以下命令来完成:
git stash show -p | git apply -R
5)提交以下更改:
git commit -a -m "reversed patch"
6)取消patch/unpatch提交
git rebase -i HEAD^^^
从中删除带有“merge”和“reversed patch”的两行。
7)找回你的unstancing changes,并撤销“local changes”的提交
git reset HEAD^
我已经运行了一个简单的例子,它让你回到你想要的地方-直接在隐藏之前被弹出,与你的本地变化和隐藏仍然可用的弹出。
其他回答
尝试使用if跟踪文件。
git rm <path to file>
git reset <path to file>
git checkout <path to file>
我可以在“脏”目录上重新生成干净的git stash pop,具有未提交的更改,但尚未生成合并冲突的pop。
如果在合并冲突中,你试图应用的stash没有消失,你可以尝试检查git show stash@{0}(可选与-ours或-their),并与git statis和git diff HEAD进行比较。您应该能够看到哪些更改来自应用存储。
好吧,我想我已经设法找到了一个工作流程,可以让你回到你需要的地方(就像你没有做流行一样)。
事先做个备份!!我不知道这是否适用于你,所以复制你的整个回购以防它不起作用。
1)修复合并问题,并通过选择所有来自补丁的更改来修复所有冲突(在tortoisemerge中,这显示为一个)。REMOETE(他们的))。
git mergetool
2)提交这些更改(它们已经通过mergetool命令添加)。给它一个“合并”的提交消息或其他你记得的东西。
git commit -m "merge"
3)现在你仍然会有你最初开始的本地未分阶段的变化,从补丁中重新提交(我们可以稍后摆脱这个)。现在提交未分阶段的更改
git add .
git add -u .
git commit -m "local changes"
4)反转补丁。这可以通过以下命令来完成:
git stash show -p | git apply -R
5)提交以下更改:
git commit -a -m "reversed patch"
6)取消patch/unpatch提交
git rebase -i HEAD^^^
从中删除带有“merge”和“reversed patch”的两行。
7)找回你的unstancing changes,并撤销“local changes”的提交
git reset HEAD^
我已经运行了一个简单的例子,它让你回到你想要的地方-直接在隐藏之前被弹出,与你的本地变化和隐藏仍然可用的弹出。
好吧,我想我已经解决了"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)
一些想法:
使用git mergetool将合并文件拆分为原始部分和新部分。希望其中一个是包含你非隐藏更改的文件。 反向应用隐藏的diff来撤销这些更改。您可能必须手动分离合并冲突的文件(希望上面的技巧可以奏效)。
这两个我都没有测试过,所以我不确定它们是否能工作。