撤消Git中的合并,以便不存在来自其他分支的提交
我有两个分支:开发和漏洞修复,两到三周前,我意外地将开发分支合并到漏洞修复中,从那时起我一直在做漏洞修复,并且我推动了漏洞修复中的变化 现在,我需要取消合并开发分支。我想要一个纯粹的bug修复分支,没有提交表单开发分支。通过谷歌搜索,我想到了以下场景: 1) 恢复合并了bug_fixes分支中的development分支的提交,但它部分完成了工作。来自开发分支的提交仍然可以在缺陷修复分支中看到,这是不需要的 2) 并删除进行合并的提交,但仍然存在第1点中描述的相同问题bug\u修复分支仍然包含来自开发分支的提交撤消Git中的合并,以便不存在来自其他分支的提交,git,github,version-control,branch,branching-and-merging,Git,Github,Version Control,Branch,Branching And Merging,我有两个分支:开发和漏洞修复,两到三周前,我意外地将开发分支合并到漏洞修复中,从那时起我一直在做漏洞修复,并且我推动了漏洞修复中的变化 现在,我需要取消合并开发分支。我想要一个纯粹的bug修复分支,没有提交表单开发分支。通过谷歌搜索,我想到了以下场景: 1) 恢复合并了bug_fixes分支中的development分支的提交,但它部分完成了工作。来自开发分支的提交仍然可以在缺陷修复分支中看到,这是不需要的 2) 并删除进行合并的提交,但仍然存在第1点中描述的相同问题bug\u修复分支仍然包含来
是否有一种方法可以删除合并提交,并且所有在分支形式开发分支中出现的提交也将被删除?或者,这是不可能的?如果您知道哪些提交来自开发分支(除了合并提交之外),您可以从最后一次良好的错误修复提交开始执行以下操作:
b--b--(B)--M--d--b--d--b--b (bugfix)
/
d--d--d (devel)
git checkout bugfix
git rebase -i (B)
# drop M, d, and d
b--b--(B)--b'--b'--b' (bugfix)
d--d--d (devel)
更复杂的替代方案可能是一个,但希望交互式的重新基准就足够了
在年代,完整的命令是:
git rebase -p -i (b)
-p
允许保留合并提交。我将尝试以下方法:
首先,列出两个分支中的提交:
git checkout development
git log --oneline > log-devel.txt
git checkout bug_fixing
git log --oneline > log-bugfixing.txt
其次,在执行合并之前,在每个分支中标识最后一次提交的id。让我们将这些提交命名为devel-0
和buggfixing-0
然后,将分支恢复到意外合并之前的状态:
git checkout development
git reset --hard <devel-0-hash>
git checkout bug_fixing
git reset --hard <bugfixin-0-hash>
考虑到提交最好按照与添加到bug修复分支相同的顺序添加到clean分支,以便将出现的冲突数量降至最低。在合并之前,您需要知道关于bug\u修复的最新提交消息,如果你知道sha哈希,那么evne会更好 现在,首先需要使用命令查找sha哈希 $git reflog 输出类似于 1fb5738头@{10}:提交 4d47df6头@{11}:提交 5f32c4b头@{12}:合并 428f91d头@{13}:签出 5f32c4b头@{14}:签出 第一部分是sha散列。在这种情况下,合并前的状态具有哈希值428f91d 现在,在bug_fixes分支中,我们重置为这个散列值 git重置—硬428f91d
现在它被撤销了让我用下面的一个例子来描述这个场景 错误修复分支:修订版10 合并开发分支:修订版11 合并后的多个更改:版本12-版本15 - 现在需要完成两个步骤(不使用git本机命令的简易方法)
事情是这样的:我可以看到从开发分支到bug_修复分支的提交,就在合并提交的后面。这并不是说我必须在合并提交之后只删除提交;有来自开发分支的提交,它们以bug_修复的方式存在,然后再进行合并提交。这就像整个bug修复的历史都被重写了一样。@ArslanAli然后检查你的
git reflog
()看看你是否能检测到bug修复被重写的原因。我肯定会通过git reflog
查看这个分支。还有一件事:我在git-rebase
@ArslanAli中看不到我的合并提交。您是否使用正确的提交(合并提交之前的提交)执行了git-rebase-I
,我正是按照你在评论中所说的方式来做的。你为什么不再创建一个第三个分支未来
,并使用cherrypick
来完成你的工作。请阅读这里如何“取消”你想要的提交。这里有一个问题:我不能只挑选提交,因为bug\u修复了branch在合并提交之后包含了来自development
分支的提交。那么我应该从哪里开始呢?
git checkout development
git cherry-pick `abc0123`