git管理的项目 发布时有收费版/免费版/客户定制版,如何管理分支,通过merge(合并) 还是 cherry-pick(挑拣) 引入更新的代码?

发布版本有收费版/免费版/客户定制版,虽然说在代码中增加条件判断,使用环境变量切换逻辑,能适配多个版本,但实际操作中常常无法这样理想化,有些差异就是写死在代码上。

所以摸索了以下分支管理模式:

main:主分支,维护收费版代码,作为核心代码库
dev:开发分支,所有功能在此开发、测试后合并到 main
free:免费版分支,基于 main 创建,调整/删除或屏蔽某些模块
custom-{客户名}:客户定制分支,基于 main 创建,额外添加或调整某些模块

每做完一个新的迭代,通过merge(合并) 或 cherry-pick(挑拣) 合到发行版中。

merge(合并)cherry-pick(挑拣提交)
适用场景- 更新的那部分代码完全兼容各个版本- 单独为某一版本做的特定功能、特定配置
引入内容整个分支的全部改动仅特定提交的改动
提交历史保留原始历史和合并节点仅复制选定的提交,不保留合并关系
冲突处理多个提交一起处理冲突,可能复杂只处理挑拣的提交,冲突范围小
溯源清晰保留合并路径,方便审计无法追溯原始分支来源

>>更新的那部分代码完全兼容:例如免费版和收费版差异不大,merge 可以一键同步所有功能。

>>代码有明显差异:例如收费版新增10 个新特性,免费版只要其中的 3 个-->这时用cherry-pick

流程 

1、创建main分支 (可以初始化 README.md、.gitignore、初始代码、目录结构等)
2、在main分支完成一次基础提交
3、从main创建 dev 分支
4、从dev创建feature分支(可能创建多个feature分支)
5、在feature分支上进行开发
6、切换到dev分支,把feature分支合到dev分支。
7、切换到main分支,把dev分支合并到main分支。
8、从main分支创建release分支。
9、在realese分支上修改特定配置。
10、把release分支发布。
11、重复步骤4-7
12、切换到release分支,把main分支合并到release分支。(此前在release分支修改的特定配置不会被覆盖)
13、把release分支发布。

# 合并收费版
git checkout main
git merge dev# 挑拣免费版需要的功能
git checkout free
git cherry-pick <commit-id>

具体实施:

# 初始化项目
git init
echo "# 项目名称" > README.md
git add .
git commit -m "init: 初始化项目"# 创建 main 和 dev
git branch -M main
git checkout -b dev# 创建 free(免费版分支,长期维护)
git checkout -b free# 推送到远程仓库
git remote add origin <你的仓库地址>
git push -u origin main
git push -u origin dev
git push -u origin free##### 功能开发 ##########################3git checkout dev
git checkout -b feature/login
# 开发、提交代码
git add .
git commit -m "feat: 实现用户登录"git checkout dev
git merge --no-ff feature/login -m "merge: 合并登录功能"
git push origin dev
git branch -d feature/login#### 收费版发布 #######################33git checkout main
git merge --no-ff dev -m "release: 发布收费版 v1.0.0"# 创建 release 分支
git checkout -b release/v1.0.0
# 根据实际需要调整收费版配置
vim config/settings_pro.py# 提交发布
git add .
git commit -m "chore: 调整 v1.0.0 收费版配置"
git push origin release/v1.0.0# 打标签发布
git tag v1.0.0
git push origin v1.0.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27297.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot项目启动报错:PathVariable annotation was empty on param 0.

报错信息 SpringBoot项目启动报错&#xff1a;Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name com.obstetric.archive.feignclient.DictServiceClient: FactoryBean threw exception on object creation; nested excepti…

Java 设计模式:软件开发的精髓与艺

目录 一、设计模式的起源二、设计模式的分类1. 创建型模式2. 结构型模式3. 行为型模式三、设计模式的实践1. 单例模式2. 工厂模式3. 策略模式四、设计模式的优势五、设计模式的局限性六、总结在软件开发的浩瀚星空中,设计模式犹如一颗颗璀璨的星辰,照亮了开发者前行的道路。它…

Unity小功能实现:鼠标点击移动物体

1、功能描述 当玩家点击鼠标时&#xff0c;场景中的物体会移动到鼠标点击的位置。这个功能可以用于控制角色移动、放置物体等场景。 2、实现步骤 创建Unity项目&#xff1a;首先&#xff0c;打开Unity并创建一个新的3D项目。 添加3D物体&#xff1a;在场景中创建一个3D物体&am…

避坑!用Docker搞定PHP开发环境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)

本次更新主要是对环境版本进行了更新&#xff0c;例如php 7.3.7升级到了7.3.8&#xff0c;另外之前的版本有同学踩了坑&#xff0c;主要是官方docker镜像php:7.3.7-fpm和php:7.3.8-fpm使用了不同版本的debian&#xff0c;后面会提到&#xff0c;请各位同学留意。 因为最近换电脑…

Spring Boot集成Jetty、Tomcat或Undertow及支持HTTP/2协议

目录 一、常用Web服务器 1、Tomcat 2、Jetty 3、Undertow 二、什么是HTTP/2协议 1、定义 2、特性 3、优点 4、与HTTP/1.1的区别 三、集成Web服务器并开启HTTP/2协议 1、生成证书 2、新建springboot项目 3、集成Web服务器 3.1 集成Tomcat 3.2 集成Jetty 3.3 集成…

京东web 详情 cfe滑块分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 data response.json() pri…

电池管理系统(BMS)架构详细解析:原理与器件选型指南

BMS&#xff08;电池管理系统&#xff09;架构详细讲解 从你提供的BMS&#xff08;Battery Management System&#xff09;架构图来看&#xff0c;主要涉及到电池监控模块、通信模块、功率控制模块等部分。下面我将详细讲解该架构的各个功能模块及其工作原理。 1. 电池管理核…

Linux常见基本指令(二)

目录 1、Linux基础指令 文本查看 cat指令 more指令 less指令 head指令&tail指令 时间相关指令 查找、搜索相关指令 find指令 which指令 whereis指令 alias指令 grep指令 打包压缩和解压缩 zip指令&#xff08;压缩&#xff09; unzip&#xff08;解压&…

HarmonyOS学习第12天:解锁表格布局的奥秘

表格布局初相识 不知不觉&#xff0c;我们在 HarmonyOS 的学习旅程中已经走到了第 12 天。在之前的学习里&#xff0c;我们逐步掌握了 HarmonyOS 开发的各种基础与核心技能&#xff0c;比如组件的基本使用、布局的初步搭建等&#xff0c;这些知识就像一块块基石&#xff0c;为我…

动态规划刷题

文章目录 动态规划三步问题题目解析代码 动态规划 1. 状态表示&#xff1a;dp[i]&#xff0c;表示dp表中i下标位置的值 2. 状态转移方程&#xff1a;以i位置位置的状态&#xff0c;最近的一步来划分问题&#xff0c;比如可以将状态拆分成前状态来表示现状态&#xff0c;dp[i] …

大语言模型微调的基本概念介绍

大型语言模型&#xff08;LLMs&#xff09;正在以惊人的速度发展&#xff0c;LLM微调的潜力更是如此。大型语言模型的生命周期有几个关键步骤&#xff0c;今天我们将要介绍这个周期中最丰富、最耗时的一部分——LLM微调过程。 大语言模型的生命周期 在深入了解大型语言模型&a…

PyCharm接入本地部署DeepSeek 实现AI编程!【支持windows与linux】

今天尝试在pycharm上接入了本地部署的deepseek&#xff0c;实现了AI编程&#xff0c;体验还是很棒的。下面详细叙述整个安装过程。 本次搭建的框架组合是 DeepSeek-r1:1.5b/7b Pycharm专业版或者社区版 Proxy AI&#xff08;CodeGPT&#xff09; 首先了解不同版本的deepsee…

Spring MVC 程序开发(1)

目录 1、什么是 SpringMVC2、返回数据2.1、返回 JSON 对象2.2、请求转发2.3、请求重定向2.4、自定义返回的内容 1、什么是 SpringMVC 1、Tomcat 和 Servlet 分别是什么&#xff1f;有什么关系&#xff1f; Servlet 是 java 官方定义的 web 开发的标准规范&#xff1b;Tomcat 是…

Notepad++下载地址【亲测好用】

网上下载链接五花八门&#xff0c;最终找到了一个官方下载链接。 本文章就用来记录Notepad下载网址 https://github.com/notepad-plus-plus/notepad-plus-plus/tags

LeetCode 873. Length of Longest Fibonacci Subsequence(2025/2/27每日一题)

昨天工作耽搁了&#xff0c;没来得及打卡每日一题&#xff0c;今日补上&#xff1a; 标题&#xff1a;Length of Longest Fibonacci Subsequence 题目&#xff1a; 例子&#xff1a; Example 1: Input: arr [1,2,3,4,5,6,7,8] Output: 5 Explanation: The longest subsequ…

【uniapp】在UniApp中实现持久化存储:安卓--生成写入数据为jsontxt

在移动应用开发中&#xff0c;数据存储是一个至关重要的环节。对于使用UniApp开发的Android应用来说&#xff0c;缓存&#xff08;Cache&#xff09;是一种常见的数据存储方式&#xff0c;它能够提高应用的性能和用户体验。然而&#xff0c;缓存数据在用户清除缓存或清除应用数…

【小羊肖恩】小羊杯 Round 2 C+K

题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/100672#question C.是毛毛虫吗&#xff1f; 思路&#xff1a; 其实很简单&#xff0c;假设我们要满足题目所给条件&#xff0c;那么这个毛毛虫最坏情况下肯定是一条如下图所示的无向图 右端省略号为对称图形 &…

【定昌Linux系统】部署了java程序,设置开启启动

将代码上传到相应的目录&#xff0c;并且配置了一个.sh的启动脚本文件 文件内容&#xff1a; #!/bin/bash# 指定JAR文件的路径&#xff08;如果JAR文件在当前目录&#xff0c;可以直接使用文件名&#xff09; JAR_FILE"/usr/local/java/xs_luruan_client/lib/xs_luruan_…

17、什么是智能指针,C++有哪几种智能指针【高频】

智能指针其实不是指针&#xff0c;而是一个&#xff08;模板&#xff09;类&#xff0c;用来存储指向某块资源的指针&#xff0c;并自动释放这块资源&#xff0c;从而解决内存泄漏问题。主要有以下四种&#xff1a; auto_ptr 它的思想就是当当一个指针对象赋值给另一个指针对…

基于SpringBoot和PostGIS的省域“地理难抵点(最纵深处)”检索及可视化实践

目录 前言 1、研究背景 2、研究意义 一、研究目标 1、“地理难抵点”的概念 二、“难抵点”空间检索实现 1、数据获取与处理 2、计算流程 3、难抵点计算 4、WebGIS可视化 三、成果展示 1、华东地区 2、华南地区 3、华中地区 4、华北地区 5、西北地区 6、西南地…