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

时间:2016-04-10 16:40:05

标签: git github version-control branch branching-and-merging

我有两个分支:开发 bug_fixes ,我偶然在 bug_fixes 中合并开发分支两到三周前,并且从那时起一直致力于 bug_fixes ,并且我已经推动了 bug_fixes 中的更改。

现在,我需要取消合并开发分支。我想要一个纯 bug_fixes 分支,没有提交开发分支。通过谷歌搜索,我提出了以下场景:

1)恢复在 bug_fixes 分支中合并开发分支的提交,但它部分完成了这项工作。来自开发分支的提交仍然可以在 bug_fixes 分支中看到,这是不需要的。

2)重新启动,并删除执行合并的提交,但它仍然存在第1点中描述的相同问题。 bug_fixes 分支仍然包含来自开发的提交分支。

有没有办法可以删除合并提交,所有那些来自 bug_fixes 分支的开发分支的提交也会被删除?或者,这是不可能的?

4 个答案:

答案 0 :(得分:5)

如果您知道哪些提交来自开发分支(除了合并提交之外),您可以从错误修复的最后一次良好提交中执行git rebase -i (interactive rebase)

 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 filter-branch,但希望交互式rebase就足够了。

OPcase中,完整的命令是:

git rebase -p -i (b)

-p允许保留合并提交。

答案 1 :(得分:4)

我会尝试以下方法:

首先,列出两个分支中的提交:

git checkout development
git log --oneline > log-devel.txt

git checkout bug_fixing
git log --oneline > log-bugfixing.txt

其次,在执行合并之前,在每个分支中标识最后一次提交的id。我们将这些提交命名为devel-0bugfixing-0 然后,将您的分支机构置于意外合并之前的状态:

git checkout development
git reset --hard <devel-0-hash>

git checkout bug_fixing
git reset --hard <bugfixin-0-hash>

此时你有两个干净但过时的git分支。现在,您应该从log-devel.txtlog-bugfixing.txt获取当前分支中未包含的所有提交,并将它们添加到相应的分支。要向您的分支abc0123添加ID为development的提交,您可以使用cherry pick

git checkout development
git cherry-pick `abc0123`

考虑到提交最好以与添加到bug修复分支相同的顺序添加到干净分支中,以便最大限度地减少出现的冲突数量。

答案 2 :(得分:1)

您需要在合并之前了解 bug_fixes 的最新提交消息,如果您知道sha hash,那就更好了。

现在首先需要使用命令

找到sha哈希
  

$ git reflog

输出类似于

  

1fb5738 HEAD @ {10}:commit ...

     

4d47df6 HEAD @ {11}:commit ...

     

5f32c4b HEAD @ {12}:合并......

     

428f91d HEAD @ {13}:结帐......

     

5f32c4b HEAD @ {14}:结帐......

第一部分是sha哈希。在这种情况下,合并前的状态具有哈希值428f91d

现在,在 bug_fixes 分支中,我们重置为此哈希值

  

git reset --hard 428f91d

现在它已撤消

答案 3 :(得分:0)

让我用下面的例子来描述场景

错误修复分支:修订版10

Merged Dev Branch:Revision 11

合并后的多项更改:修订版12 - 修订版15

-

现在需要完成两个步骤(没有git native命令的简单方法)

  1. 返回修订版10

    克隆名为“latest”的文件夹的最新代码

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

    从最新文件夹

    中删除所有内容(.git文件夹除外)

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

    检查最新的文件夹内容

  2. 现在,Bug修复分支的内容将等于修订版10,而无需任何开发人员分支更改

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

      由于我们已经恢复到旧的版本,最新提交到bugfix分支也没了 此修订需要逐个手动合并回bug修复分支