git教程-分支是什么? 作者:马育民 • 2021-10-09 15:15 • 阅读:10212 # 提出问题 如下图: [](https://www.malaoshi.top/upload/0/0/1GW3olZ8q94Y.png) 1. 李雷的代码写一部分,提交到git 2. 韩梅梅此时更新代码,把李雷写一半的代码下载到本地,启动报错 ### 分析 如果都提交到一处,必然会产生这样的问题 ### 解决 如下图: 1. 李雷创建 `dev1` 分支,开发一半的代码,都提交到这里。而不是提交到 `master` 2. 韩梅梅从 `master` 分支更新代码,不会再下载写一半的代码 3. 李雷全部开发完后,再将 `dev1` 分支的代码合并到 `master` 分支 4. 韩梅梅从 `master` 分支更新代码,下载的是李雷写好的代码,下载后运行不会报错 [](https://www.malaoshi.top/upload/0/0/1GW3oligb5jC.png) # 作用 简单理解:**分支就是给代码开“多条平行跑道”,互不干扰,最后还可以把跑道代码合并到一起**。 ### 1. 隔离开发,互不破坏主代码 主分支(main)保存稳定、能上线的代码。 > 你开发新功能、改bug,**不在主分支直接改**,新建分支干活。 - 功能写崩、改错,只会影响自己这个分支,**不会搞坏线上可用代码**。 - 主分支始终保持干净、可随时发布。 ### 2. 同时做多件事(并行开发) 举例子: 1. 在`feature/订单`分支做新订单功能 2. 线上出BUG,切到`hotfix`紧急修复线上问题 3. 修复完再切回订单分支继续写之前没做完的代码 > 不用把没做完的代码强行提交、也不用备份复制多份文件夹,各个分支保存各自进度。 ### 3. 多人协作,分工开发 - A开发登录模块 → `feature/login` - B开发购物车 → `feature/cart` 两个人各自在自己分支写代码,**不会互相覆盖文件**。写完后把两个分支合并到主分支,就把两个人的代码汇总。 ### 4. 代码评审、测试,隔离待上线代码 开发完功能分支,不直接改主分支: 1. 提 MR/PR(合并请求) 2. 其他人看你的代码做评审 3. 测试人员在这个分支测试BUG 4. 确认没问题,才合并入主分支上线 > 没通过评审、测试有问题,直接放弃这个分支,主分支不受任何影响。 ### 5. 版本、环境区分 - `main`:线上生产版本 - `release`:预发布/测试环境版本 - `develop`:开发集成版本 不同分支对应不同环境,不会把未测试代码直接丢到生产。 ### 6. 安全做实验、尝试改动 想做一个大改动、尝试重构代码,拿不准要不要保留: 新建分支做实验。 - 效果好:合并回主分支 - 效果差:直接删掉分支,主代码毫发无损。 ### 7. 保留完整历史,方便回滚 每一个分支的提交记录都会保存。 就算合并之后,依然能看到:哪部分代码来自哪个分支。 一旦出问题,可以定位分支来源,甚至可以把整个分支的改动撤销。 --- # 通俗比喻 把项目比作写一本书: - **main主分支**:正式出版定稿版本。 - **分支**:单独拿出来的草稿副本。 你拿草稿副本写新章节、修改内容;定稿版本纹丝不动。 草稿写满意了,把草稿内容誊抄(合并)到正式书稿;草稿写烂了,直接扔掉草稿。 --- # git分支的优点 其他版本控制系统如 SVN等都有分支管理,这些版本控制系统 **创建和切换分支比蜗牛还慢**,结果分支功能成了摆设,几乎都不去用。 但Git的分支,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。 ### git分支 vs svn分支 SVN的分支是**完整目录拷贝**;Git分支只是**一个提交指针**,底层实现完全不一样,带来巨大差异。 |对比项|Git分支|SVN分支| |---|---|---| |底层原理|轻量指针,仅记录提交引用,**不复制文件**|完整复制整个项目目录,物理拷贝全部文件| |创建速度|瞬间完成,毫秒级|项目越大越慢,复制全部文件| |磁盘占用|几乎不占额外空间|创建分支会占用大量磁盘空间,多分支仓库体积暴涨| |本地操作|**本地完整分支,断网可创建、切换、提交**|分支存在服务端,本地没有完整分支,操作依赖网络| |切换分支速度|很快,只修改工作区文件|慢,大量文件拷贝替换,大项目切换耗时久| |合并能力|merge/rebase,合并算法强大,冲突处理友好|合并逻辑弱,跨分支合并容易产生幽灵冲突| |分支使用习惯|鼓励多分支,功能、bug、实验随便建,用完就删|创建分支成本高,大家尽量少建分支| |分布式|本地就拥有全部分支完整历史|分支全部存远端服务器,本地只是检出一份| ### 优点 1. **极轻量,低成本随意建分支** Git分支只是指向commit的指针,创建分支几乎零开销。可以随便建功能分支、bug修复分支、实验分支,用完直接删除。 SVN分支是物理复制整个仓库,项目大时创建分支慢、占用大量硬盘,团队会尽量少开分支。 2. **本地完整分支,不需要联网** Git所有分支都可以在本地完成创建、切换、提交、合并,断网也能干活,后续再push推送远程。 SVN分支在服务器上,新建分支、切换分支都要和服务器交互,受网络影响大。 3. **切换分支高效** Git切换分支只变更工作目录里发生变更的文件。 SVN切换分支相当于大量文件的下载/替换,大仓库切换非常慢。 4. **强大的合并能力** Git对分支合并、变基(rebase)支持完善,追踪分支提交历史,能更好识别哪些改动需要合并。 SVN合并依赖手动记录合并版本号,跨版本合并极易出错,冲突处理麻烦。 5. **适合多任务并行开发** 可以同时手上开好几个分支:一个开发新功能、一个修复线上bug、一个做技术调研,随时来回切换,互不干扰。 SVN因为成本高,不适合频繁大量创建分支。 6. **历史完整,不怕分支丢失** Git本地拥有完整提交历史,就算远程仓库挂掉,本地所有分支和提交记录都还在。 SVN所有分支数据保存在服务器,服务器损坏分支历史就丢失。 # 总结 分支的本质作用:代码隔离。让多套代码版本并行存在,独立开发、测试,可控地合并,保护稳定代码。 原文出处:/show_1IX20hLSPZYM.html