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

Git 指令深入浅出【2】—— 分支管理

Git 指令深入浅出【2】—— 分支管理

  • 分支管理
    • 1. 常用分支管理指令
    • 2. 合并分支
      • 合并冲突
        • 合并模式
    • 3. 实战演习

分支管理

1. 常用分支管理指令

# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看全部分支
git branch -a

image.png

HEAD 指向的才是当前的工作分支

# 查看当前分支的提交记录
git log --graph --abbrev-commit# --abbrev-commit 仅显示 HA-1校验和的前几个字符的 提交ID

image.png

常用分支名

  • master 主分支 用于生产环境
  • release 预发布分支,用于测试环境、预发布环境
  • develop 开发分支,用于开发环境
  • feature 需求开发分支,用于本地
  • hotfix 紧急修复分支,用于本地
git branch <branchName># * 所标示的分支是 “当前分支”

image.png

# 切换分支
git checkout <branchName>

image.png

切换工作分支后,在未合并分支之前,分支之间不会影响

# 新分支提交
git add <fileName>
git commit -m "test new branch"
git log --graph

image.png
image.png

# 删除分支(强制 与 非强制)
git branch -d <branchName>
git branch -D <branchName> # 强制删除 可以通过 git branch --help 自行查看# 删除远程分支
git branch -d -r <remote>/<branchName>

image.png
image.png

强制删除会带来什么结果呢?上方已经给出提示了“分支dev没有完全合并”,这就意味着在分支上新创建的文件都不会被保留下来,自然也不会有提交记录了。写完代码之后直接就删除分支肯定是不合理的,需要合并到**master**之后再删除无用分支才正确。

ls 
git log --graph

image.png
image.png
image.png

# 显示关于远程仓库的信息,包括分支是否跟踪
git remote show origin # origin 是远程仓库名

image.png

# 移除本地仓库中远程仓库已删除的分支
git remote prune <warehouseName>

2. 合并分支

git branch dev # 创建新分支
git checkout dev # 切换至新分支
#-------------------------------------
git checkout -b <branchName> # 创建并切换到新分支(上两条指令 2合1)
# 在 新分支 下创建文件并提交
touch file7
git add file7
git commit -m "merge and delete file7"

image.png

# 合并分支
git checkout master
git merge dev
git branch -d dev

请注意看下方的两个部分。第一次,笔者尝试在dev分支上合并master分支,然后再删除dev分支。但很明显这是错的,如何刚刚把代码合并到dev分支,又马上删除dev那这样的合并还有什么意义呢?所以,正确的做法是:

  • 切换到 要 “合并到”的分支。此处我们要合并到master分支上
  • 合并分支
  • 删除无用分支

image.pngimage.png

合并冲突

因为是多人协作,合并冲突的发生几乎是不可避免的。但是为什么会产生冲突呢?因为开发人员修改了同一份文件,但 Git 不知道以谁的文件为标准保留,因此就将这个冲突交给开发人员来解决。我们举一个现实中的例子:master分支的代码出现线上Bug,于是开发人员修改之后把修改的代码提交上去,此时的代码是最新最安全的;而其他开发人员在开发之初,拉取的是原本有Bug的master分支,这是就很有可能发生冲突。
下面的图可以很直观的反应冲突现场:
image.png

# 冲突现场准备
git checkout -b dev
ls
vim file7 # 随便写点东西保存
git add file7
git commit -m "dev-file7"git checkout master
vim file7 # 随便写点东西保存
git add file7
git commit -m "master-file7"

image.png

# 发生冲突
# 要 “合并到”master分支,所以是在 master分支 上合并 dev分支
git merge dev
cat file7

image.png
直接看下图,我们很好理解发生冲突之后的变化。最后,我们只要确保文件上的内容是我们想保存的即可。
image.png

# 解决冲突
vim file7
cat file7 # 这是笔者想保留的内容(即 两个分支都增加的内容)
git add file7
git commit -m "解决file7的分支冲突"
git merge dev

需要注意的是:在手动解决冲突之后,需要再次提交文件
image.png
image.png

合并模式

在正式讨论合并模式之前,我们先看看之前我们实验过的图。如果只看上面那张,我们可以很清晰的感受到,最新的代码是由dev分支合并而来的。
image.png
但是,我们用git log --graph打印出来的图却没有这样色彩分明的线条,这时我们怎么区分最新的代码是master分支修复后的结果?还是dev分支合并后的结果呢?
image.png

这就要讲到合并模式相关的知识了。我们上方所用的合并模式是ff -- Faster Forward快速合并模式。这种模式是无法看到最新的提交时是commit得来还是merge得来。如果想要区分,可以使用no-ff即 非快速合并模式。

git merge --no-ff -m "merge dev" dev

image.png
image.png

3. 实战演习

演习内容:在开发过程中遇到紧急Bug需要处理,需要保存当前开发分支内容去修复Bug,修复完成后完成开发,最后合并到主分支上。

# 保存工作区内容
git checkout dev
ls
vim file8
cat file8
git add file8
git stash # 未commit,将工作区的内容保存

image.png
使用git stash 保存的内容是可以在.git中看到的

# 查看保存内容
cd .git/refs
cat stash
git cat-file -p '序列化ID'

image.png

# 修复master分支Bug
git checkout master
git checkout -b hotfix
vim file8
git add file8
git commit -m "修复master分支的紧急Bug"
git checkout master
git merge --no-ff -m "merge hofix" hotfix
git log --graph
git branch -d hotfix

image.png
image.png

# 继续完成开发并合并分支
git checkout dev
git stash list # 查看保存内容
git stash pop # 恢复保存内容
vim file8
cat file8
git add file8
git commit -m "完成开发"git merge --no-ff -m "合并master分支到dev分支,以免dev分支存在bug污染master分支" mastervim file8
git add file8
git commit -m "解决合并冲突"
git log --graph

image.png
下方这个图不是很好看,其实只要分清哪一条是master分支(中间那条)即可。值得关注的是,将master分支合并到dev分支的画法。
image.png
image.png

# 正式合并
git checkout master
git merge --no-ff -m "正式合并到master分支上" dev
cat file8
git log --graph

image.png
image.png
image.png

相关文章:

Git 指令深入浅出【2】—— 分支管理

Git 指令深入浅出【2】—— 分支管理 分支管理1. 常用分支管理指令2. 合并分支合并冲突合并模式 3. 实战演习 分支管理 1. 常用分支管理指令 # 查看本地分支 git branch# 查看远程分支 git branch -r# 查看全部分支 git branch -aHEAD 指向的才是当前的工作分支 # 查看当前分…...

工作流/任务卸载相关开源论文分享

decima-sim 概述&#xff1a; 图神经网络强化学习处理多工作流 用的spark的仿真环境&#xff0c;mit的论文&#xff0c;价值很高&#xff0c;高被引&#xff1a;663仓库地址&#xff1a;https://github.com/hongzimao/decima-sim论文&#xff1a;https://web.mit.edu/decima/co…...

为什么要用Python?

为什么要用Python&#xff1f; Python简单易用&#xff1a;提供大量的简单易用数据结构和内置库&#xff0c;语法结构也很简单易读&#xff0c;不需要使用括号来进行代码块分组&#xff0c;也不需要预声明变量或参数。Python开发效率高&#xff1a;简单易用的前提下&#xff0…...

北京大学发布,将试错引入大模型代理学习!

引言&#xff1a;探索语言智能的新边界 在人工智能的发展历程中&#xff0c;语言智能始终是一个核心的研究领域。随着大语言模型&#xff08;LLM&#xff09;的兴起&#xff0c;我们对语言智能的理解和应用已经迈入了一个新的阶段。这些模型不仅能够理解和生成自然语言&#x…...

Java 设计模式

编程设计模式六大原则 开闭原则&#xff08;Open Close Principle&#xff09;&#xff1a;对扩展开放&#xff0c;对修改关闭。在程序需要进行拓展的时候&#xff0c;不能去修改原有的代码&#xff0c;实现一个热插拔的效果。简言之&#xff0c;是为了使程序的扩展性好&#…...

Kivy和BeeWare 开发APP的优缺点,及其发展历史

Kivy和BeeWare都是流行的Python框架&#xff0c;用于开发移动应用。它们各自有独特的特点和优势&#xff0c;同时也面临一些挑战和限制。下面是对这两个框架的开发优缺点及其发展历史的总结。 Kivy 发展历史 起源&#xff1a;Kivy诞生于2010年&#xff0c;旨在提供一个用于P…...

C++递推

统计每个月兔子的总数 #include<bits/stdc.h> using namespace std; int n,sum0; void f(int); int main() {int a[1000];cin>>n;a[1]1;a[2]2;for(int i3;i<1000;i){a[i]a[i-1]a[i-2];}cout<<a[n];return 0; } void f(int n){}猴子吃桃子 #include<b…...

C++ 面试题

一、基础语法 1. C 和 C的区别 i. C是面向对象的的编程语言&#xff0c;C是面向过程的编程语言 ii. C中的内存分配运算符是new/delete而C 中是malloc和free iii. C中有函数重载而C 中没有 iv. C中新增了引用的概念而C 中只有值和指针 2. struct 和 class的区别 i. struc…...

MySQL之索引详解

华子目录 索引概述优缺点 索引的原理索引的设计原则索引结构B-tree&#xff08;多路平衡查找树&#xff09;BtreeHash 为什么InnoDB存储引擎选择Btree&#xff1f;索引分类聚集索引选取规则 单列索引和多列索引前缀索引创建索引1.创建表时创建索引2.在已经存在的表上创建索引3.…...

Java面试题总结8:springboot

Spring Boot自动配置原理 importConfigurationSpring spi 自动配置类由各个starter提供&#xff0c;使用ConfigurationBean定义配置类&#xff0c;放到META-INF/spring.factories下 使用Spring spi扫描META-INF/Spring.factories下的配置类 如何理解Spring Boot中Starter …...

Android 4.4 以下,OkHttp访问Https报错,设置了sslSocketFactory仍无效的解决方法

背景 Android 4.4 及以下&#xff0c;使用 OkHttp 发送 Https 请求&#xff0c;报以下错误&#xff1a; javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl0x6b712c90: Failure in SSL library, usually a protocol erro…...

如何扫码查看企业介绍及填写招聘表?招聘二维码在线生成的方法

现在很多企业会通过生成二维码的方式来做企业介绍以及企业招聘&#xff0c;企业信息通过图片、文字、视频及其他内容展示&#xff0c;再创建合适的表单让扫码者按照制定的内容来填写对应的信息&#xff0c;从而完成扫码招聘的目的。 对于也想采用这种方式的小伙伴&#xff0c;…...

如何限制一个账号只在一处登陆

大家好&#xff0c;我是广漂程序员DevinRock&#xff01; 1. 需求分析 前阵子&#xff0c;和问答群里一个前端朋友&#xff0c;随便唠了唠。期间他问了我一个问题&#xff0c;让我印象深刻。 他问的是&#xff0c;限制同一账号只能在一处设备上登录&#xff0c;是如何实现的…...

日常工作总结

日常工作总结 1000. JAVA基础1. 泛型1.1 泛型和Object的区别 1100. Spring1. 常用注解1.1 ControllerAdvice注解1.2 缓存Cacheable 2. 常用方法2.1 BeanUtils.copyProperties的用法 3. 常用功能组件3.1 过滤器Filter 2000. Linux应用 1000. JAVA基础 1. 泛型 1.1 泛型和Objec…...

Android Activity启动模式

文章目录 Android Activity启动模式概述四种启动模式Intent标记二者区别 Android Activity启动模式 概述 Activity 的管理方式是任务栈。栈是先进后出的结构。 四种启动模式 启动模式说明适用场景standard标准模式默认模式&#xff0c;每次启动Activity都会创建一个新的Act…...

【JavaScript】面试手撕防抖

引入 防抖可是前端面试时最频繁考察的知识点了&#xff0c;首先&#xff0c;我们先了解防抖的概念是什么。咳咳。&#x1f440; 防抖&#xff1a; 首先它是常见的性能优化技术&#xff0c;主要用于处理频繁触发的浏览器事件&#xff0c;如窗口大小变化、滚动事件、输入框内容…...

【Kubernetes】K3S

目录 前言一、原理单体架构高可用架构 二、初始化1.配置yum源2.关掉防火墙3.关掉selinux4. 修改内核参数5.关掉swap交换分区 三、安装master节点1. 安装container2.启动master服务 四、安装node节点五、卸载六、总结 前言 各位小伙伴们&#xff0c;大家好&#xff0c;小涛又来…...

Docker实战——容器

目录 Docker 容器的基本概念与操作1.使用“docker create”创建容器。这里基于Nginx的镜像创建了一个容器&#xff0c;名字为mycontainer。2.使用“docker ps -a”命令查看所有的容器&#xff0c;这时的容器不一定是运行状态。3.使用 “docker start” 命令可以启动容器。4.使用…...

亚信安慧AntDB开启超融合数据库新纪元

&#xff08;一&#xff09; 前言 据统计&#xff0c;在信息化时代的今天&#xff0c;人们一天所接触到的信息量&#xff0c;是古人一辈子所能接收到的信息量的总和。当今社会中除了信息量“多”以外&#xff0c;人们对信息处理的“效率”和“速度”的要求也越来越高。譬如&…...

数学建模【多元线性回归模型】

一、多元线性回归模型简介 回归分析是数据分析中最基础也是最重要的分析工具&#xff0c;绝大多数的数据分析问题&#xff0c;都可以使用回归的思想来解决。回归分析的任务就是&#xff0c;通过研究自变量X和因变量Y的相关关系&#xff0c;尝试去解释Y的形成机制&#xff0c;进…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

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

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