Git:恢复分支合并并保存基于此的提交

时间:2013-06-01 11:49:49

标签: git

我有一个非常具体的案例与Git,我需要帮助通过。几个星期前,一个有一些重大变化的分支被合并到掌握,现在,它需要消失。但是,我们不希望丢失一些其他提交给master的提交,这与其他分支无关。

我们如何删除分支合并并在新HEAD之上重新应用其他提交?

3 个答案:

答案 0 :(得分:1)

最好的方法是使用git revert恢复合并。

git help revert说:

  -m parent-number, --mainline parent-number
      Usually you cannot revert a merge because you do not know which side of the
      merge should be considered the mainline. This option specifies the parent
      number (starting from 1) of the mainline and allows revert to reverse the
      change relative to the specified parent.

      Reverting a merge commit declares that you will never want the tree changes
      brought in by the merge. As a result, later merges will only bring in tree
      changes introduced by commits that are not ancestors of the previously
      reverted merge. This may or may not be what you want.

      See the revert-a-faulty-merge How-To[1] for more details.

如果您真的想要更改历史记录以从历史记录中删除合并,并且您真的意识到可以使用git rebase执行此操作的所有后果:

git rebase --onto $good_commit $merge_commit branch

merge_commit是错误的合并提交,而good_comit是已知良好的父级。

请注意,在两种情况下,如果较新的提交更改了合并提交引入的代码,则可能很难这样做。

答案 1 :(得分:0)

根据您的描述,听起来像alteration_branch的所有更改都在主人身上。如果您不提供强制选项,通常按git branch -d alteration_branch删除分支将不会删除历史记录。我建议只是尝试删除它。

答案 2 :(得分:0)

就个人而言,我会创建一些临时分支,从两个分割(基础)点开始(一个用于旧分支,一个用于合并之前的主分支)。我在master的顶端创建了两个分支,然后在这两个临时基本分支分支上交互式rebase'master'(实际上是那两个tip分支),通过从rebase todo列表中选择正确的提交来创建所需的顺序。请记住包括合并中发生的任何更改(检查rebase选项,因为默认情况下会忽略合并)

现在,您应该有两个新的,独立的开发线,代表您期望的结果。如果没有,请重复此过程。

最后强制更新master和分支的两个分支引用(例如git update-ref),然后在推送更新时声明标记日,并且每个人都必须强制执行(永不重写)历史日)