管理将多个版本的 repo 统一到一个通用的基本分支中 - 最佳实践工作流程?

Managing the unification of several versions of a repo into a generic base branch - best practice workflow?

我被赋予了 'taking ownership' 我们的一个插件的任务,在几年的时间里,它针对不同的客户分成了不同的版本,因此我们有大约 5 个不同的 'prod' 版本,一些添加了相同的功能,一些缺少功能。

基本上我需要做的是创建一个通用的基础分支,合并其中的所有各种更改并确保没有遗漏任何内容。然后我们要开始为所有客户端使用通用分支。

解决这个问题的最佳方法是什么?

我没有对一个大项目和许多不同版本做过这样的事情,所以我不确定最好的做法是确保,首先我不会错过任何提交并最终缺少功能,其次只是一般的工作流程,这将使这尽可能轻松。

谢谢。

git有点像时光机

您现在陷入了困境,因为您有 五个 个独特的软件版本需要协调成一个统一的产品。事后看来,如果在添加功能时将分支合并并重构为一个通用产品,这个问题甚至不会存在。你的树可能有这样的东西;

           C--D
          /
R--*--*--*--*--*--E
    \  \
     A  B

Even if you don't have a tree at the moment as long as you know the history you can infer one and use the same process by copying versions over your working copy instead of merging.

如果我们能回到我们第一次分叉(AB)并将它们合并成 base-branch 的时候,那将是多么令人惊奇。您可以使用 git checkout 命令来做到这一点;

$ git checkout -b base-branch R

给予;

R--*--*
    \  \
     A  B

这感觉更易于管理; git merge A 是一个快进,然后 git merge B 将需要一些重构,但我们会有;

     *--B   
    /    \
R--*---a--b <- (base-branch)
    \ /
     A

这正是您希望发生的事情。第一个功能集 A 被合并到 base-branch,然后是功能集 B 将进行所有必要的重构。

想象一下您又回到了过去,但在这个时间线中我们有 base-branch,并且我们刚刚发布了 CDE。我们想要 base-branch 中的那些功能集。您可以继续git merge C、重构、git merge D,因为它可能不再是快进了。最后 git merge E,重构,大功告成。

         *--*--E
        /       \
       *--C--D   \
      /    \  \   \
     *--B   \  \   \
    /    \   \  \   \
R--*---a--b---c--d---e <- (base-branch)
    \ /
     A

您最终得到的是与您想要的完全一样的项目历史记录。每个功能集都按时间顺序开发,就好像它一直都是正确完成的一样。

这并不容易,您将进行比 gitting 更多的重构。把你自己放在当时作者的思维模式中,并像他们那样融入你的后见之明。

变基意味着重新应用可能大量的提交,考虑到每个分支中的大量提交,这可能很麻烦。

一种更简单的方法是使用您的 latest 分支,然后

  • 创建一个新的 "refactoring" 分支
  • merge(而不是变基)在 's
  • 之后的各个其他分支到该重构分支
  • 从通用的内容中区分特定于环境的内容
  • 在环境特定数据所在的位置添加变量占位符和值文件
  • use a content filter driver 以便能够为不同的环境签出相同的代码。


(图片来自 "Customizing Git - Git Attributes" from "Pro Git book")