同时对分支进行变基和反向合并

Doing both a rebase and a reverse merge to a branch at the same time

当您有一个长期存在的功能分支时,有两种标准方法可以使其与您的主要发布分支保持同步,而无需实际将您的代码放入主要发布分支。

定期地,根据主要发布分支重新设置功能分支的基线,或者将主要发布分支中的更改反向合并到功能分支。

rebase 转换为:

A - - - PRIMARY BRANCH
 \
  \-1-2-3-FEATURE BRANCH

进入这个:

A - - - PRIMARY BRANCH
         \
          \-1'-2'-3'-FEATURE BRANCH

其中 1' 2' 3' 是原始 1 2 3.

的变基版本

合并转换成

A - - - PRIMARY BRANCH
 \          \
  \ -1-2-3-  X - FEATURE BRANCH

其中 X 是一个合并提交,它在 PRIMARY 和原始 FEATURE 分支中都有父项。

rebase 解决方案的一个缺点是,拥有功能分支副本的人现在有一组看似无关的更改,因为他们的 1 23 不是与变基后的 CLs 相同。

变基案例中的变化反映了主分支上的变化“就像你在变基时所做的那样”。这有一些不错的特性,好像您可以一次回滚这些更改并查看它们在当前主分支中的行为。

问题

有没有一种简单的方法可以使用标准 git 工具同时完成这两项工作,既保持与原始功能分支的连接,又保持一组 CL 表示针对当前主分支执行此操作?

A - - - PRIMARY BRANCH
 \        \ 1'-2'-3' -
  \                   \
   \ -1-2-3----------- X - FEATURE BRANCH

在这种情况下,X 将与反向合并场景中的 X 具有相同的内容,除了它还声明原始功能分支是父 CL。

由此,我们得到了 rebase 工作流程,但其他有权访问原始功能分支的人并没有被抛弃——如果他们重新合并到上游 FEATURE,git 完全理解发生了什么.

A - - - PRIMARY BRANCH
 \        \ 1'-2'-3' -
  \                   \
   \ -1-2-3----------- X - FEATURE BRANCH
           \- 3rd party

第 3 方 CL 有一个清晰的合并路径,可以移动到 FEATURE BRANCH 的顶端,而不是在

的情况下必须处理的混乱情况
A - - - PRIMARY BRANCH
 \        \ 1'-2'-3' - FEATURE BRANCH
  \                  
   \ -1-2-3-- OLD FEATURE BRANCH
           \- 3rd party

传统的 rebase。

Is there an easy way using standard git tools to do both at once... ?

是的,您可以完全按照您的建议轻松创建图表:

git fetch
git checkout feature
git branch feature-old-copy # create a copy of feature
git rebase origin/primary
git merge --strategy=ours feature-old-copy

注意最后合并应该没有效果;也就是说,这是一个毫无意义的合并 except 以将旧的提交 ID 集保留在分支中...

但是,恕我直言,我认为您首先错误地确定了选择变基的主要原因。您的陈述:

The changes in the rebase case reflect the changes "as if you did it at the moment of rebase" on the primary branch. This has some nice properties, as if you can roll back these changes one at a time and see how they behave in the current primary branch.

合并也是如此。 (你可以恢复一个提交,不管它是用 rebase 重写还是合并,尽管 rebase 确实有一点好处。*)rebase 的主要好处是一个更清晰的历史,没有(通常)不必要的多个合并提交.例如,当我使用变基工作流时,我通常每天多次变基到未来的目标分支。如果我的分支持续 2-3 天,我可能在我的分支上保存了 10 个不必要的合并提交。使用您建议的工作流程,您并没有真正获得 rebase 的好处,因此我认为它没有那么有用。

所以,是的,你可以做到,但我质疑这样做的价值。


*恢复合并下的单个提交可能需要重新处理合并时发生的冲突,而使用变基它们已经解决并且更有可能完全恢复。