如何使用GIT管理项目代码
介绍
Git是目前世界上最流行甚至最好的开源分布式版本控制系统,不论是很小的项目还是很大的项目,它都能有效并且高效的处理项目版本管理,初衷是为了帮助管理linux内核代码而开发的一个开放源码的版本控制软件。
GIT常用分支名称
分支 | 分支名称 | 分支是否永不销毁 |
---|---|---|
feature-【功能名】 | 本地功能需求分支 | 否,功能需求开发完毕上线之后进行删除 |
develop | 测试不稳定版本分支 | 是 |
release | 预发稳定版本分支,始终和生产版本一致 | 是 |
hotfix-【漏洞名】 | 生产问题修复分支 | 否,问题修复完毕进行删除 |
master | 生产稳定版本分支 | 是 |
工作流
Git管理项目,并没有特定的框架或者软件去帮我们完成:开发 - 测试 - 生产,这一过程的项目版本控制,有的只是给每个项目提供Git代码管理方案,施行该方案还是需要依靠项目的管理人员,这里的方案称之为Git工作流。总结下来,目前大概有四种工作流。
1.集中式工作流
这种工作流和之前流行的SVN类型,它只有一个master分支,开发者会先把远程的仓库克隆到本地,之后的修改和提交都在本地操作,直到在某个合适的时间点将本地的代码合入到远程master。这种工作流比较适合小团队,因为小团队可能不会太多的协作和合流的动作。
2.功能开发工作流
这种工作流关注功能开发,为保证它是稳定并且干净的不会直接往master提交代码,而是从master拉取feature分支进行功能开发,团队成员根据分工拉取不同的功能分支来进行不同的功能开发,这样就可以完全隔离开每个人的工作。当功能开发完成后,会向master分支发起Pull Request,只有审核通过(也叫Code Review)的代码才真正允许合入master。
3.Gitflow工作流
这总工作流比较复杂,适合大型项目多人维护情况,下面将会整队这种工作流做详细说明,大概流程就是:从develop分支拉取一个feature分支当做新需求的开发分支,开发完毕合到develop进行测试,测试完毕要发布更高级环境时develop合并到release,最后发布生产release合并到master结束。当生产突然又bug时,从master分支拉一个hotfix分支解决bug,最后将hotfix合并到master,其他分支release、develop等需要实时拉取解决过bug的master分支。
4.Forking工作流
Forking工作流常用于开源项目,它有一个公开的中央仓库,其他贡献者可以克隆这个仓库作为自己的私有仓库,开源项目维护者可以直接往中央仓库push代码,而代码贡献者只能将代码push到自己的私有仓库,只有项目维护者接受代码贡献者往中央仓库发起的Pull Request才会真正合入。
GitFlow工作流深入探讨
上面四种工作流,1和2都比较简单不用多说(目前统一账户就是这两种形式结合使用),4是适合开源项目,所以3是重点讨论对象。特别强调,使用何种方式管理在git上托管的项目,需要根据项目自身的情况、人员情况(人数和个人技术素养)制定最适合项目组的方案,以上的工作流只是一个建议或者说是一个框架。
在目前微服务盛行的情况下,加之项目的业务及功能日趋复杂,出现了一个项目很多个子项目、一个项目有众多的开发人员情况,
这种情况下,出现最多也是最容易出错的问题有:多个需求多人同时开发代码分支问题、多个同时开发的需求分不同时间上线代码分支及合并问题、在日常无需求或者正在开发需求的时候生产出现bug后修复bug的代码分支及合并问题。下面针对这些情况使用GitFlow工作流结合上面“GIT常用分支名称”表给出方案。
模拟日常开发场景
多人开发
这里的同时指的是两个及以上的需求代码都未发布生产环境。
场景:需求1由开发人员A负责开发,需求2由开发人员B负责开发,且都在本周一开始进行开发,周四需求1发布生产,周五需求2发布生产;
开始开发:A本地从master分支拉一个名为feature-需求1分支进行需求1开发,B本地从master分支拉一个名为feature-需求2分支进行需求2开发,因为develop是测试分支,很有可能包含未上线或需要修复bug的代码,所以需要从稳定版本的分支拉取代码进行新需求开发;
发布测试:无论A和B是同时发布测试,还是有先后顺序的发测试,都涉及到一个A与B的本地feature分支代码谁先合到develop分支的问题,因为后合并到develop的feature可能会面临代码冲突的情况,一般这种情况需要后合分支的开发人员找发生冲突的代码负责人员商议冲突解决办法,develop分支每合一次feature都会发布一次测试环境;
发布预发:周二时A需要将需求1的代码发布到预发环境,根据GitFlow工作流,发布更高级环境,需要将develop分支代码合并到release分支,但是此时develop分支拥有需求1和需求2的代码,需求2的代码此时还有bug未解决不能将代码合到release污染到release分支代码,所以合develop到release的方案从一开始就不在项目管理的方案内,A此时直接将自己本地的feature-需求1分支提交合并到release分支,因为feature-需求1分支本身就是从release拉出来的(release=master),可以说是完美契合没有任何冲突,feature分支每合一次release分支都会发布一次预发环境;周三时B需要将需求2代码发布到预发,和A一样的操作即可,而且B合代码时,也不需要考虑代码冲突问题(因为在develop分支测试环境已经解决过他们两之间的冲突了);
发布生产:周四A的需求1发布生产,A的本地feature-需求1分支申请合并master发布生产,周五B的需求2发布生产,B的本地feature-需求2分支申请合并master发布生产; 每次master分支新增代码,必须要做的操作就是向下合并一次代码给release和develop分支(虽然它们不会因此有什么代码改动,但是为了保险),然后正在开发的其他feature分支也需要立刻从master同步代码到自己feature分支以保证本地开发版本的代码与生产一致;如果需要需求1和需求2一同发布生产,那可以在release分支两个需求代码都测试好了,通过将release分支合并到master再发生产,如果有三个需求,有两个需要一同发布生产,可以在feature代码提交到master后先不立即发布,等下一个需要一起发的需求代码feature合过来再发布;
出现bug:周三生产突然出问题,bug需要紧急修复且优先级高于一切需求(这是肯定的),此时开发人员C从master分支拉取一个名为hotfix-bug1的修复分支,进行修复,修复完毕hotfix-bug1合到develop发布测试、合到release发预发、合到master发生产,发布测试的时候如果遇到和测试的代码冲突,一切以hotfix分支的代码为准进行冲突解决,当生产发布解决过问题后,master会多了修复之后的代码,此时其他的所有未发生产的feature本地需求开发分支都需要将master新代码合到自己分支来。
总结
以上多人开发模拟的场景,是理想流程下,要求前提是(总结就是需要项目是微服务或靠近微服务):1.项目是大型多子模块项目;2.项目不同的子模块分不同的人或组负责开发维护;3.当一个需求涉及不同的项目模块的时候需要多模块人明确分工协同开发(如一个app内新活动需求,需要用户系统和活动系统协同,用户系统向活动系统提供用户的基础操作能力,活动系统完成新活动开发);4.一个feature分支只干一件事儿,不能跨模块或需求;
在多人开发一段中,A和B先后向develop合并代码,如果A和B的代码改动涉及到了同一文件,那么git就要求需要合上来的feature分支先拉取develop的代码,然后才能合,但是这样就导致了有一方的feature会包含其他feature的代码。
最终还是需要根据实际项目制定最适合的方案,上述方案是根据自身微服务经验及同行朋友的经验得来,可能会有不足和欠考虑的地方,而且上述方案流程复杂繁琐(可以去掉release分支这一环节),对管理人员和开发人员都有一定的要求(是否能长久坚持,是否有自我管理意识,不取巧,不图省事儿)。
Git子模块
子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
常见使用场景
1.项目A需要用到组件B,但是又不想每次在组件B有新版本后向组件B的开发人员要新包来使用,可以使用git子模块将组件B的git代码引入作为自己项目作为子项目,当组件B有更新时自己随时打包使用;反过来,我的组件B同时被好多项目使用,我不想每次更新后发新包给各个项目负责人,可以使用子模块功能让各个使用项目自行更新组件B的代码去使用。
2.一个大型多模块的项目,除了核心模块不便暴露,其他模块都可以交给外包或者其他部门联合开发,此时使用git子模块功能,将所有模块变更为git子模块,将对应的git子模块交由其他人员开发,彼此互不打扰且不知晓其他人的代码内容。
3.多人合作的大型多模块git项目,需要将每个模块作为可以独立提交的git项目,但是又要保证所有模块又要受到该git项目的统一管理,使用git子模块功能完美解决。
总结
git子模块功能,与上面的git工作流不是同一种概念,git工作流是针对单个的git项目的管理,git子模块则是更高一级的功能,是针对多个git项目的聚合管理。
通过上面的使用场景可延伸一些问题:当前项目提供给别人项目当做子模块,但是害怕别人改了自己项目的内容(主体项目是可以随意更改子模块的内容)。可以通过新建一些对外开放分支解决问题,这样别人只能操作我提供给他的分支,我只需要注意这种提供出去当做子模块的分支的代码不会影响到核心分支代码即可。
git子模块功能日常工作少遇,使用git命令操作虽然简单但是参考文档较少,遇到问题解决难度较大,这里推荐使用sourcetree工具操作。
The end.
相关文章:
如何使用GIT管理项目代码
介绍 Git是目前世界上最流行甚至最好的开源分布式版本控制系统,不论是很小的项目还是很大的项目,它都能有效并且高效的处理项目版本管理,初衷是为了帮助管理linux内核代码而开发的一个开放源码的版本控制软件。 GIT常用分支名称 分支分…...

RHCE 练习三:架设一台 NFS 服务器
一、题目要求 1、开放 /nfs/shared 目录,供所有用户查询资料 2、开放 /nfs/upload 目录,为 192.168.xxx.0/24 网段主机可以上传目录,并将所有用户及所属的组映射为 nfs-upload,其 UID 和 GID 均为 210 3.将 /home/tom 目录仅共享给 192.16…...

【android bluetooth 协议分析 01】【HCI 层介绍 9】【ReadLocalSupportedCommands命令介绍】
1. HCI_Read_Local_Supported_Commands 命令介绍 1. 命令介绍(Description) HCI_Read_Local_Supported_Commands 是 HCI 层中非常重要的查询命令。它允许 Host(如 Android 系统中的 Bluetooth stack)获取 Controller(…...
stm32实战项目:无刷驱动
目录 系统时钟配置 PWM模块初始化 ADC模块配置 霍尔接口配置 速度环定时器 换相逻辑实现 主控制循环 系统时钟配置 启用72MHz主频:RCC_Configuration()设置PLL外设时钟使能:TIM1/ADC/GPIO时钟 #include "stm32f10x.h"void RCC_Configu…...

python打卡训练营打卡记录day30
一、导入官方库 我们复盘下学习python的逻辑,所谓学习python就是学习python常见的基础语法学习你所处理任务需要用到的第三方库。 1.1标准导入:导入整个库 这是最基本也是最常见的导入方式,直接使用import语句。 # 方式1:导入整…...

2025年- H33-Lc141 --148. 排序链表(快慢指针,快指针先出发一步)--Java版
1.题目描述 2.思路 时间空间复杂度分别为 O(nlogn) 和 O(1),根据时间复杂度想到二分法,从而联想到归并排序;对数组做归并排序的空间复杂度为 O(n),分别由新开辟数组 O(n) 和递归函数调用 O(logn) 组成,而根据链表特性…...

【prometheus+Grafana篇】基于Prometheus+Grafana实现Oracle数据库的监控与可视化
💫《博主主页》: 🔎 CSDN主页 🔎 IF Club社区主页 🔥《擅长领域》:擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了…...
板凳-------Mysql cookbook学习 (四)
综合对比与选择建议 维度 PHP Java Python Ruby Perl 学习门槛 低(适合新手) 高(语法复杂) 低(语法简洁) 中(需理解 Rails 理念) 中(特殊语法…...
【D1,2】 贪心算法刷题
文章目录 不同路径 II整数拆分 不同路径 II 初始化的时候不能整列初始化为1,因为如果有障碍物,后面的都不能到达 也不能整列初始化为0,因为状态转移的时候第一行第一列都没有检查,因此不能部分初始化 整数拆分 需要考虑几种情况…...

算法题(150):拼数
审题: 本题需要我们将数组中的数据经过排序,使得他们拼接后得到的数是所有拼接方案中最大的 思路: 方法一:排序贪心 贪心策略1:直接排序 如果我们直接按照数组数据的字典序进行排序,会导致部分情况出错 eg&…...
Denoising Score Matching with Langevin Dynamics
在自然图像等复杂数据集中,真实数据往往集中分布在一个低维流形上,概率密度函数的梯度(即得分函数)难以定义与估计。为缓解该问题,SMLD 提出使用不同强度的高斯噪声对数据进行扰动,扰动后的数据不再集中于低…...

Docker构建 Dify 应用定时任务助手
概述 Dify 定时任务管理工具是一个基于 GitHub Actions 的自动化解决方案,用于实现 Dify Workflow 的定时执行和状态监控。无需再为缺乏定时任务支持而感到困扰,本工具可以帮助设置自动执行任务并获取实时通知,优化你的工作效率。 注意&…...

mongodb管理工具的使用
环境: 远程服务器的操作系统:centOS stream 9; mongoDB version:8.0; 本地电脑 navicat premium 17.2 ; 宝塔上安装了mongoDB 目的:通过本地的navicat链接mongoDB,如何打通链接,分2步: 第一步:宝塔-&…...

第2篇 水滴穿透:IGBT模块的绝对防御体系
引言:从《三体》水滴到功率模块的哲学思考 科幻映照现实:三体探测器"水滴"的绝对光滑表面 → IGBT模块的可靠性设计哲学行业现状痛点:2023年OEM质量报告显示,电控系统23%的故障源自功率模块技术演进悖论:开关频率提升与可靠性保障的永恒博弈 一、基础理论:IGBT…...
LVGL(lv_dropdown下拉列表控件)
文章目录 🔧 一、基本概念🚀 二、创建一个 Dropdown🧰 三、常用函数1. 设置选项2. 获取选项3. 设置当前选中项4. 获取当前选中项索引5. 获取当前选中项文本🎨 四、样式与模式设置方向(最多显示多少项)设置显示模式设置提示文本📞 五、事件回调🧪 六、使用示例📌…...
2.微服务-配置
引入springcloud的pom配置 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version><relativePath/></parent> <dependencyManagemen…...
python实现pdf转图片(针对每一页)
from pdf2image import convert_from_path import ospdf_file rC:\Users\\Desktop\拆分\产权证.pdf poppler_path rC:\poppler-24.08.0\Library\bin # 这里改成你自己的路径output_dir rC:\Users\\Desktop\拆分\output_images os.makedirs(output_dir, exist_okTrue)image…...
C语言练手磨时间
167. 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <…...
数字图像处理——图像压缩
背景 图像压缩是一种减少图像文件大小的技术,旨在在保持视觉质量的同时降低存储和传输成本。随着数字图像的广泛应用,图像压缩在多个领域如互联网、移动通信、医学影像和卫星图像处理中变得至关重要。 技术总览 当下图像压缩JPEG几乎一统天下ÿ…...

验证器回调中value值没有数据
复杂的响应式,导致回调中value值没有数据,最终还是通过手动判断获取值处理 原理没有搞清楚,为什么回调中value没有值背景:动态增加了form表单的字段,通过for循环处理的。对每个新增的字段还要添加字段验证其。就出现了…...

Python | 需求预测模型
目录 需求预测 1.方法选择 2.颗粒度选择 3.在医药行业的应用 预测模型 1.模型对比 2.Prophet 3.Holt-Winters 需求预测 1.方法选择 方法 适用范围分类移动平均法中小企业、SKU较少的卖家低成本预测方案Excel趋势线预测中小企业、SKU较少的卖家低成本预测方案季节性系数法中小企…...

双指针算法:原理与应用详解
文章目录 一、什么是双指针算法二、双指针算法的适用场景三、双指针的三种常见形式1. 同向移动指针2. 相向移动指针3. 分离指针 四、总结 一、什么是双指针算法 双指针算法(Two Pointers Technique)是一种在数组或链表等线性数据结构中常用的高效算法技…...

打造灵感投掷器:我的「IdeaDice」开发记录
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起源:我只是想“摇”出点灵感 有时候面对写作或者做产品设计,我会卡在「不知道从哪开始…...

2025ICPC邀请赛南昌游记
滚榜时候队伍照片放的人家的闹麻了,手机举了半天 。 最后银牌700小几十罚时,rank60多点。 参赛体验还行,队长是福建人,说感觉这个热度是主场作战哈哈哈哈。空调制冷确实不太行吧。 9s过A是啥,没见过,虽然…...

python重庆旅游系统-旅游攻略
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...

MySQL企业版免费开启,强先体验
近期Oracle突然宣布,MySQL企业版面向开发者免费开放下载,这一消息瞬间引爆DBA圈。作为数据库领域的“顶配车型”,企业版长期因高昂授权费让中小团队望而却步,如今免费开放无异于“劳斯莱斯开进菜市场”。 本文将深度拆解企业版的…...
从纸质契约到智能契约:AI如何改写信任规则与商业效率?——从智能合约到监管科技,一场颠覆传统商业逻辑的技术革命
一、传统合同的“低效困境”:耗时、昂贵、风险失控 近年来,全球商业环境加速向数字化转型,但合同管理却成为企业效率的“阿喀琉斯之踵”。据国际商会(International Chamber of Commerce)数据显示,全球企业…...
常见的 HTTP 接口(请求方法)
一:GET 作用:从服务器获取资源(查询数据)。特点: 请求参数通过 URL 传递(如https://api.example.com/users?id123),参数会显示在地址栏中。不修改服务器数据,属于幂等操…...
iOS 抓包实战:从 Charles 到Sniffmaster 的日常工具对比与使用经验
iOS 抓包实战:从 Charles 到抓包大师 Sniffmaster 的日常工具对比与使用经验 抓包这件事,不是高级黑客才要做的。作为一名移动端开发,我几乎每天都要和网络请求打交道,尤其是 HTTPS 请求——加密、重定向、校验证书,各…...
Lodash isEqual 方法源码实现分析
Lodash isEqual 方法源码实现分析 Lodash 的 isEqual 方法用于执行两个值的深度比较,以确定它们是否相等。这个方法能够处理各种 JavaScript 数据类型,包括基本类型、对象、数组、正则表达式、日期对象等,并且能够正确处理循环引用。 1. is…...