撤消Git中的合并,以便不存在来自其他分支的提交

撤消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修复分支仍然包含来

我有两个分支:开发漏洞修复,两到三周前,我意外地将开发分支合并到漏洞修复中,从那时起我一直在做漏洞修复,并且我推动了漏洞修复中的变化

现在,我需要取消合并开发分支。我想要一个纯粹的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本机命令的简易方法)

  • 回到第10版

    将最新代码克隆到名为“Latest”的文件夹中

    将修订版10克隆到名为“rev10”的文件夹中

    从最新文件夹中删除所有内容(除了.git文件夹)

    将所有内容(除了.git文件夹)从rev10文件夹复制到最新文件夹

    检查最新文件夹内容

  • 现在,Bug fix分支的内容将与修订版10相同,而没有任何开发人员分支的更改

  • 可选-将修订版12-修订版15合并到bug_fix分支

    当我们恢复到旧版本时,对bugfix分支的最新提交也消失了 此修订需要逐个手动合并回bug fix branch


  • 事情是这样的:我可以看到从开发分支到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`