使用Git删除不必要的合并提交并进行变基

12

我有一个从develop分支拉出来的特性分支。为了使我的项目中上下游存储库的提交历史线性化,我开始使用将特性分支与develop重新基于而非合并的做法。

现在的情况是,有人已经将develop分支合并到特性分支中,并继续进行了一些提交,然后将其推送到远程。我想要达到的目标是删除合并提交并挑选出分支上的后续提交。当然,这需要其他人删除他们本地的分支,并拉取修改后的分支。由于我们在一个小团队协作,因此这是可行的。

在这种情况下,最好的方法是交互式地重新基于选择除合并提交外的所有提交吗?

git rebase -i commit-sha-before-merge

我知道这很可能会导致构建失败,因为在合并之后发生的提交依赖于合并时的代码。但我会通过最后将特性分支与develop重新基于来解决这个问题。


2
与大多数 Git 相关的事情一样,并没有必然的“最佳”方式,但通常会起作用。个人而言,我可能会创建一个新分支,并执行一系列 git cherry-pick 操作来引入这些项,可能在进行操作时修复它们。交互式变基是一系列自动化的 cherry-pick 操作(加上最后的标签移动),因此这实际上几乎是相同的事情,但允许我停下来休息更多。 :-) - torek
没错,我肯定会创建一个备份分支哈!我认为交互式变基意味着我需要做的工作更少,但正如你所说,手动一系列的 cherry-pick 更具有控制性。 - teddy777
1个回答

14

正如torek在评论中所指出的,Git中有多种方法可以实现此操作。例如,假设您有一个如下所示的提交图:

develop *-------*
         \       \
  feature *---*---*---*---*
          X   M^  M   Y^  Y

Great! Just let me know what text you need translated and into which language. I'll do my best to help.
# Create a temporary branch at the commit right before the merge commit M
git checkout -b temp M^

# Rebase onto the develop branch
git rebase develop

# Now rebase the remaining commits after M onto the temp branch
git rebase --onto temp M feature

这将生成以下提交记录图。
        X   M^  Y^  Y
*---*---*---*---*---*
    ^       ^       ^
 develop   temp  feature

现在,您可以使用git branch --delete temp命令删除临时分支。

解决方案2:Cherry-picks

以下是如何使用cherry-picks实现相同结果的方法,就像torek建议的那样

# Temporarily hard reset feature to the develop branch
git checkout feature
git reset --hard develop

# Cherry-pick all commits between X to M^.
# The start of the cherry-pick range is exclusive, i.e. it doesn't include
# the starting point X^.
git cherry-pick X^..M^

# Cherry-pick all commits between M to Y
git cherry-pick M..Y

文档


(注:原文为关于 Git 技术的文档链接,请自行参考)

我可以确认在我的特性分支上执行 git reset --hard develop 命令会保留 M..Y 范围内的提交吗?它们不会丢失吧? - teddy777
所以只需仔细阅读 git reset --hard 相关文档 - 提交记录将在我的 reflog 中可用。 - teddy777
@user3406268 对,它们会在你的“reflog”中。或者只需将它们的提交哈希复制到某个地方,这样你就能记住它们了。 - user456814

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接