恢复合并提交并在以后合并提交的子集

Reverting a merge commit and merging a subset of commits back in later

我有不同的发布分支,比方说

release_2 分支是很久以前创建的,所以它只包含 release_0。 release_3 分支是从 release_1 创建的。

我的印象是release_2应该有release_3的代码,所以我将release_3合并到release_2。
后来有人告诉我 release_2 将在 release_3 之前上线,所以我从 release_2 恢复了合并提交(并推送了恢复提交)。
然而,由于 release_1 已经投入生产,所以我尝试将 release_1 的更改合并到 release_2(release_2 基于 release_0)。不幸的是 git 说 'Already up to date.'。这是因为我将 release_3 合并到 release_2(虽然已还原)并且 release_3 已经包含 release_1.

遇到这种情况我该怎么办?我阅读了 但它似乎不是解决方案,因为我需要从 release_2.

中删除 release_3 代码

谢谢!

本质上,您试图将 release_2 置于一种状态,该状态等同于将 release_3 合并的 部分 还原到其中。 (因此恢复恢复将不起作用。)不幸的是,除非您在合并之前将 release_2 进行干净的硬重置,否则这将是混乱的。如果满足以下条件,我会考虑硬重置:

  1. 自从 release_3.
  2. 的不良合并后,release_2 上没有多少 activity
  3. 您需要继续 release_2 的任何新提交都可以 re-written 而不会导致问题。
  4. 与团队沟通您正在重置 release_2 会非常直接,并且您可以向任何正在开发分支的开发人员提供适当的 git rebase --onto 命令它。

如果您无法进行重置,那么最简单的方法可能就是进行一次新提交,该提交代表 release_1 上尚未在 release_2 中进行的所有更改并将其合并。(补丁也可以。)像这样:

# On release_2, identify the commit before the merge; let's call it CBM
# Make a temp branch pointing to release_1
git switch -c release_1-contents origin/release_1 --no-track
# Reset soft to point to the merge-base of this branch and CBM
git reset --soft $(git merge-base HEAD CBM)
git commit -m "Squash contents of Release_1 content"
# now merge it into release_2
git switch release_2
git merge release_1-contents # use the commit message to explain what and why

旁注:当尝试在还原后再次引入提交时,重要的是它们的提交 ID;如果您更改它们,您可以再次将它们带入。如果 release_1 上没有太多提交,并且你不介意在回购中永远重复提交,你可以 re-write 通过 cherry-picking 范围或使用 rebase -frelease_1 上简单地 re-write 提交 ID,然后您可以再次合并它们。如果有很多提交,尽管我可能倾向于进行单个压缩提交,如上所述。