【DevOps】Git 图文详解(六):Git 利器 - 分支
Git 利器 - 分支
- 1.分支 Branch
- 2.分支指令 🔥
- 3.分支的切换 checkout
- 4.合并 merge & 冲突
- 4.1 🔸 快速合并(Fast forward)
- 4.2 🔸 普通合并
- 4.3 处理冲突 <<<<<<< HEAD
- 5.变基 rebase
分支是从主线分离出去的 “副本”,分支就像是平行宇宙,可独立发展,独立编辑、提交,也可以和其他分支合并。分支是 Git 的核心必杀利器之一,分支创建、切换、删除都非常快,它非常的轻量。所以,早建分支!多用分支!

1.分支 Branch
比如有一个项目团队,准备 10 月份发布新版本,要新开发一堆黑科技功能,占领市场。你和小伙伴 “小美” 一起负责开发一个新功能 A,开发周期 2 周,在这两周你们的代码不能影响其他人,不影响主分支。这个时候就可以为这个新功能创建一个分支,你们两在这个分支上干活,2 周后代码开发完了、测试通过,就可以合并进要发版的开发分支了。安全、高效,不影响其他人工作,完美!

在实际项目中,一般会建几个主线分支。
- 🔸 master:作为主分支,存放稳定的代码,就是开发后测试通过的代码,不允许随便修改和合并。
- 🔸 开发分支:用于团队日常开发用,比如团队计划 10 月份开发 10 个功能并发版,则在此分支上进行,不影响主分支的稳定。
- 🔸 功能 A 分支:开发人员根据自己的需要,可以创建一些临时分支用于特定功能的开发,开发完毕后再合并到开发分支,并删除该分支。
分支就是指向某一个提交记录的 “指针” 引用,因此创建分支是非常快的,不管仓库多大。当我们运行 git branch dev 创建了一个名字为 dev 的分支,Git 实际上是在 .git\refs\heads 下创建一个 dev 的引用文件(没有扩展名)。
$ git branch dev
$ cat .git/refs/heads/dev
ca88989e7c286fb4ba56785c2cd8727ea1a07b97
2.分支指令 🔥
| | |
|---|---|
git branch | 列出所有本地分支,加参数 -v 显示详细列表,下同 |
git branch -r | 列出所有远程分支 |
git branch -a | 列出所有本地分支和远程分支,用不同颜色区分 |
git branch [branch-name] | 新建一个分支,但依然停留在当前分支 |
git branch -d dev | 删除 dev 分支,-D(大写)强制删除 |
git checkout -b dev | 从当前分支创建并切换到 dev 分支 |
git checkout -b feature1 dev | 从本地 dev 分支代码创建一个 feature1 分支,并切换到新分支 |
git branch [branch] [commit] | 新建一个分支,指向指定 commit id |
git branch --track [branch] [remote-branch] | 新建一个分支,与指定的远程分支建立关联 |
git checkout -b hotfix remote hotfix | 从远端 remote 的 hotfix 分支创建本地 hotfix 分支 |
git branch --set-upstream [branch] [remote-branch] | 在现有分支与指定的远程分支之间建立跟踪关联:git branch --set-upstream hotfix remote/hotfix |
git checkout [branch-name] | 切换到指定分支,并更新工作区 |
git checkout . | 撤销工作区的(未暂存)修改,把暂存区恢复到工作区 |
git checkout HEAD . | 撤销工作区、暂存区的修改,用 HEAD 指向的当前分支最新版本替换 |
git merge [branch] | 合并指定分支到当前分支 |
git merge --no-ff dev | 合并 dev 分支到当前分支,参数 --no-ff 禁用快速合并模式 |
git push origin --delete [branch-name] | 删除远程分支 |
git rebase master | 将当前分支变基合并到 master 分支 |
✅switch:新的分支切换指令 | 切换功能和 checkout 一样,switch 只单纯的用于切换 |
git switch master | 切换到已有的 master 分支 |
git switch -c dev | 创建并切换到新的 dev 分支 |
📢 关于
checkout指令:checkout是 Git 的底层指令,比较常用,也比较危险,它会重写工作区。支持的功能比较多,能撤销修改,能切换分支,这也导致了这个指令比较复杂。在 Git 2.23 版本以后,增加了git switch、git reset指令。
git switch:专门用来实现分支切换。git reset:专门用来实现本地修改的撤销,更多可参考后续 “reset” 内容。
$ git branchdev
* main
# 列出了当前的所有分支,星号“*”开头的“main”为当前活动分支。
3.分支的切换 checkout
代码仓库可以有多个分支,master 为默认的主分支,但只有一个分支在工作状态。所以要操作不同分支,需要切换到该分支,HEAD 就是指向当前正在活动的分支。

# 切换到dev分支,HEAD指向了dev
# 此处 switch 作用同 checkout,switch只用于切换,不像checkout功能很多
$ git switch dev
Switched to branch 'dev'
$ cat .git/HEAD
ref: refs/heads/dev
使用 git checkout dev 切换分支时,干了两件事:
- ①
HEAD指向dev:修改HEAD的 “指针” 引用,指向dev分支。 - ② 还原工作空间:把
dev分支内容还原到工作空间。
此时的活动分支就是 dev 了,后续的提交就会更新到 dev 分支了。
❓ 切换时还没提交的代码怎么办?
- 如果修改(包括未暂存、已暂存)和待切换的分支没有冲突,则切换成功,且未提交修改会一起带过去,所以要注意!
- 如果有冲突,则会报错,提示先提交或隐藏,关于隐藏可查看后续章节内容 “stash”。
4.合并 merge & 冲突
把两个分支的修改内容合并到一起,常用的合并指令 git merge [branch],将分支 [branch] 合并到当前分支。根据要合并的内容的不同,具体合并过程就会有多种情况。

4.1 🔸 快速合并(Fast forward)
如下图,master 分支没有任何提交,git merge dev 合并分支 dev 到 master,此时合并速度就非常快,直接移动 master 的 “指针” 引用到 dev 即可。这就是快速合并(Fast forward),不会产生新的提交。

合并 dev 到 master,注意要先切换到 master 分支,然后执行 git merge dev,把 dev 合并到当前分支。
📢 强制不用快速合并:
git merge --no-ff -m “merge with no-ff” dev,参数--no-ff不启用快速合并,会产生一个新的合并提交记录。
4.2 🔸 普通合并
如果 master 有变更,存在分支交叉,则会把两边的变更合并成一个提交。
- 如果两边变更的文件不同,没有什么冲突,就自动合并了。
- 如果有修改同一个文件,则会存在冲突,到底该采用哪边的,程序无法判断,就换产生冲突。冲突内容需要人工修改后再重新提交,才能完成最终的合并。

上图中,创建 dev 分支后,两个分支都有修改提交,因此两个分支就不在一条顺序线上了,此时合并 dev 到 master 就得把他们的修改进行合并操作了。
v5、v7共同祖先是v4,从这里开始分叉。- Git 会用两个分支的末端
v6和v8以及它们的共同祖先v4进行三方合并计算。合并之后会生成一个新(和并)提交v9。 - 合并提交
v9就有两个祖先v6、v8。
4.3 处理冲突 <<<<<<< HEAD
在有冲突的文件中,<<<<<<< HEAD 开头的内容就表示是有冲突的部分,需要人工处理,可以借助一些第三方的对比工具。人工处理完毕后,完成合并提交,才最终完成此次合并。======= 分割线上方是当前分支的内容,下方是被合并分支的变更内容。

5.变基 rebase
把两个分支的修改内容合并到一起的办法有两种:merge 和 rebase,作用都是一样的,区别是 rebase 的提交历史更简洁,干掉了分叉,merge 的提交历史更完整。

- 在
dev上执行git rebase master变基,将dev分支上分叉的v7、v8生成补丁,然后在master分支上应用补丁,产生新的v7’、v8’新的提交。 - 然后回到
master分支,完成合并git merge dev,此时的合并就是快速合并了。 - 最终的提交记录就没有分叉了。
$ git rebase master
$ git checkout master
$ git merge dev
相关文章:
【DevOps】Git 图文详解(六):Git 利器 - 分支
Git 利器 - 分支 1.分支 Branch2.分支指令 🔥3.分支的切换 checkout4.合并 merge & 冲突4.1 🔸 快速合并(Fast forward)4.2 🔸 普通合并4.3 处理冲突 <<<<<<< HEAD 5.变基 rebase 分支是从主…...
万界星空科技QMS质量管理系统介绍
QMS(Quality Management System)质量管理系统是五大基础系统之一,在工业企业中被广泛的应用,在质量策划、生产过程质量监督、体系审核和文档管理等业务上发挥着不可替代的作用。 一般制造业工厂现状:质量成本高&#x…...
C练习题_14
一、单项选择题(本大题共 20小题,每小题 2分,共 40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 以下叙述不正确的是() A.一个C源程序可…...
解决方案 | 政策与技术加持,法大大电子劳动合同让人事管理更省心
政策加持, 助力劳动合同电子化推广 近年来,国家人社部多次发文,明确电子劳动合同法律效力,鼓励推广电子劳动合同全面应用,积极引导、支持企业和劳动者依法规范订立电子劳动合同,优化人力资源社会保障公共服…...
Linux基础命令5
su——切换用户命令 例如,切换到stu用户底下 而切换到管理员的命令就是下图 切换完的区别就是 stu——root $——# 退出——exit 关机与重启命令 如果在右上角直接点x号,就相当于把电源拔断了,这样做的次数多了,有可能系统就…...
springboot(ssm中医学习服务管理系统 医学生在线学习平台Java(codeLW)
springboot(ssm中医学习服务管理系统 医学生在线学习平台Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或…...
springboot宠物领养系统-计算机毕设 附源码 44261
springboot宠物领养系统 摘 要 网络发布信息有其突出的优点,即信息量大,资源丰富,更新速度快等,很符合人们希望以捷、便利的方式获得最多最有效信息的要求。本系统就是一个网上宠物领养系统,为宠物爱好者提供一个信息…...
性能测试必备知识-使用MySQL存储过程构造大量数据:实例解析
在软件开发过程中,测试是一个不可或缺的环节。通过测试,我们可以发现并修复软件中的各种问题,提高软件的质量和稳定性。然而,手动编写大量的测试用例是一项耗时且容易出错的任务。为了解决这个问题,我们需要学会使用批…...
最新绿豆APP源码苹果CMS影视插件版本/原生JAVA源码+反编译开源+免授权
源码简介: 最新绿豆APP源码苹果CMS影视插件版本,它是原生JAVA源码反编译开源免授权,绿豆影视对接苹果CMS,它可以支持多功能自定义DIY页面布局。 1、新版绿豆视频APP视频6.1插件版反编译指南及教程 2、后端插件开源,可…...
SPSS多元对应分析
前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…...
Rust语言特性探秘:宏的魔力
大家好!我是lincyang。 今天我们继续深入探讨Rust语言中的一个有趣而强大的特性——宏(Macros)。 宏在Rust中扮演着特殊的角色,不仅提高了代码的灵活性,还增强了代码的可重用性。接下来,我们会通过具体的…...
2023最全的Web自动化测试介绍
做测试的同学们都了解,做Web自动化,我们主要用Selenium或者是QTP。 有的人可能就会说,我没这个Java基础,没有Selenium基础,能行吗?测试虽然属于计算机行业,但其实并不需要太深入的编程知识&…...
Unity 控制物体透明度变化
1.需求 给物体绑定一个脚本,这个脚本实现物体的透明度渐变变化,并且可以重置回原来的颜色。物体为Unity自带的材质Shader为Standard。 2.代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Transpare…...
django及DRF流程源码分析
Django执行流程: 1.nginx作为接入层,通过反向代理,监听80端口获取请求连接 2.将请求交给wsgi server 3.wsgi server调用django的wsgi.py 处理请求 4.WSGIHandler的__call__函数就是整个逻辑处理流程 5.WSGIHandler __init__中的加载中间件,对request对象…...
Ajax入门-Express框架介绍和基本使用
电脑实在忒垃圾了,出现问题耗费了至少一刻钟time,然后才搞出来正常的效果; 效果镇楼 另外重新安装了VScode软件,原来的老是报错,bug。。; 2个必要的安装命令; 然后建立必要的文件夹和文件&…...
Linux加强篇001-部署Linux系统
目录 一、前言 1.1准备工具 1.2安装配置VM虚拟机 1.3安装软件 1.4系统初始化进程 1.5重置root密码 二、巩固练习 1.为什么建议读者在下载系统文件后先进行校验而不是直接安装呢? 2.使用虚拟机安装Linux系统时,为什么要先…...
LeetCode算法题解(动态规划)|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树
一、LeetCode343. 整数拆分 题目链接:343. 整数拆分 题目描述: 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入…...
好多年没更新了
好多年没更新了,哈哈,各位好。 感恩一切,感恩有你们。...
DOM文档对象模型
前言 DOM(Document Object Model) 文档对象模型,是W3C制定的标准接口规范,是一种处理HTML和XML文件的标准API。简单来说DOM就是操作网页的api和接口。 一、Node类型属性 1.判断节点类型 nodeType 整数返回值 9 1 3 2 <div id"one">我…...
【Django-DRF】多年md笔记第5篇:Django-DRF的Request、Response和视图详解
本文从分析现在流行的前后端分离Web应用模式说起,然后介绍如何设计REST API,通过使用Django来实现一个REST API为例,明确后端开发REST API要做的最核心工作,然后介绍Django REST framework能帮助我们简化开发REST API的工作。 Dj…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
