[英]git multiple project merging
我们将一个项目分配到自己的代码库中,但它将紧跟其分支的项目。
我看到它像这样工作:
分叉项目将对品牌产品进行一些初步更改。 我不想与原始项目共享这些更改,但是我希望合并更改。
我们设置它的方式是单独的repos,它们现在具有相同的历史记录,只需为彼此添加遥控器。
我想到的工作流程如下:
我们应该尝试使用功能分支,每个功能只有1个提交,这样我们每个人都可以选择。 无论何时处理某个功能并进行提交,只需在该功能的分支中执行git commit --amend。 当它最终确定时,我可以挑选提交。
我不喜欢这个,因为如果在挑选樱桃之后功能发生变化,开发人员需要记住不会结束但是创建一个新的提交。
我希望通过合并或rebase来做到这一点。
构建此方法的一种可能方法是使用三个存储库,其中一个存储库是“白色标签版本”,另外两个存储库用于两个前端。 两个前端将“白色标签版本”存储库作为子模块引用。
有了这个结构,你:
如果你的两个前端相似,那么它们可以是一个存储库的分支(但都依赖于子模块)。 在这种情况下,如果您在两个前端之间来回合并,一个好方法是为每个功能创建一个分支。 每个功能都有一个分支,使您免于“每个分支一次提交”的限制。 [编辑]根据功能分支的性质,您可以a)使用<branch-base>..<branch-head>
来挑选所有提交。 或者b)将分支上的所有内容重新组合成一个提交,然后挑选一个提交或c)使用merge / rebase将功能分支转移到另一个分支上(参见git rebase
文档中的大量示例,尤其是--onto
选项。)[/ edit]
这里还有一个常见的,备受推崇的分支模型,其中讨论了特征分支。
[edit2]如果您愿意,可以使用一个存储库执行此操作。 保留三个主要分支:white-label-dev,prod1-dev,prod2-dev,让三个团队中的每个团队的开发人员只在他们的分支机构或其分支机构创建的分支机构上运行。 当一个团队有一些应该共享的东西时,“企业集成主管”将完成从一个团队的工作转移到其他团队的分支的工作。 (如上所述移动提交。)
你的团队需要一些纪律,以避免与其他团队的分支混在一起。 但是,如果你有一个共享存储库,你可以分配钩子以防止从错误的团队推送到另一个团队的分支机构。 [/ EDIT2]
建议的工作流程:
git merge --squash -m 'new feature' branchname
现在,删除分支!
git branch -D branchname
下一个合并将在主分支上显示为不同的提交。
我认为您希望遵循Github用于保持分叉项目更新的类似过程。
首先是whitelabel
repo。 这是其他项目将从中分叉的那个。 然后其他项目将是whitelabel
的克隆, whitelabel
被设置为upstream
回购。 使用此功能,您可以根据工作流程执行git merge upstream/master
或git rebase upstream/master
。
优点是您不必处理主项目的状态。 其他项目成为他们自己的叉子,可以轻松更新。 试图cherry-pick
改变可能会很容易,特别是在许多提交的情况下。 如果其他项目中的一个想要对来自原始仓库的代码进行更改,则可以更轻松地管理该更改。
http://www.techblogistech.com/2012/07/setting-a-default-upstream-branch-in-git/
请参阅此处有关提取更改的部分: https : //help.github.com/articles/fork-a-repo
如果fork应该遵循forkee的脚步,那么最好将fork保留在master存储库的一个分支中。 否则挑选上游的变化,这将变得不必要的困难。
考虑分叉存储库的好处/成本。 保持所有这些只是意味着拖延差异(可能很小?)。
使用gitolite,您可以根据需要控制对分支的访问。
假设您的品牌代码都可以“干净地”驻留在views /目录中,我建议将视图分解为自己的git仓库并将其嵌套在主项目中。 看到这里
然后你可以选择
我更喜欢1.因为我预计部分视图可能需要通过将它们折叠回白色标签来共享,或者将它们从白色标签中挑选到品牌上。
白标项目布局;
- app_whitelabel/ <<-- clone of "app" repo on default branch
+ config/
+ controllers/
+ errors/
+ views/ <<-- nested clone of "views" repo on branch "brand1"
品牌1项目布局;
- app_brand1/ <<-- clone of "app" repo on default branch
+ config/
+ controllers/
+ errors/
+ views/ <<-- nested clone of "views" repo on branch "brand1"
品牌[n]项目布局;
- app_brand2/ <<-- clone of "app" repo on default branch
+ config/
+ controllers/
+ errors/
+ views/ <<-- nested clone of "views" repo on branch "brand[n]"
假设您可以控制两个存储库,解决方案很简单。
维护每个功能的分支。
维护功能发布分支。
功能完成后,将功能分支合并到发布分支并标记它。
如果该功能需要修复错误,请在功能分支中修复它,然后使用新版本重新合并并重新标记它。
您的功能发布分支是您可以共同挑选更新功能或错误修复的地方。 您可以轻松识别标签所具有的功能版本。
您还可以轻松查看功能发布分支上的提交历史记录,以查看是否有任何更新。
除了这些分支,我还维护一个版本发布分支。 公开发布的任何内容都是QAd然后提交到版本发布分支。
每个人的本地工作存储库可以无限制地拥有他们想要或需要的任意数量的提交。
主存储库已明确划分分支,并提供明确分段的提交,这些提交将不断合并到功能发布和版本发布中。
通过功能发布分支或版本发布分支,可以轻松更新任何分支。 他们想要的任何时候,分叉的回购可以抓住合适的东西。
黄色分支是标记的功能发布分支,绿色是版本发布分支。 福克斯可以从任何一个分支中自由地拉出来,并确切地知道他们用樱桃采摘得到了什么。 工作特征分支都基于发布分支,除非它们是相互依赖的。 错误修复与发布分开处理。
就像我说的那样......所有开发人员都有自己的工作回购,可以自由地承诺。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.