当前位置: 首页 > news >正文

【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从远端 remotehotfix 分支创建本地 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 switchgit 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 合并分支 devmaster,此时合并速度就非常快,直接移动 master 的 “指针” 引用到 dev 即可。这就是快速合并(Fast forward),不会产生新的提交。

在这里插入图片描述
合并 devmaster,注意要先切换到 master 分支,然后执行 git merge dev,把 dev 合并到当前分支。

📢 强制不用快速合并:git merge --no-ff -m “merge with no-ff” dev,参数 -‌-no-ff 不启用快速合并,会产生一个新的合并提交记录。

4.2 🔸 普通合并

如果 master 有变更,存在分支交叉,则会把两边的变更合并成一个提交。

  • 如果两边变更的文件不同,没有什么冲突,就自动合并了。
  • 如果有修改同一个文件,则会存在冲突,到底该采用哪边的,程序无法判断,就换产生冲突。冲突内容需要人工修改后再重新提交,才能完成最终的合并。

在这里插入图片描述
上图中,创建 dev 分支后,两个分支都有修改提交,因此两个分支就不在一条顺序线上了,此时合并 devmaster 就得把他们的修改进行合并操作了。

  • v5v7 共同祖先是 v4,从这里开始分叉。
  • Git 会用两个分支的末端 v6v8 以及它们的共同祖先 v4 进行三方合并计算。合并之后会生成一个新(和并)提交 v9
  • 合并提交 v9 就有两个祖先 v6v8

4.3 处理冲突 <<<<<<< HEAD

在有冲突的文件中,<<<<<<< HEAD 开头的内容就表示是有冲突的部分,需要人工处理,可以借助一些第三方的对比工具。人工处理完毕后,完成合并提交,才最终完成此次合并。======= 分割线上方是当前分支的内容,下方是被合并分支的变更内容。

在这里插入图片描述

5.变基 rebase

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

在这里插入图片描述

  • dev 上执行 git rebase master 变基,将 dev 分支上分叉的 v7v8 生成补丁,然后在 master 分支上应用补丁,产生新的 v7’v8’ 新的提交。
  • 然后回到 master 分支,完成合并 git merge dev,此时的合并就是快速合并了。
  • 最终的提交记录就没有分叉了。
$ git rebase master
$ git checkout master
$ git merge dev

相关文章:

【DevOps】Git 图文详解(六):Git 利器 - 分支

Git 利器 - 分支 1.分支 Branch2.分支指令 &#x1f525;3.分支的切换 checkout4.合并 merge & 冲突4.1 &#x1f538; 快速合并&#xff08;Fast forward&#xff09;4.2 &#x1f538; 普通合并4.3 处理冲突 <<<<<<< HEAD 5.变基 rebase 分支是从主…...

万界星空科技QMS质量管理系统介绍

QMS&#xff08;Quality Management System&#xff09;质量管理系统是五大基础系统之一&#xff0c;在工业企业中被广泛的应用&#xff0c;在质量策划、生产过程质量监督、体系审核和文档管理等业务上发挥着不可替代的作用。 一般制造业工厂现状&#xff1a;质量成本高&#x…...

C练习题_14

一、单项选择题&#xff08;本大题共 20小题&#xff0c;每小题 2分&#xff0c;共 40分。在每小题给出的四个备选项中&#xff0c;选出一个正确的答案&#xff0c;并将所选项前的字母填写在答题纸的相应位置上。) 以下叙述不正确的是&#xff08;&#xff09; A.一个C源程序可…...

解决方案 | 政策与技术加持,法大大电子劳动合同让人事管理更省心

政策加持&#xff0c; 助力劳动合同电子化推广 近年来&#xff0c;国家人社部多次发文&#xff0c;明确电子劳动合同法律效力&#xff0c;鼓励推广电子劳动合同全面应用&#xff0c;积极引导、支持企业和劳动者依法规范订立电子劳动合同&#xff0c;优化人力资源社会保障公共服…...

Linux基础命令5

su——切换用户命令 例如&#xff0c;切换到stu用户底下 而切换到管理员的命令就是下图 切换完的区别就是 stu——root $——# 退出——exit 关机与重启命令 如果在右上角直接点x号&#xff0c;就相当于把电源拔断了&#xff0c;这样做的次数多了&#xff0c;有可能系统就…...

springboot(ssm中医学习服务管理系统 医学生在线学习平台Java(codeLW)

springboot(ssm中医学习服务管理系统 医学生在线学习平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或…...

springboot宠物领养系统-计算机毕设 附源码 44261

springboot宠物领养系统 摘 要 网络发布信息有其突出的优点&#xff0c;即信息量大&#xff0c;资源丰富&#xff0c;更新速度快等&#xff0c;很符合人们希望以捷、便利的方式获得最多最有效信息的要求。本系统就是一个网上宠物领养系统&#xff0c;为宠物爱好者提供一个信息…...

性能测试必备知识-使用MySQL存储过程构造大量数据:实例解析

在软件开发过程中&#xff0c;测试是一个不可或缺的环节。通过测试&#xff0c;我们可以发现并修复软件中的各种问题&#xff0c;提高软件的质量和稳定性。然而&#xff0c;手动编写大量的测试用例是一项耗时且容易出错的任务。为了解决这个问题&#xff0c;我们需要学会使用批…...

最新绿豆APP源码苹果CMS影视插件版本/原生JAVA源码+反编译开源+免授权

源码简介&#xff1a; 最新绿豆APP源码苹果CMS影视插件版本&#xff0c;它是原生JAVA源码反编译开源免授权&#xff0c;绿豆影视对接苹果CMS&#xff0c;它可以支持多功能自定义DIY页面布局。 1、新版绿豆视频APP视频6.1插件版反编译指南及教程 2、后端插件开源&#xff0c;可…...

SPSS多元对应分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…...

Rust语言特性探秘:宏的魔力

大家好&#xff01;我是lincyang。 今天我们继续深入探讨Rust语言中的一个有趣而强大的特性——宏&#xff08;Macros&#xff09;。 宏在Rust中扮演着特殊的角色&#xff0c;不仅提高了代码的灵活性&#xff0c;还增强了代码的可重用性。接下来&#xff0c;我们会通过具体的…...

2023最全的Web自动化测试介绍

做测试的同学们都了解&#xff0c;做Web自动化&#xff0c;我们主要用Selenium或者是QTP。 有的人可能就会说&#xff0c;我没这个Java基础&#xff0c;没有Selenium基础&#xff0c;能行吗&#xff1f;测试虽然属于计算机行业&#xff0c;但其实并不需要太深入的编程知识&…...

Unity 控制物体透明度变化

1.需求 给物体绑定一个脚本&#xff0c;这个脚本实现物体的透明度渐变变化&#xff0c;并且可以重置回原来的颜色。物体为Unity自带的材质Shader为Standard。 2.代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Transpare…...

django及DRF流程源码分析

Django执行流程: 1.nginx作为接入层,通过反向代理&#xff0c;监听80端口获取请求连接 2.将请求交给wsgi server 3.wsgi server调用django的wsgi.py 处理请求 4.WSGIHandler的__call__函数就是整个逻辑处理流程 5.WSGIHandler __init__中的加载中间件&#xff0c;对request对象…...

Ajax入门-Express框架介绍和基本使用

电脑实在忒垃圾了&#xff0c;出现问题耗费了至少一刻钟time&#xff0c;然后才搞出来正常的效果&#xff1b; 效果镇楼 另外重新安装了VScode软件&#xff0c;原来的老是报错&#xff0c;bug。。&#xff1b; 2个必要的安装命令&#xff1b; 然后建立必要的文件夹和文件&…...

Linux加强篇001-部署Linux系统

目录 一、前言 1.1准备工具 1.2安装配置VM虚拟机 1.3安装软件 1.4系统初始化进程 1.5重置root密码 二、巩固练习 1&#xff0e;为什么建议读者在下载系统文件后先进行校验而不是直接安装呢&#xff1f; 2&#xff0e;使用虚拟机安装Linux系统时&#xff0c;为什么要先…...

LeetCode算法题解(动态规划)|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树

一、LeetCode343. 整数拆分 题目链接&#xff1a;343. 整数拆分 题目描述&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入…...

好多年没更新了

好多年没更新了&#xff0c;哈哈&#xff0c;各位好。 感恩一切&#xff0c;感恩有你们。...

DOM文档对象模型

前言 DOM(Document Object Model) 文档对象模型&#xff0c;是W3C制定的标准接口规范&#xff0c;是一种处理HTML和XML文件的标准API。简单来说DOM就是操作网页的api和接口。 一、Node类型属性 1.判断节点类型 nodeType 整数返回值 9 1 3 2 <div id"one">我…...

【Django-DRF】多年md笔记第5篇:Django-DRF的Request、Response和视图详解

本文从分析现在流行的前后端分离Web应用模式说起&#xff0c;然后介绍如何设计REST API&#xff0c;通过使用Django来实现一个REST API为例&#xff0c;明确后端开发REST API要做的最核心工作&#xff0c;然后介绍Django REST framework能帮助我们简化开发REST API的工作。 Dj…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;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 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...