如何在Git中管理多个版本的代码?

如何在Git中管理多个版本的代码?,git,github,Git,Github,故事是这样的, 我有一个大型的软件源代码,web前端,它实际上有数百个客户,达到近千个客户,我的计划是,每个客户都将直接链接到这个git repo中的一个特定分支(对于源代码),没有客户会在我们的git repo中共享相同的分支名称 现在,我在一些客户机甚至所有客户机上部署特性的方式面临挑战 假设当前所有分支(所有客户端)都从相同的提交历史开始,即: 分支上的git日志:master,client1,…,client900: 承诺10 委员会9 委员会1 然后,从分支master我为fea

故事是这样的, 我有一个大型的软件源代码,web前端,它实际上有数百个客户,达到近千个客户,我的计划是,每个客户都将直接链接到这个git repo中的一个特定分支(对于源代码),没有客户会在我们的git repo中共享相同的分支名称

现在,我在一些客户机甚至所有客户机上部署特性的方式面临挑战

假设当前所有分支(所有客户端)都从相同的提交历史开始,即:

分支上的git日志:
master
client1
,…,
client900

  • 承诺10
  • 委员会9
  • 委员会1
然后,从分支
master
我为
feature\u a
创建了一个开发分支,然后我为该功能开发了所有必要的代码

我的计划只是将
feature\u a
部署到100个客户端,即将所有提交从
feature\u a
合并到
client1
client100

它完美无缺

然后,从分支
master
再次为
feature\u b
创建了一个开发分支,然后为该功能开发所有必要的代码

现在,我的计划是将
feature\u b
部署到所有客户端,即将所有提交从
feature\u b
合并到
client1
client900

我们的目标是让
client1
client100
拥有2个功能,而其余的只有1个附加功能

由于开发
feature\u a
feature\u b
需要更改许多相同的文件,这将导致分支
client1
client100
的合并冲突


修复成百上千的合并冲突对我来说不是一个选择,有没有更好的方法来解决这个问题?或者有没有更好的git repo体系结构设计或方法,以便将功能部署到某些客户机,然后部署到所有客户机时能够无缝解决问题?

我不同意这种构建代码的方式,我也同意评论员的说法,即您应该使用功能标志。如果你关心代码甚至是客户机,那么你应该把特征标志看作是构建过程的一部分,这样给定的工件只有你想要的特性。
也就是说,对于“少量”功能,您可以通过使用标记来改善您的情况

给每个客户机一个唯一的标记,而不是每个客户机都有一个唯一的分支。大多数git操作都会执行相同的操作,但是更改它们指向的代码要容易得多

那么你的分支应该是基于特征的。因此,您将拥有只包含功能a代码的
功能a
。然后您就有了功能b的
,其中代码仅用于功能b。然后您就有了同时包含功能a和b的
功能a和b
,您只需在一个点上解决冲突

对于部署,您只需将标记更改为指向所需的分支-
client1
client100
指向
feature\u\b
client101
client900
指向
feature\u\b

然后假设client562决定升级(或其他),现在他们需要功能a。超级简单-只需将标签
client562
更改为指向
feature\u a\u b
。不需要合并


但是如果有特定于客户端的更改怎么办?

在功能分支之外创建一个客户端分支,并在那里进行更改

但是如果存在特定于客户端的更改,并且这些更改改变了功能,该怎么办?

对于客户机分支,只需将特定于客户机的提交重新设置到相应的功能分支上


引入的功能越多,这就越复杂,特别是您需要
2^(n-1)
功能分支,其中
n
=功能的数量。在实践中,如果某些特征必须存在才能使其他特征发挥作用(即特征j只有在特征c存在时才有意义),则该值可能较低,但这是一个合理的近似值


然而,这是一个非常复杂的方法来做这件事,我不愿意在这种环境下实际工作。我仍然认为这是对管理1000个分支的一种改进,但是我希望你会考虑一种不同的方式来管理你的部署。

< P>我不同意这种构造你的代码的方式,我同意评论家说你应该使用特征标志。如果你关心代码甚至是客户机,那么你应该把特征标志看作是构建过程的一部分,这样给定的工件只有你想要的特性。
也就是说,对于“少量”功能,您可以通过使用标记来改善您的情况

给每个客户机一个唯一的标记,而不是每个客户机都有一个唯一的分支。大多数git操作都会执行相同的操作,但是更改它们指向的代码要容易得多

那么你的分支应该是基于特征的。因此,您将拥有只包含功能a代码的
功能a
。然后您就有了功能b的
,其中代码仅用于功能b。然后您就有了同时包含功能a和b的
功能a和b
,您只需在一个点上解决冲突

对于部署,您只需将标记更改为指向所需的分支-
client1
client100
指向
feature\u\b
client101
client900
指向
feature\u\b

然后假设client562决定升级(或其他),现在他们需要功能a。超级简单-只需将标签
client562
更改为指向
feature\u a\u b
。不需要合并


但是如果有特定于客户端的更改怎么办?

在功能分支之外创建一个客户端分支,并在那里进行更改