Git 由于樱桃采摘,分支机构之间存在巨大差异

Git huge diff between branches due to cherry picks

背景

我们正在开发一个有很多“版本”的小产品,每个版本都包含对主题和文本等的不同定制。我们目前只有一个 git 存储库,并将每个定制版本放在一个分支中。然而,定制的内容散落在 repo 中各处。每当我们引入一项新功能或修复一些错误时,我们都会在一个分支上进行,然后挑选它(没有 -x,虽然我不知道它是否重要)到其他分支。然后我们可能会在 --amend 或冲突解决期间更改一些颜色或文本。

问题

每个分支都有一个独特的历史树,并且 git 表示有大量的提交彼此前后。虽然commit内容都差不多

问题

  1. 现在我正在尝试重构代码并将自定义项收集到一个地方。这样做之后,有没有办法消除巨大的旧提交差异?
  2. 如果我仍然想保留许多分支(仅针对不同的元信息和服务器配置,而不是在编译时通过构建工具注入这些值),我有比 cherry-pick 更好的解决方案吗?它们会依赖于 1 中提到的旧提交差异的解决方案吗? (即 mergerebase)(但理想情况下,我们不需要在选择提交后修改提交,因为自定义内容将被提取出来)
  3. git 在分支之间存在较大的提交差异(不同的历史树)但在分支头之间存在较小的代码差异是否存在任何性能或磁盘使用问题?

分支之间存在较大差异这一事实本质上并不是问题。 Git 将数据存储为每次提交时存储库的一组快照,而不是分支之间的一系列差异。它确实在打包时将单个对象存储为与其他类似对象的增量,但除非您存储许多二进制对象,否则这通常不是问题。所以你可能还好。

但是,正如您所发现的那样,保留一个主要分支并进行挑选的方法有点像维护噩梦。正如您所暗示的那样,最好有一个具有一定可配置性的统一代码库以及每个版本的一组配置选项。

如果你走那条路,那么你可以只有一个主分支和一个目录或充满配置文件的目录,或者你可以有一个主分支和一个单独的分支,该分支仅在其配置文件上有所不同。使用后一种方法,最好的办法是合并主分支而不是挑选,或者将您的子分支重新定位到主分支。 Rebased 分支对于其他人来说可能很难处理,所以我推荐合并方法。

但是,如果您坚持择优选择,那么在您提到的场景中,您的大部分代码都不会有所不同,因此 git cherry-pick 不太可能出现问题。当您进行合并或挑选时,合并基础之外的分支历史无关紧要,因此拥有令人讨厌的历史应该不是问题。