我有一个非常具体的 Git 案例,我需要帮助才能完成。几个星期前,一个改动很大的分支被合并到了 master,现在,它需要离开。但是,我们不想丢失一些其他对 master 的提交,这些提交与其他分支无关。
我们如何删除分支合并并在新 HEAD 之上重新应用其他提交?
我有一个非常具体的 Git 案例,我需要帮助才能完成。几个星期前,一个改动很大的分支被合并到了 master,现在,它需要离开。但是,我们不想丢失一些其他对 master 的提交,这些提交与其他分支无关。
我们如何删除分支合并并在新 HEAD 之上重新应用其他提交?
最好的方法是使用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
及其已知良好的父级。
请注意,在这两种情况下,如果较新的提交更改了合并提交引入的代码,则可能很难这样做。
根据您的描述,听起来更改分支的所有更改都在 master 上。如果您不提供 force 选项,通常删除分支git branch -d alteration_branch
不会删除历史记录。我建议只是尝试删除它。
就个人而言,我会创建几个临时分支,从两个拆分(基)点开始(一个用于旧分支,一个用于合并之前的主分支)。我会在 master 的尖端创建两个分支,然后交互式 rebase 'master'(实际上是这两个尖端分支)到这两个临时基本拆分分支上,通过从 rebase todo 列表中选择正确的提交来创建您需要的顺序. 请记住包括在合并中发生的任何更改(检查 rebase 选项,因为默认情况下忽略合并)
现在你应该有两条新的、独立的、代表你想要的结果的发展路线。如果没有,请重复该过程。
最后,在您推送更新时声明标志日之前,对 master 和分支的两个分支引用(例如git update-ref
)进行强制更新,并且每个人都必须进行强制拉取(永不重写历史记录日)