Git进阶之代码回滚、合并代码、从A分支选择N次提交,合并到B分支【revert、merge、rebase、cherry-pick】

news2024/11/24 2:22:44
  • B站视频地址: https://www.bilibili.com/video/BV1KX4y1a7N9

  • Git学习文档:https://d9bp4nr5ye.feishu.cn/wiki/PeDPw3mm3iFA36k9td9cVeignsZ


在很长一段时间里,我对Git的操作只限于:提交代码,拉取代码,合并代码。

虽然上面这些操作在日常工作中也足够了,但不会点高级知识不利于装X,今天我们来学习几个高级点的操作。


一、前提


在正式操作之前,我们先来共知几个命令和概念。


SHA标识


每一次提交Git都会生成一个唯一SHA标识(简单来说就是为这次提交生成一个唯一字符串),代码合并、回滚、检出都和这个标识相关。

注:SHA标识是指Git中的SHA-1哈希标识符,它是一个40个字符的字符串,用于唯一标识Git中的每个提交、对象和分支。SHA-1是一个加密哈希函数,它接受输入(例如文件内容或提交信息)并生成一个唯一的40字符长的哈希值。


git log


Git 的每次提交都会携带很多信息,提交者、提交时间、唯一SHA标识等,想要查看这些信息,可以使用 git log 命令。


git log


完整的查看 log信息,展示效果如下:

在这里插入图片描述


git log --oneline


精简提交信息,以一行的方式展示
在这里插入图片描述

git log --graph --oneline

以时间线的方式查看精简的日志信息

在这里插入图片描述


二、回滚代码


代码回滚,提交了错误的代码、代码错合并到非目标分支

  1. commit 回滚
  2. merge 回滚

回滚


使用 git log --graph --oneline 查看日志线,并找到我们要撤回提交的hash

在这里插入图片描述

1、找到我们要回滚commit的 hash
git log --graph --oneline

2、执行回滚命令   回滚之后可能是有冲突的,是需要手动解决冲突
git revert 1b17801
git push


3、回滚 mergn
git revert f259bf5
git push

冲突


如果回滚的时候有冲突,会这样提示

在这里插入图片描述


方式一

可以选择放弃这次的回滚 git revert --abort


方式二

-- 1、手动解决冲突

-- 2、提交修改
git add .

-- 3、继续revert, 会弹出一个文件,可以修改commit的描述,也可以直接关闭
git revert --continue

-- 4、push代码
git push

在这里插入图片描述

三、合并代码


合并代码就是把branchA的代码移植到branchB,有两个命令可以来完成此操作:merge、rebase。

假如branchA是我们的开发分支,branchB是正式分支,在branchA上面我们提交了三次。现在我们来看看使用 merge 和 rebase 合并会有什么不同。


Merge

merge会把branchA所有的提交打包成一个最终状态,去和branchB的最终状态来一次合并。如果有冲突,我们只需要解决一次冲突就好了。

# branchA 当前log
A---B---C (branchA)

# branchB 当前log
D---E---F---G (branchB)


# 在branchB 上执行 git merge branchA  

      A---B---C (branchA)
     /         \
D---E---F---G---H (branchB, merge commit)

其实就是把 branchA 当前的状态当作一次提交合并到branchB上去,所以会形成一次新的提交 H。对branchA没什么改变,对branchB 多了一次提交。(Merge remote-tracking branch ‘origin/branchA’ into branchB)


Rebase

rebase 会把branchA 上的每一次提交,都依次合并到 branchB 上去。 如果在branchA上的三次提交都和branchB有冲突,那你就要解决三次冲突。(因为它是依次提交的)

# branchA 当前log
A---B---C (branchA)

# branchB 当前log
D---E---F---G (branchB)


# 在branchB 上执行 git rebase branchA  

             A--B--C (branchA, rebased)
            /
D---E---F---G (branchB)

从结果来看相对于 merge, rebase有两个特殊点(代码没有冲突的情况下)

  1. 它不会生成新的 SHA标识。
  2. 目标分支成了一条直线,且更长了。(具体看branchA提交的次数)

结论

合并代码的时候使用 merge,可以更好的看到提交的变更,并保留每个分支的独立性和历史记录,只需要解决一次冲突,所以在正常情况下,更推荐使用 merge 来合并代码。

当然如果你是把别的分支 rebase到自己的分支,那没什么关系,最起码不会影响到别人。


Rebase 合并 commit


rebase 除了上面的合并代码,它还有一个很大的用处就是合并commit,开发的过程中我们可能提交了很多乱七八糟的commit,但是为了更美观,我们可以把多个commit合并成一个新的commit。

合并commit有两个方式

  1. 以头为标准,往下合并N个commit git rebase -i HEAD~N
  2. 以某个节点向上做commit合并 git rebase xxx xxx 就是commit的hash值

假设我们有三次提交,现在我们要把 two 和 three 合并成一个新的提交 two and three

在这里插入图片描述


git rebase -i 49412a4

执行命令后,会弹出一个文本窗口,让我们来确定要对这次rebase的操作,可以对每个commit进行很多。

在这里插入图片描述

pick 687575f three commit 改为 squash 687575f three commit 然后保存退出。

保存后,又会弹出一个窗口,告知我们修改 commit的提交信息

修改前

# This is a combination of 2 commits.
# This is the 1st commit message:

two commit

# This is the commit message #2:

three commit

修改后

# This is a combination of 2 commits.
# This is the 1st commit message:

two three commit

# This is the commit message #2:

three commit

保存后就成功

在这里插入图片描述


再次查看日志

在这里插入图片描述


rebase修改commit的操作有很多,上面我们用了一个squash,下面是全部的命令,可以根据需要选择

命令解释简写
pick使用提交,即应用该提交的更改。p
reword使用提交,但可以编辑提交消息。r
edit使用提交,但停下来以进行修改。 e
squash使用提交,将其融入到前一个提交中。s
exec使用shell运行命令(行中的其余部分)。x
break在此处停止(稍后使用 git rebase --continue 继续进行rebase)。 b
drop删除提交。d
label为当前HEAD标记一个名称。l
reset将HEAD重置为一个标签。t
merge将标签合并到HEAD上,并且可以选择编辑合并提交的消息。m
fixup类似于"squash",但仅保留前一个提交的日志消息,除非使用了-C,这种情况下仅保留当前提交的消息;-c-C 相同,但会打开编辑器。f

四、从A分支选择N次提交,合并到B分支


如标题所示,目的是从A分支拣取某几次提交到B分支,可使用命令 git cherry-pick

假设在A分支上提交了三次,三次的hash分别是 A1、A2、A3, 现在我们要把 A2、A3 提交合并到B分支上,需要执行的命令如下:

-- 1、切换到B分支
git checkout B

-- 2、把A2、A3 提交合并过来
git cherry-pick A2 A3

-- 3、提交代码
git push

正常流程就是上面这样,但合并代码总面临着冲突,如果冲突了就会显示下面的异常

在这里插入图片描述


冲突了的解决办法有两个


方式一

取消这次的操作 git cherry-pick --abort


方式二

解决冲突

-- 1、先手动解决冲突

-- 2、添加修改
git add .

-- 3、在解决冲突后继续执行git cherry-pick命令 、 会弹出一个文件,可以修改commit的描述,也可以直接关闭
git cherry-pick --continue

-- 4、push代码
git push

在这里插入图片描述

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

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

相关文章

研报精选230528

目录 【行业230528华金证券】传媒行业深度研究:AIGC最新应用与场景研究 【行业230528国海证券】电动船舶行业深度报告:绿色智能大势已至,驶向电化百亿蓝海 【行业230528华西证券】纺织服装行业周报:5月增长放缓无碍中长期出清逻辑…

Linux下的yum和vim

目录 一、Linux软件包管理器yum1.1 何为软件包?1.2 rzsz工具1.3 如何安装和卸载软件?1.4 Linux的软件生态 二、vim文本编辑器 一、Linux软件包管理器yum 1.1 何为软件包? 软件包可以理解成是windows下别人提前编译好的安装包程序&#xff0…

任务7 课程信息管理系统

系列文章 任务7 课程信息管理系统 已知课程的信息包括:课程编号,课程名称,课程性质(必修、选修),课时,学分,考核方式(考试、考查课),开课学期&a…

day41_servlet

今日内容 零、 复习昨日 一、Cookie 二、Session 三、拦截器 四、登录认证、全局编码格式 零、 复习昨日 注解 热部署 请求转发 重定向 路径问题 总结使用经验: 无论请求路径是多层是单层,在写路径时都从/开始,即从根开始如果是服务器动作,从/开始直接写如果是浏览器动作,从/开…

CVPR 2018 | Spotlight论文:单摄像头数秒构建3D人体模型

想把自己的身体形象投射进电子游戏里?现在已经是很容易的事了。人工智能算法此前已被广泛应用于虚拟现实头像、监视、服装试穿或电影等多种任务的人体建模上,但大多数方法需要特殊的照相设备来检测景深,或从多个角度探查人体。近日,来自德国布伦瑞克工业大学和 Max Planck …

js获取Element元素的常用方法

js中获取Element元素的常用方法有以下四种: 【方法一】根据元素ID:document.getElementById() 【方法二】根据元素标签:document.getElementsByTagName() 【方法三】根据元素class名:document.getElementsByClassName() 【方法…

yolov5刚开始train时的环境问题

torch会自动被requirement.txt替换 在对yolov5_5.0进行pip install requirement.txt后,yolo5_5.0会将虚拟环境中中的torch替换为2.0.1版本的,但要注意查看该torch是否为gpu版本,查看方式如下:打开Anaconda Prompt,激活…

渗透测试 | 端口扫描

0x00 免责声明 本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担…

推荐系统算法详解

文章目录 基于人口统计学的推荐算法用户画像 基于内容的推荐算法相似度计算基于内容推荐系统的高层次结构特征工程数值型特征处理类别特征处理时间型特征处理统计型特征处理 推荐系统常见反馈数据基于UGC的推荐TF-IDFTF-IDF算法示例1. 引入依赖2. 定义数据和预处理3. 进行词数统…

12.区块链系列之比特币NFT

1. NFT协议Ordinals 2023年1月30日,比特币核心开发者Casey Rodarmor创建了NFT协议Ordinals Ordinals序数: 比特币的最小单位是Satoshi聪,1BTC1亿聪,每个聪的比特币都是同质化代币,它们之间并没有任何差别。Ordinals给聪打上了编号&#xff0…

vue3项目创建步骤,以及项目运行失败的原因和解决方法

vue3项目创建步骤,以及项目运行失败的原因和解决方法 vue3项目创建前提:搭建node.js环境第一步:创建一个空文件夹第二步:打开空文件夹,如图所示第三步:在此输入cmd,并按下回车键,进入…

Mysql面试必知的知识点-干货分享

文章目录 底层索引为什么使用B树,而不用B树?为什么Innodb索引建议必须建主键?为什么主键推荐使用整形自增?Mysql底层索引只有B树吗?联合索引底层长什么样子?数据库隔离级别中串行化是怎么实现的?查询方法需要加事务吗?大事务有什么影响? 底层索引为什么使用B树,而不用B…

Ai时代降临,我们的未来又在哪里?

文章目录 背景AI智能迭代进步码农的未来展望借助gpt快速成长总结 背景 随着人工智能的不断发展,自然语言处理技术也一直在不断的进步和发展,GPT(Generative Pre-trained Transformer)模型作为自然语言处理领域最前沿的技术之一&a…

什么是Redission可重入锁,其实现原理是什么?

一、概述 Redission是一个可重入锁,它可以在分布式系统中用于实现互斥锁。这种锁可以允许多个线程同时获取锁,但在任何给定时间只有一个线程可以执行受保护的代码块。 Redission锁提供了一种简单的方法来保证在分布式系统中的互斥性,同时支…

chatgpt赋能python:Python中的父类方法和super函数

Python中的父类方法和super函数 在Python中,我们经常会涉及到继承父类的方法和属性。当我们在子类中重写一个父类方法时,有时我们需要在子类方法中访问父类方法,可以使用Python的内置函数super()来实现。 什么是父类方法 在面向对象编程中…

runway gen2

来自Runway文生成视频ai大模型Gen-2_哔哩哔哩_bilibili来自Runway文生成视频ai大模型Gen-2,距离视频制作自由又近了一步。, 视频播放量 1651、弹幕量 0、点赞数 21、投硬币枚数 2、收藏人数 42、转发人数 22, 视频作者 旭升说, 作者简介 一起聊下互联网的那些事&…

10大白帽黑客专用的 Linux 操作系统

平时在影视里见到的黑客都是一顿操作猛如虎,到底他们用的都是啥系统呢? 今天给大家分享十个白帽黑客专用的Linux操作系统。 ▍1. Kali Linux Kali Linux是最著名的Linux发行版,用于道德黑客和渗透测试。Kali Linux由Offensive Security开发&…

[k8s]Kubernetes简介

文章目录 Kubernetes介绍术语Label StatefulSet 存储类VolumePersistent Volume IP地址Node IPPod IPService Cluster IPExternal IP PodPod定义Pod生命周期与重启策略NodeSelector(定向调度)NodeAffinity(亲和性调度)PodAffinity…

164. 最大间距

题目描述&#xff1a; 主要思路&#xff1a; 利用桶排序的思路&#xff0c;取最大最小值的差值/个数&#xff0c;答案一定是大于等于这个数的&#xff0c;每个块为一个桶&#xff0c;维护这个桶内的最大最小值。 class Solution { public:int maximumGap(vector<int>&a…

【软件开发】Redis 理论篇(一)

Redis 理论篇&#xff08;一&#xff09; 一、概述 1.什么是 Redis&#xff1f; Redis 是一个使用 C 语言写成的&#xff0c;开源的高性能 Key-Value 非关系缓存数据库。它支持存储的 Value 类型相对更多&#xff0c;包括 string&#xff08;字符串&#xff09;、list&#x…