【Git 版本管理】合并 + 变更,看懂Git

看懂 Git

  • 合并操作
  • 分离 HEAD
    • 分离 HEAD 测试
  • 相对引用(^ || ~)
    • 操作符 ^
    • 相对引用 ^ 测试
    • 操作符 ~
    • 相对引用 ~ 测试
  • 撤销变更
    • Git Reset
    • Git Revert
    • 撤销变更 测试
  • 整理提交记录
    • Git Cherry-pick
    • 测试
  • 交互式 rebase
    • 交互式 rebase 测试

合并操作

关键字:commitbranchmergerebase
基础指令在此不介绍

分离 HEAD

HEAD 是一个对当前所在分支的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录
HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的
HEAD 通常情况下是指向分支名的  在你提交时,改变了分支名的状态,这一变化通过 HEAD 变得可见

如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看, 如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向

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

HEAD -> main -> C1
HEAD 指向 main, main 指向 C1

在这里插入图片描述

git checkout C1;

现在我们切换到 C1,变成了
在这里插入图片描述

分离 HEAD 测试

想完成此关,从 bugFix
分支中分离出 HEAD 并让其指向一个提交记录
通过哈希值指定提交记录。每个提交记录的哈希值显示在代表提交记录的圆圈中

在这里插入图片描述

git checkout C4;

在这里插入图片描述

相对引用(^ || ~)

通过指定提交记录哈希值的方式在 Git 中移动不太方便
在实际应用时,并没有像本程序中这么漂亮的可视化提交树供你参考
所以你就不得不用 git log 来查查看提交记录的哈希值并且哈希值在真实的 Git 世界中也会更长(译者注:基于 SHA-1,共 40 位)
例如前一关的介绍中的提交记录的哈希值可能是 fed2da64c0efc5293610bdd892f82a58e8cbc5d8...比较令人欣慰的是,Git 对哈希的处理很智能
你只需要提供能够唯一标识提交记录的前几个字符即可
因此我可以仅输入fed2 而不是上面的一长串字符

正如我前面所说,通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。这个就很厉害了!
使用相对引用的话,你就可以从一个易于记忆的地方(比如 bugFix 分支或 HEAD)开始计算
相对引用非常给力,这里我介绍两个简单的用法:
使用 ^ 向上移动 1 个提交记录
使用 ~\<num> 向上移动多个提交记录,如 ~3

操作符 ^

在这里插入图片描述

首先看看操作符 (^)  把这个符号加在引用名称的后面,表示让 Git 寻找指定提交记录的 parent 提交所以 main^ 相当于 “main 的 parent 节点”main^^ 是 main 的第二个 parent 节点现在咱们切换到 main 的 parent 节点
git checkout main^;

这种方式是不是比输入哈希值方便多了?
在这里插入图片描述


在这里插入图片描述

你也可以将 HEAD 作为相对引用的参照 下面咱们就用 HEAD 在提交树中向上移动几次

 git checkout C3;git checkout HEAD^;git checkout HEAD^;git checkout HEAD^ 

在这里插入图片描述
很简单吧 我们可以一直使用 HEAD^ 向上移动

相对引用 ^ 测试

要完成此关,切换到 bugFixparent 节点。这会进入分离 HEAD 状态
如果你愿意的话,使用哈希值也可以过关,但请尽量使用相对引用!

在这里插入图片描述

git checkout bugFix^;

在这里插入图片描述

操作符 ~

如果你想在提交树中向上移动很多步的话,敲那么多 ^ 貌似也挺烦人的Git 当然也考虑到了这一点,于是又引入了操作符 ~该操作符后面可以跟一个数字(可选,不跟数字时与 ^ 相同,向上移动一次)指定向上移动多少次

在这里插入图片描述
咱们用 ~<num> 一次后退四步

git checkout HEAD~4;

在这里插入图片描述
多么的简洁 —— 相对引用就是方便啊


强制修改分支位置

你现在是相对引用的专家了,现在用它来做点实际事情。
我使用相对引用最多的就是移动分支。可以直接使用 -f 选项让分支指向另一个提交。例如:
在这里插入图片描述

git branch -f main HEAD~3

上面的命令会将 main 分支强制指向 HEAD 的第 3 级 parent 提交

在这里插入图片描述

相对引用为我们提供了一种简洁的引用提交记录 C1 的方式, 而 -f 则容许我们将分支强制移动到那个位置

相对引用 ~ 测试

既然你已经看过相对引用与强制移动分支的演示了,那么赶快使用这些技巧来挑战这一关吧!
要完成此关,移动 HEAD main 和 bugFix 到目标所示的位置

在这里插入图片描述

git checkout HEAD~1;git branch -f main HEAD~1;git branch -f main C6;

在这里插入图片描述

撤销变更

在 Git 里撤销变更的方法很多
和提交一样,撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成
我们这个应用主要关注的是后者主要有两种方法用来撤销变更 —— 一是 git reset  还有就是 git revert 

Git Reset

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

在这里插入图片描述

git reset HEAD^;||git reset HEAD~1;

在这里插入图片描述
漂亮! Gitmain 分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了
(译者注:在 reset 后, C2 所做的变更还在,但是处于未加入暂存区状态)

Git Revert

虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!为了撤销更改并分享给别人,我们需要使用 git revert 来看演示

在这里插入图片描述

git revert HEAD;

在这里插入图片描述

奇怪!在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的
revert 之后就可以把你的更改推送到远程仓库与别人分享啦

撤销变更 测试

要完成此关,分别撤销 local 分支和 pushed 分支上的最近一次提交。共需要撤销两个提交(每个分支一个)记住 pushed 是远程分支,local 是本地分支 —— 这么说你应该知道用分别哪种方法了吧?

在这里插入图片描述

git reset HEAD^;git checkout pushed;git revert HEAD;

在这里插入图片描述

整理提交记录

到现在我们已经学习了 Git 的基础知识 —— 提交、分支以及在提交树上移动。
这些概念涵盖了 Git 90% 的功能,同样也足够满足开发者的日常需求然而, 剩余的 10% 在处理复杂的工作流时(或者当你陷入困惑时)可能就显得尤为重要了
接下来要讨论的这个话题是“整理提交记录” —— 开发人员有时会说“我想要把这个提交放到这里, 那个提交放到刚才那个提交的后面”
而接下来就讲的就是它的实现方式,非常清晰、灵活,还很生动

Git Cherry-pick

系列的第一个命令是 git cherry-pick, 命令形式为

git cherry-pick <提交号>...

如果你想将一些提交复制到当前所在的位置(HEAD)下面的话, Cherry-pick 是最直接的方式了

这里有一个仓库, 我们想将 side 分支上的工作复制到 main 分支,你立刻想到了之前学过的 rebase 了吧?但是咱们还是看看 cherry-pick 有什么本领吧

在这里插入图片描述

 git cherry-pick C2 C4;

在这里插入图片描述
我们只需要提交记录 C2C4,所以 Git 就将被它们抓过来放到当前分支下了

测试

要通过此关,只需要简单的将三个分支中的提交记录复制到 main 上就可以了

在这里插入图片描述

git cherry-pick C3 C4 C7;

在这里插入图片描述

交互式 rebase

当你知道你所需要的提交记录(并且还知道这些提交记录的哈希值)时
用 cherry-pick 再好不过了 —— 没有比这更简单的方式了但是如果你不清楚你想要的提交记录的哈希值呢? 
幸好 Git 帮你想到了这一点, 我们可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录, 这就是最好的方法了

交互式 rebase 指的是使用带参数 --interactiverebase 命令, 简写为 -i
如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改
在实际使用时,所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件

当 rebase UI界面打开时, 你能做3件事:调整提交记录的顺序(通过鼠标拖放来完成)
删除你不想要的提交(通过切换 pick 的状态来完成,关闭就意味着你不想要这个提交记录)合并提交. 简而言之,它允许你把多个提交记录合并成一个

在这里插入图片描述
当你点击下面的按钮时,会出现一个交互对话框,对提交记录做个排序(当然你也可以删除某些提交),点击确定看结果

git rebase -i HEAD~4;

在这里插入图片描述
排序关键字 pick

Git 严格按照你在对话框中指定的方式进行了复制
在这里插入图片描述

交互式 rebase 测试

要通过本关, 做一次交互式的 rebase,整理成目标窗口中的提交顺序,记住,你随时都可以用 undo、reset 修正错误,这是不会记入步数的 😄

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Minio篇:初识MinIO

1. MinIO快速入门 1.1.MinIO核心概念 下面介绍MinIO中的几个核心概念&#xff0c;这些概念在所有的对象存储服务中也都是通用的。 对象&#xff08;Object&#xff09; 对象是实际的数据单元&#xff0c;例如我们上传的一个图片。 存储桶&#xff08;Bucket&#xff09; 存储…

【JAVA SE】多态

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;JAVA 个人主页&#xff1a;Celias blog~ 目录 引言 一、多态 1.1 多态的概念 1.2 多态的实现条件 1.3…

深入探讨 Android 的 View 显示过程与源码分析

文章目录 1. 探讨 Android 的 View 显示过程1.1. onFinishInflate1.2. onAttachedToWindow1.3. onMeasure1.4. onSizeChanged1.5. onLayout1.6. onDraw 2. 系统代码分析1.1. onFinishInflate1.2. onAttachedToWindow1.3. onMeasure1.4. onSizeChanged1.5. onLayout1.6. onDraw …

数字化浪潮中的TPM革新:打造高效生产新范式

在数字化浪潮席卷全球的今天&#xff0c;传统生产管理模式正面临前所未有的挑战与机遇。TPM&#xff08;全面生产维护&#xff09;作为一种先进的生产管理理念&#xff0c;如何在数字化驱动下焕发新的活力&#xff0c;成为制造业转型升级的关键一环。 数字化技术为TPM带来了前…

探秘Flask中的表单数据处理

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、Flask中的表单处理机制 三、Flask表单处理实战 四、处理表单数据的注意事项…

为什么要使用动态代理IP?

一、什么是动态代理IP&#xff1f; 动态代理IP是指利用代理服务器来转发网络请求&#xff0c;并通过不断更新IP地址来保护访问者的原始IP&#xff0c;从而达到匿名访问、保护隐私和提高访问安全性的目的。动态代理IP在多个领域中都有广泛的应用&#xff0c;能够帮助用户…

vue路由跳转之【编程式导航与传参】

vue路由有两种跳转方式 ----> 编程式与声明式&#xff0c;本文重点讲解vue路由的【编程式导航 】【编程式导航传参 ( 查询参数传参 & 动态路由传参 ) 】等内容&#xff0c;并结合具体案例让小伙伴们深入理解 &#xff0c;彻底掌握&#xff01;创作不易&#xff0c;需要的…

2023年全球DDoS攻击现状与趋势分析

天翼安全科技有限公司副总工程师、运营保障部总经理陈林表示&#xff0c;2023年扫段攻击频次快速增长&#xff0c;成为网络基础设施面临的最大威胁。为躲避防御&#xff0c;低速扫段攻击成为主流达到攻击总数的73.19%&#xff1b;43.26%的C段攻击持续时间小于5分钟&#xff0c;…

Linux中部署MinIO

Linux中部署MinIO 下载MinIO可执行程序&#xff1a; wget https://dl.min.io/server/minio/release/linux-amd64/minio 添加执行权限&#xff1a; chmod x minio 创建存储目录&#xff0c;例如/data&#xff1a; mkdir -p /data 运行MinIO服务器&#xff0c;需要设置MIN…

【设计模式】JAVA Design Patterns——Factory Method(虚拟构造器模式)

&#x1f50d;目的 为创建一个对象定义一个接口&#xff0c;但是让子类决定实例化哪个类。工厂方法允许类将实例化延迟到子类 &#x1f50d;解释 真实世界例子 铁匠生产武器。精灵需要精灵武器&#xff0c;而兽人需要兽人武器。根据客户来召唤正确类型的铁匠。 通俗描述 它为类…

三维前端项目中用THREEWebGLRenderer于创建渲染器对象

在三维前端项目开发中&#xff0c;可以使用THREE.WebGLRenderer创建渲染器对象。艾斯视觉作为行业ui设计与前端开发服务商很高兴能在这里与你共同探讨&#xff1a;THREE.WebGLRenderer是 Three.js 库中用于将 3D 场景渲染到屏幕上的类。以下是一个示例代码&#xff0c;展示了如…

element中table的selection-change监听改变的那条数据的下标

<el-table ref"table" :loading"loading" :data"tableData" selection-change"handleSelectionChange"></el-table>当绑定方法selection-change&#xff0c;当选择项发生变化时会触发该事件 // 多选框选中数据handleSele…

truncate IDL_UB1$导致数据库open hang---惜分飞

在一次数据库恢复中,发现IDL_UB1$表被truncate,然后数据库在open过程中会hang住,而且不报任何错误,这里通过试验进行重现.对于这类问题,以前有过类似处理测试&#xff1a;truncate IDL_UB1$恢复试验数据库版本 SQL> select * from v$version; BANNER ---------------------…

vivado原语使用

首先介绍一下原语&#xff1a;其英文名字为Primitive。原语是Xilinx针对其器件特征开发的一系列常用模块的名字&#xff0c;用户可以将其看成Xilinx公司为用户提供的ip&#xff0c;是芯片中的基本元件&#xff0c;代表FPGA中实际拥有的硬件逻辑单元&#xff0c;如LUT&#xff0…

汇编:x86汇编环境搭建与基础框架(32位)

32位汇编代码编写环境&#xff1a;Visual Studio&#xff08;笔者用的版本为2017&#xff09;&#xff1b;先来说一下在Visual Studio 2017中编写汇编代码的准备操作&#xff1a; ①创建空项目 ②设置项目属性&#xff1a;平台工具集设置为Visual Studio 2015(v140)&#xff0…

YOLOv5改进 | 注意力机制 | 添加三重注意力机制 TripletAttention【原理 + 完整代码】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 得益于在通道或空间位置之间建立相互依赖关系的能力&#xff0c;近年来&#xff0c;注意力机制在计算机视觉任务中得到了广泛的研究和应用。…

嵌入式Linux命令基础

一、命令概述 1. 命令本质 命令的特性&#xff1a;一般就是对应shell命令&#xff0c;每一个命令代表一个可执行程序&#xff0c;运行一个命令就相当于 运行一个可执行代码。 2. 打开终端方法 第一种方法&#xff1a;通过鼠标右键选择打开终端 第二种方法&#xff1a;利用…

Django——Admin站点(Python)

#前言&#xff1a; 该博客为小编Django基础知识操作博客的最后一篇&#xff0c;主要讲解了关于Admin站点的一些基本操作&#xff0c;小编会继续尽力更新一些优质文章&#xff0c;同时欢迎大家点赞和收藏&#xff0c;也欢迎大家关注等待后续文章。 一、简介&#xff1a; Djan…

认识Oracle v$mystat视图

v$mystat就是当前用户的各种统计信息&#xff0c; sid就是session的id(也就是当前用户),STATISTIC#就是统计量的编号(用来唯一确定统计量的名称)&#xff0c;value是统计量的值&#xff1b; desc命令在Oracle中通常用于查看表结构&#xff1b; v$mystat视图中只会有当前用户…

【NVM】nvm常用命令,切换node版本命令

nvm常用的命令&#xff0c;切换node版本命令 nvm 查看支持安装的node版本 nvm list available nvm安装指定版本node nvm install 版本号 例如&#xff1a;nvm install 10.24.1 nvm查看本机安装所有node版本 nvm list nvm切换node版本 nvm use 10.24.1 检测当前node版本 node -…