2010-01-31 67 views
23

我们有项目(PHP应用程序),但每个客户端的安装会有所不同,有时很少,有时甚至更多。尽管如此,源代码的很大一部分是很常见的。我们将特定安装作为并行分支管理到主分支,我们需要将更改从主分支转移到其他分支。同样的情况在Git: how maintain (mostly) parallel branches with only a few difference?解决的最投票的解决方案是这样转移设有分公司之间的变化:Git:如何维护永久并行分支

git pull 
git checkout local 
git rebase master 

如在方案中提到它创建非快进垫底后推,我觉得非常不愉快的并发症。我的问题是 - 为什么不这样做,而不是:

git pull 
git checkout local 
git merge master 
+0

也许你的意思呢? http://stackoverflow.com/questions/2850369/why-does-git-use-fast-forward-merging-by-default – cregox 2012-05-16 17:03:33

回答

5

这真的取决于你想要做什么与分支。是的,如果你在本地进行重组,它会在重新绑定后创建非快进。另一方面,你会保持一系列不同的变化,你的分支上的变化将会是一系列变化,如果他们已经变成了最新的掌门人。

将主人合并到本地,而是保持本地人与主人及时向前行进,并记录发生的历史记录。如果你需要能够重建过去的本地状态,那么你会想做到这一点。历史将永远不会改变。但是,你将有更复杂的历史来处理。

+0

在我的团队中,我们(几乎总是)重新绑定任何将要重新合并的分支。经常尽可能地让rebase变得更容易。这简化了您回来后对变更历史的理解。 当我们必须同时维护两个分支并且释放两个分支时(维护和开发版本等) - 那么我们不能再分配,这太混乱了。我们开始合并。 – 2010-01-31 02:12:21

2

Greg's answer您的其他问题似乎查看不同分支机构其余地方以特定的安装,而不是推到其他回购(强调):

如果它是本地系统,将其提交到该系统的“本地”分支,否则将其提交到“主”并将其推送到公共存储库。

你几乎总是希望快进到共享库中的分支。 git rebase documentation解释了如何从上游rebase(,即,git rebase,然后git push -f)恢复,对任何参与者都没有好处。

对于另一种方法,请参见Never merging back

有有效的情况下,你曾经有意向叉从不合并回去,但一般而言,您应该尽量很难保持这样的叉的变化最小。

作者继续在同一个存储库中讨论各种客户版本的分支策略。

17

这个想法是你使用一个共同的分支,和两个(或多达你需要的)客户特定的分支。所有常见更改都会进入 主数据库,并且每个客户分支机构都会获得仅与该客户的 有关的更改。定期(当主人被认为是在 稳定点),您将合并更改从主人到客户 分支(git checkout custA; git merge master)。这会在客户分支中引入更新的“常见”代码 。你永远不会合并其他 的方式 - 这会污染主客户特定的代码。

当您向客户A交付货物时,您会签出“custA” 分行并发送该分行。当然对于其他客户也是如此。

现在我们假设您获得一位新客户“C”,稍后找到客户A和C需要的 功能,但B不需要。您创建(也称为“fork”)关闭主(git checkout -b AC_feature master), 代码/测试它的分支,随时进行提交,然后将其合并到A和C (git checkout A; git merge AC_feature and similarly for customer C)中。 你不要在它的代码,然后依靠合并成一个C,因为 ,将得到所有A到C.

如果一段时间后,你会发现在该功能一个小错误,你让 在同一分支(git checkout AC_feature; edit/test/commit), 中更改,然后如上所述将它合并到custA和custC中。

来源:从Gitolite的开发商,这些令人耳目一新的明确的和有益的文章 - Sitaram Chamarty,写的部分与朱尼奥·哈默诺直接输入(Linus Torvalds的维护Git的合作伙伴)。

维护并行的顾客分行:

http://gitolite.com/archived/special-branches.html

的 “固定Up” 的公用和客户分行在下一篇文章:

http://gitolite.com/archived/special-branch-fixups.html