git 分支管理进阶

目录

1. merge

命令:git merge A 

2. rebase

命令:git rebase A

命令:git rebase B A  

3. 指针——分支切换

3.1哈希值方式

3.2相对引用 

3.3综合练习

4.撤销

4.1 本地分支 reset

4.2 远程分支 revert

5.Cherry-pick与交互式的 rebase

       5.1 Cherry-pick

5.2 git rebase -i 

6. 标签(锚点)

6.1 git tag

6.2 Git Describe


1. merge

命令:git merge A 

作用:把 A 分支 合并到当前分支 (此时当前分支新增了一次提交,指着指向该提交)

初始状态:

git merge bugFix 后:

此外,如果再把 main 分支合并到 bugFix 即(git checkout bugFix, git merge main)

此时,因为 main 继承自 bugFix,Git 什么都不用做,只是简单地把 bugFix 移动到 main 所指向的那个提交记录。现在所有提交记录的颜色都一样了,这表明每一个分支都包含了代码库的所有修改!

2. rebase

        作为第二种合并分支的方法,实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。Rebase 的优势就是可以创造更线性的提交历史(看起来像是按顺序开发,但实际上它们是并行开发的。),这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。

命令:git rebase A

作用:把当前分支  合并到 A分支 (此时A分支新增了一次提交,指针指向该提交)

命令:git rebase B A  

作用:把 A分支合并到B(指针指向A)

初始状态:

git merge main 后:

 bugFix 分支上的工作在 main 的最顶端,同时我们也得到了一个更线性的提交序列。

注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebase 到 main 分支上的 C3 的副本。

此外,有个问题就是 main 还没有更新,则可以git checkout main , git rebase bugFix (或 git rebase bugFix main),即

由于 bugFix 继承自 main,所以 Git 只是简单的把 main 分支的引用向前移动了一下而已。

3. 指针——分支切换

3.1哈希值方式

        git 指针即上图中的 * ,一般用HEAD表示,指向某个分支的最后一次提交。

分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示:HEAD 指向 main, main 指向 C1(HEAD -> main -> C1)

而 git checkout c1(c1 为某次提交记录的哈希值前几位,提交记录的哈希值一般很长,通过

git log 查看提交记录哈希值)则会变成如下图:

3.2相对引用 

  1. 使用 ^ 回到第一个 parent 提交记录(main^^ 是 main 的第二个 parent 节点)
  2. 使用 ~<num> 向上移动多个提交记录,如 ~3

例1:*原本在main处,切换到 main 的 parent 节点 (git checkout main^)结果如下

也可以将 HEAD 作为相对引用的参照。*原本在main处,下面咱们就用 HEAD 在提交树中向上移动几次:git checkout C3,git checkout HEAD^,git checkout HEAD^,git checkout HEAD^ 

此外,Git 默认选择合并提交的“第一个” parent 提交,在操作符 ^ 后跟一个数字可以改变这一默认行为。如下俩例:

初始状态均为:

git checkout main^ 后:

而,git checkout main^2 后:

例2.1:使用~

初始状态 :

git checkout HEAD~4后:

例2.2

初始状态:

git branch -f main HEAD~3 将 main 分支强制指向 HEAD 的(前)第 3 级 parent 提交:

3.3综合练习

初始状态如下

git checkout HEAD~ , git checkout HEAD^2 , git checkout HEAD~2(简写为 git checkout HEAD~^2~2 ) 后,指针c7->c6->c5->c3

 

4.撤销

4.1 本地分支 reset

git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。

例1 初始状态:

git reset HEAD~1后:

Git 把 main 分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了。

(注意:在reset后, C2 所做的变更还在,但是处于未加入暂存区状态。)

4.2 远程分支 revert

例2:初始状态

git revert HEAD (撤销当前分支main的一次提交)后:

此时,多了一个新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。revert 之后就可以把你的更改推送到远程仓库撤销之前的提交。

5.Cherry-pick与交互式的 rebase

       5.1 Cherry-pick

        命令:git cherry-pick <提交号>...

        作用:将一些提交复制到当前所在的位置(HEAD)的下面

例子:将 side 分支上的一些提交,复制到 main 分支,初始状态:

git cherry-pick C2 C4后:

如果不记得提交记录的哈希值,可以利用交互式的 rebase

5.2 git rebase -i 

例子:假如之前在 newImage 分支上进行了一次提交,然后又基于它创建了 caption 分支,然后又提交了一次。此时你想对某个以前的提交记录进行一些小小的调整。比如设计师想修改一下 newImage 中图片的分辨率,尽管那个提交记录并不是最新的了。

方案:

  1. 先用 git rebase -i 将提交重新排序,然后把我们想要修改的提交记录挪到最前
  2. 然后用 git commit --amend 来进行一些修改(对之前的commit 提交进行修改,push后取代原来的commit)
  3. 接着再用 git rebase -i 来将他们调回原来的顺序
  4. 最后我们把 main 移到修改的最前端

初始状态

 git rebase -i HEAD~2 可以打开交互框,对前2次提交进行编辑(排序,取舍):

对提交记录进行调整后会出现一个新的分支

将后三步走完之后,效果如下:

6. 标签(锚点)

        分支很容易被人为移动,并且当有新的提交时,它也会移动。tag 可以永久地将某个特定的提交命名为里程碑(大版本),它们并不会随着新的提交而移动。你也不能切换到某个标签上面进行修改提交,它就像是提交树上的一个锚点,标识了某个特定的位置。如果你不指定提交记录,Git 会用 HEAD 所指向的位置。

6.1 git tag

命令:git tag v1 c1 给c1提交打上v1标签,如下:

6.2 Git Describe

Git Describe 能帮你在提交历史中移动了多次以后找到方向,用来描述离你最近的 tag

命令:git describe <ref>

 ref 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会使用你目前所在的位置(HEAD

输出:<tag>_<numCommits>_g<hash>

tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位

当 ref 提交记录上有某个标签时,则只 输出 标签名称。

例:初始状态:

git describe main 会输出: v1_2_gC2

git describe side  会输出:v2_1_gC4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148285.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

十天学完基础数据结构-第三天(数组(Array))

数组的基本概念 数组是一种线性数据结构&#xff0c;用于存储相同数据类型的元素。它具有以下基本概念&#xff1a; 元素&#xff1a;数组中的每个数据项称为元素&#xff0c;可以是整数、浮点数、字符等。 索引&#xff1a;每个元素在数组中都有一个唯一的位置&#xff0c;称…

Linux--socket编程

socket套接字编程 一、服务器和客户端的开发步骤&#xff1a; 1、创建套接字 2、为套接字添加信息&#xff08;ip地址和端口号&#xff09; 3、监听网络连接 4、监听到有客户端接入&#xff0c;接受连接&#xff08;如没有接入&#xff0c;会发生阻塞到&#xff09; 5、数据…

flink处理函数--副输出功能

背景 在flink中&#xff0c;如果你想要访问记录的处理时间或者事件时间&#xff0c;注册定时器&#xff0c;或者是将记录输出到多个输出流中&#xff0c;你都需要处理函数的帮助&#xff0c;本文就来通过一个例子来讲解下副输出 副输出 本文还是基于streaming-with-flink这本…

概率密度函数,概率分布函数

概率密度函数&#xff1a;描述信号的取值在某个确定的取值点附近的概率的函数&#xff1b;概率分布函数的导数。 以幅值大小为横坐标&#xff0c;以每个幅值间隔内出现的概率为纵坐标进行统计分析。反映了信号落在不同幅值强度区域内的概率情况。 直方图&#xff1a;对每个幅…

数据结构--队列与循环队列的实现

数据结构–队列的实现 1.队列的定义 比如有一个人叫做张三,这天他要去医院看病,看病时就需要先挂号,由于他来的比较晚,所以他的号码就比较大,来的比较早的号码就比较小,需要到就诊窗口从小号到大依次排队,前面的小号就诊结束之后,才会轮到大号来,小号每就诊完毕就销毁,每新来…

基于Java的火车高铁订票购票系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

支持向量机SVM:从数学原理到实际应用

目录 一、引言背景SVM算法的重要性 二、SVM基础线性分类器简介什么是支持向量&#xff1f;超平面和决策边界SVM的目标函数 三、数学背景和优化拉格朗日乘子法&#xff08;Lagrange Multipliers&#xff09;KKT条件核技巧&#xff08;Kernel Trick&#xff09;双重问题和主问题&…

【云备份】

文章目录 [toc] 1 :peach:云备份的认识:peach:1.1 :apple:功能了解:apple:1.2 :apple:实现目标:apple:1.3 :apple:服务端程序负责功能:apple:1.4 :apple:服务端功能模块划分:apple:1.5 :apple:客户端程序负责功能:apple:1.6 :apple:客户端功能模块划分:apple: 2 :peach:环境搭建…

留住时光、固化时间、让一瞬成为永恒——全新的真人手办定制模式,就选易模小程序制作。

如何能永远留住一瞬间&#xff1f; 有人说我可以拍摄一张照片&#xff0c;照片的问世确实给生活中许多美好的瞬间留下了可以记录的工具。但是随着时间的流逝&#xff0c;照片终究也会泛黄&#xff0c;似乎有一些记忆的温度&#xff0c;有一些岁月的棱角&#xff0c;也是照片所给…

SD卡格式化怎么恢复?

随着智能手机、平板电脑、数码相机和行车记录仪等各种移动电子设备走入千家万户&#xff0c;SD卡作为与这些设备相配套的存储介质&#xff0c;也随之获得了广泛的市场认可。SD卡因其体积小巧、容量庞大、读写速度高及与多种设备兼容的优点&#xff0c;逐渐成为日常工作和生活中…

怒刷LeetCode的第23天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;贪心算法 方法二&#xff1a;动态规划 方法三&#xff1a;回溯算法 方法四&#xff1a;并查集 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;排序和遍历 方法二&#xff1a;扫描线算法 方法…

StarRocks数据导入

1、相关环境 Flink作为当前流行的流式计算框架&#xff0c;在对接StarRocks时&#xff0c;若直接使用JDBC的方式"流式"写入数据&#xff0c;对StarRocks是不友好的&#xff0c;StarRocks作为一款MVCC的数据库&#xff0c;其导入的核心思想还是"攒微批降频率&qu…

HTTP协议,请求响应

、概述 二、HTTP请求协议 三、HTTP响应协议 四、请求数据 1.简单实体参数 RequestMapping("/simpleParam")public String simpleParam(RequestParam(name "name" ,required false ) String username, Integer age){System.out.println (username "…

车牌文本检测与识别:License Plate Recognition Based On Multi-Angle View Model

论文作者&#xff1a;Dat Tran-Anh,Khanh Linh Tran,Hoai-Nam Vu 作者单位&#xff1a;Thuyloi University;Posts and Telecommunications Institute of Technology 论文链接&#xff1a;http://arxiv.org/abs/2309.12972v1 内容简介&#xff1a; 1&#xff09;方向&#x…

可以动态改变刻度背景色的车速仪表盘

最近做的项目的主页面需要用到一个仪表盘来动态显示车速&#xff0c;同时改变对应的背景色 仪表盘 开始是想着使用echarts&#xff0c;修修改改拿来用&#xff0c;但是人家客户有规定&#xff0c;必须搞个差不多的&#xff0c;那没办法&#xff0c;自 己动手搞个吧 截图如下&am…

多源最短路径的原理及C++实现

时间复杂度 O(n3),n是端点数。 核心代码 template<class T, T INF 1000 * 1000 * 1000> class CNeiBoMat { public: CNeiBoMat(int n, const vector<vector<int>>& edges,bool bDirectfalse,bool b1Base false) { m_vMat.assign(n, vector<…

2023年【R2移动式压力容器充装】模拟考试及R2移动式压力容器充装模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装模拟考试考前必练&#xff01;安全生产模拟考试一点通每个月更新R2移动式压力容器充装模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过R2移动式压力容器充装操作证考试很简单。 1…

MySQL5.7版本与8.0版本在Ubuntu(WSL环境)系统安装

目录 前提条件 1. MySQL5.7版本在Ubuntu&#xff08;WSL环境&#xff09;系统安装 1. 1 下载apt仓库文件 1.2 配置apt仓库 1.3 更新apt仓库的信息 1.4 检查是否成功配置MySQL5.7的仓库 5. 安装MySQL5.7 1.6 启动MySQL 1.7 对MySQL进行初始化 1.7.1 输入密码 …

PDF文件压缩软件 PDF Squeezer mac中文版​软件特点

PDF Squeezer mac是一款macOS平台上的PDF文件压缩软件&#xff0c;可以帮助用户快速地压缩PDF文件&#xff0c;从而减小文件大小&#xff0c;使其更容易共享、存储和传输。PDF Squeezer使用先进的压缩算法&#xff0c;可以在不影响文件质量的情况下减小文件大小。 PDF Squeezer…