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

news2024/12/24 21:02:29

看懂 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.coloradmin.cn/o/1717493.html

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

相关文章

自媒体必用的50 个最佳 ChatGPT 社交媒体帖子提示prompt通用模板教程

在这个信息爆炸的时代&#xff0c;社交媒体已经成为我们生活中不可或缺的一部分。无论是品牌宣传、个人展示&#xff0c;还是日常交流&#xff0c;我们都离不开它。然而&#xff0c;要在众多信息中脱颖而出&#xff0c;吸引大家的关注并不容易。这时候&#xff0c;ChatGPT这样的…

DBeaver添加DM8驱动(maven下载和jar包下载配置)

DBeaver 24.0.3添加DM8驱动 下载DBeaver下载DM达梦驱动下载 安装配置使用自带Dameng自行添加达梦驱动 因为最近公司项目有信创要求&#xff0c;所以下载了达梦数据库。使用自带的达梦管理工具不是很方便&#xff0c;于是换了DBeaver。 哼哧哼哧安装好后&#xff0c;创建数据库连…

win11+vmware16.0+Ubuntu22.04+开机蓝屏

总结 本机系统 vm虚拟机下载 参考链接 1. 小白必看的Ubuntu20.04安装教程&#xff08;图文讲解&#xff09; 2. 软件目录【火星】——VM下载 3. Win11使用VMware15/16启动虚拟机直接蓝屏的爬坑记录 VMware16.0

MySQL(十二) Connector/C

首先可以在mysql的官网下载对应的库文件&#xff0c;这里就不演示了 1. 测试 通过 mysql_get_client_info() 函数&#xff0c;来验证我们的引入是否成功 #include <iostream> #include <mysql/mysql.h>int main() {std::cout << "mysql version:&quo…

帕友的锻炼小建议,助您重拾健康与活力

帕金森病&#xff0c;作为一种常见的神经系统退行性疾病&#xff0c;给患者的生活带来了诸多困扰。然而&#xff0c;通过科学的锻炼方法&#xff0c;我们可以有效缓解病情&#xff0c;提高生活质量。 一、有氧运动&#xff1a;提升心肺功能 对于帕金森病患者来说&#xff0c;适…

CentOS 7基础操作01_安装CentOS 7操作系统

1、实验环境 因为 Windows图形界面占用系统资源较高,所以公司准备将面向互联网的网站,数据库等重要应用基于Linux平台部署&#xff0c;并计划于近期将服务器安装开源免费的 CentOS 系统。进行前期准备工作时,需要公司的系统管理员尽快掌握 CentOS 系统的安装过程 2、需要描述 …

方差和标准差的区别

标准差和方差都是用来衡量随机变量的离散程度的统计量&#xff0c;它们之间有以下区别&#xff1a; 方差&#xff08;Variance&#xff09;&#xff1a; 方差是衡量随机变量离其均值的离散程度的度量。它是各个数据与其平均值之差的平方和的平均值。方差的公式为&#xff1a;…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt + uniapp 驾校预约平台 的设计与实现

一.项目介绍 系统角色&#xff1a;管理员、教练、学员 小程序(仅限于学员注册、登录)&#xff1a; 查看管理员发布的公告信息 查看管理员发布的驾校信息 查看所有教练信息、预约(需教练审核)、评论、收藏喜欢的教练 查看管理员发布的考试信息、预约考试(需管理…

javaweb基础之Ajax请求

大家好&#xff0c;这里是教授.F 目录 介绍&#xff1a; 原理图&#xff1a; 原生Ajax&#xff1a; JQuery的Ajax&#xff1a; 介绍&#xff1a; 是一种浏览器异步发起请求&#xff08;指定发那些数据&#xff09;&#xff0c;局部更新页面的技术 原理图&#xff1a; 原生…

MySQL -- SQL笔试题相关

1.银行代缴花费bank_bill 字段名描述serno流水号date交易日期accno账号name姓名amount金额brno缴费网点 serno: 一个 BIGINT UNSIGNED 类型的列&#xff0c;作为主键&#xff0c;且不为空。该列是自动增量的&#xff0c;每次插入新行时&#xff0c;都会自动递增生成一个唯一的…

【SQL学习进阶】从入门到高级应用(七)

文章目录 ✨数据处理函数✨if函数✨cast函数✨加密函数 ✨分组函数✨max✨min✨avg✨sum✨count✨分组函数组合使用✨分组函数注意事项 ✨分组查询✨group by✨having✨组内排序 ✨总结单表的DQL语句 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f495;欢迎来到我…

3、css3 手写nav导航条(互相学习)

效果例图&#xff1a; 1、首先呈现的是html代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

Optional类

一、概述 泛型类、java8引进的、java.util包里 二、作用 解决空指针异常带来的不便 三、做法 将对象封装为一个Optional对象&#xff0c;如果封装的对象为空&#xff08;即该对象不存在&#xff09;&#xff0c;可以使用默认值和或者执行默认操作 四、方法 1、empty() 创…

2024年艺术鉴赏与科学教育国际会议(ICAASE 2024)

2024年艺术鉴赏与科学教育国际会议 2024 International Conference on Art Appreciation and Science Education 【1】会议简介 2024年艺术鉴赏与科学教育国际会议是一场集艺术、科学和教育于一体的国际性学术盛会。本次会议旨在推动艺术鉴赏与科学教育领域的深入交流与合作&am…

通过 CXCR4 靶向纳米线修补细胞表面以抑制癌症转移

引用信息 文 章&#xff1a;Cell surface patching via CXCR4-targeted nanothreads for cancer metastasis inhibition. 期 刊&#xff1a;Nature Communications&#xff08;影响因子&#xff1a;16.6&#xff09; 发表时间&#xff1a;2024/3/29 作 者&#xff1…

语义分割——数据增广

前言 在进行语义分割的时候&#xff0c;我们的数据集有时候不够用&#xff0c;常常需要进行数据增广。 比较常用的数据增广方法(包括旋转&#xff0c;上下翻转&#xff0c;左右翻转&#xff0c;裁剪&#xff0c;调整对比度&#xff0c;调整饱和度&#xff0c;调整亮度&#xf…

【文献阅读】应用人工智能在Simulink中开发软件

参考文献&#xff1a;《AI用于Simulink模型的降阶方法和应用场景》Mathworks在2024年MATLAB XEPO大会的演讲 文章目录&#xff1a; 1、模型框架 2、数据准备 3、AI建模 4、仿真和测试 5、部署应用 Tips&#xff1a;降阶模型&#xff08;Reduced Order Modeling&#xff0…

Centos 7 安装刻录至硬件服务器

前言 在日常测试中&#xff0c;会遇到很多安装的场景&#xff0c;今天给大家讲一下centos 7 的安装&#xff0c;希望对大家有所帮助。 一.下载镜像 地址如下&#xff1a; centos官方镜像下载地址https://www.centos.org/download/ 按照需求依次点击下载 二.镜像刻录 镜像刻…

Redis学习笔记【基础篇】

SQL vs NOSQL SQL&#xff08;Structured Query Language&#xff09;和NoSQL&#xff08;Not Only SQL&#xff09;是两种不同的数据库处理方式&#xff0c;它们在多个维度上有所差异&#xff0c;主要区别包括&#xff1a; 数据结构: SQL&#xff08;关系型数据库&#xff09;…

修改element-ui el-radio颜色

修改element-ui el-radio颜色 需求效果图代码实现 小结 需求 撤销扣分是绿色&#xff0c;驳回是红色 效果图 代码实现 dom <el-table-columnlabel"操作"width"200px"><template v-slot"scope"><el-radio-group v-model"s…