恢复合并提交并在以后合并提交的子集
Reverting a merge commit and merging a subset of commits back in later
我有不同的发布分支,比方说
- release_0(去年发布)
- release_1(今年发布)
- release_2(开发中)
- release_3(开发中)
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
进行干净的硬重置,否则这将是混乱的。如果满足以下条件,我会考虑硬重置:
- 自从
release_3
. 的不良合并后,release_2
上没有多少 activity
- 您需要继续
release_2
的任何新提交都可以 re-written 而不会导致问题。
- 与团队沟通您正在重置
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 -f
在 release_1
上简单地 re-write 提交 ID,然后您可以再次合并它们。如果有很多提交,尽管我可能倾向于进行单个压缩提交,如上所述。
我有不同的发布分支,比方说
- release_0(去年发布)
- release_1(今年发布)
- release_2(开发中)
- release_3(开发中)
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
进行干净的硬重置,否则这将是混乱的。如果满足以下条件,我会考虑硬重置:
- 自从
release_3
. 的不良合并后, - 您需要继续
release_2
的任何新提交都可以 re-written 而不会导致问题。 - 与团队沟通您正在重置
release_2
会非常直接,并且您可以向任何正在开发分支的开发人员提供适当的git rebase --onto
命令它。
release_2
上没有多少 activity
如果您无法进行重置,那么最简单的方法可能就是进行一次新提交,该提交代表 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 -f
在 release_1
上简单地 re-write 提交 ID,然后您可以再次合并它们。如果有很多提交,尽管我可能倾向于进行单个压缩提交,如上所述。