git教程-分支是什么?

提出问题

如下图:

  1. 李雷的代码写一部分,提交到git
  2. 韩梅梅此时更新代码,把李雷写一半的代码下载到本地,启动报错

分析

如果都提交到一处,必然会产生这样的问题

解决

如下图:

  1. 李雷创建 dev1 分支,开发一半的代码,都提交到这里。而不是提交到 master
  2. 韩梅梅从 master 分支更新代码,不会再下载写一半的代码
  3. 李雷全部开发完后,再将 dev1 分支的代码合并到 master 分支
  4. 韩梅梅从 master 分支更新代码,下载的是李雷写好的代码,下载后运行不会报错

作用

简单理解:分支就是给代码开“多条平行跑道”,互不干扰,最后还可以把跑道代码合并到一起。

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