Git cherry-pick详解

news2024/9/20 13:17:01

文章目录

    • 基本用法
    • 引入多个提交
    • 代码冲突解决
    • 引入分支所有提交
    • 引入另一个代码库提交
    • 常用配置
    • 常见问题

对于多分支的代码库,将代码从一个分支引入到另一个分支是常见需求。

这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 cherry-pick

基本用法

git cherry-pick 命令的作用,就是将指定的提交(commit)应用于其他分支。

git cherry-pick <commitHash>

上面命令就会将指定的提交commitHash,应用于当前分支。这会在当前分支产生一个新的提交,当然它们的哈希值会不一样。

举例来说,代码仓库有master和feature两个分支。

    a - b - c - d   Master
         \
           e - f - g Feature

现在将提交f应用到master分支。

# 切换到 master 分支
git checkout master

# cherry-pick 操作
git cherry-pick f

上面的操作完成以后,代码库就变成了下面的样子。

    a - b - c - d - f   Master
         \
           e - f - g Feature

从上面可以看到,master分支的末尾增加了一个提交f。

git cherry-pick命令的参数,不一定是提交的哈希值,分支名也是可以的,表示引入该分支的最新提交。

git cherry-pick feature

上面代码表示将feature分支的最近一次提交,引入到当前分支。

引入多个提交

cherry-pick 支持一次引入多个提交。

git cherry-pick <HashA> <HashB>

上面的命令将 A 和 B 两个提交应用到当前分支。这会在当前分支生成两个对应的新提交。

如果想要引入一系列的连续提交,可以使用下面的简便语法。

git cherry-pick A..B 

上面的命令可以引入从 A 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。

注意,使用上面的命令,提交 A 将不会包含在 cherry-pick 中。

代码冲突解决

如果操作过程中发生代码冲突,cherry-pick 会停下来,让用户决定如何继续操作。

  • --continue

    用户解决代码冲突后。第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 cherry-pick 过程继续执行。

    git cherry-pick --continue
    

    或者第二步使用命令git commit进行手动提交。

  • --abort

    发生代码冲突后,放弃合并,当前分支恢复到cherry-pick 操作前的状态,没有改变。

  • --quit

    代码冲突后,退出 cherry-pick,但是不回到操作前的样子,当前分支中未冲突的内容状态将为modified。

  • --skip
    则会将引起冲突的commits丢弃掉(慎用!!)

引入分支所有提交

git cherry-pick ..<branchname>
git cherry-pick ^HEAD <branchname>

Apply the changes introduced by all commits that are ancestors of master but not of HEAD to produce new commits.

翻译过来就是:

应用作为主提交祖先而不是HEAD祖先的所有提交引入的更改来生成新的提交。

晦涩难懂…。

我个人理解是,将需要合并的分支的本身的所有commit都引入到当前分支上,形成新的commitHash。不包含该分支创建时及之前的commit。

说了这么多,都不如来个例子。

查看当前分支情况

git branch

输出:
  dev
* master

可以看到当前总共有dev和master两个分支。当前检出的为master分支。

获取git log

git log --all --oneline --graph

输出:
* 190f801 (HEAD -> master, origin/master, origin/HEAD) dev change5
* 0a71a6f dev change4
| * 2517b59 (origin/dev, dev) dev change10
| * 9ccf435 dev change9
| * c8a29d9 dev change8
| * b1b3412 dev change7
| * d42d188 dev change6
| * f48f86c dev change5
| * 4d8d588 dev change4
| * 79da3ff dev change3
| * 7c8f4d5 dev change2
| * 57aaac6 dev change1
|/
* 6347c46 Initial commit

可以看到dev有10个change行为提交。

执行cherry-pick命令

git cherry-pick ..dev

git log --all --oneline --graph

输出:
* ccd075b (HEAD -> master, origin/master, origin/HEAD) dev change10
* a63fe03 dev change9
* 306f58f dev change8
* a020794 dev change7
* 6b3e7e4 dev change6
* f17a761 dev change5
* 16f37ac dev change4
* f72518c dev change3
* f97ccf7 dev change2
* f2d5f7e dev change1
* 190f801 dev change5
* 0a71a6f dev change4
| * 2517b59 (origin/dev, dev) dev change10
| * 9ccf435 dev change9
| * c8a29d9 dev change8
| * b1b3412 dev change7
| * d42d188 dev change6
| * f48f86c dev change5
| * 4d8d588 dev change4
| * 79da3ff dev change3
| * 7c8f4d5 dev change2
| * 57aaac6 dev change1
|/
* 6347c46 Initial commit

可以看到,dev分支上,从change1至change10的commit,均引入到master分支上,形成新的commitHash。而dev分支创建之前的commit,即Initial commit没有引入,这是它们共同的祖先节点。

引入另一个代码库提交

cherry-pick 也支持引入另一个代码库的提交,方法是先将该库加为远程仓库。

git remote add target gitUrl

上面命令添加了一个远程仓库target。

然后,将远程代码抓取到本地。

git fetch target

上面命令将远程代码仓库抓取到本地。

接着,检查一下要从远程仓库引入的提交,获取它的哈希值。

git log target/master --oneline 

最后,使用git cherry-pick命令引入提交。

git cherry-pick <commitHash>

常用配置

  1. -e--edit

    打开外部编辑器,编辑提交信息。

    如果想要在cherr-pick时重新编辑提交信息,则使用git cherry-pick <commitHash> -e命令。

  2. -n--no-commit

    如果不想cherry-pick自动进行提交,则加参数-n即可。引入的文件内容将放在暂存区,不产生新的commit。

  3. -x

    在提交信息的末尾追加一行(cherry picked from commit …),方便以后查到这个提交是如何产生的。

  4. -s--signoff

    在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。

  5. -m parent-number--mainline parent-number

    如果原始提交是一个合并节点,来自于两个分支的合并,那么 cherry-pick 默认将失败,因为它不知道应该采用哪个分支的代码变动。

    -m 配置项告诉 Git,应该采用哪个分支的变动。它的参数parent-number是一个从1开始的整数,代表原始提交的父分支编号。

    git cherry-pick -m 1 <commitHash>
    

    上面命令表示,cherry-pick 采用提交commitHash来自编号1的父分支的变动。

    一般来说,1号父分支是作为变动来源的分支,2号父分支是接受变动的分支。

常见问题

  1. The previous cherry-pick is now empty, possibly due to conflict resolution.

    原因:

    cherry-pick时出现冲突,解决冲突后本地分支中内容和cherry-pick之前相比没有改变,因此当在以后的步骤中继续git cherry-pick或执行其他命令时,由于此时还处于上次cherry-pick进程中,就会提示该信息,表示可能是由于解决冲突造成上一次cherry-pick内容是空的。

    解决方案:

    1. 执行git cherry-pick --abort取消上次操作。

    2. 执行git commit --allow-empty,表示允许空提交。此步骤极不推荐,极可能会造成git可视化工具显示历史提交记录出现问题。

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

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

相关文章

Linux命令rsync增量同步目录下的文件

业务场景描述 最近遇到一个问题&#xff0c;需要编写相应的Linux命令&#xff0c;增量同步/var/mysql里的所有文件到另外一个目录/opt/mysql&#xff0c;但是里面相关的日志文件xx.log是不同步的&#xff0c;这个场景&#xff0c;可以使用rsync来实现 什么是rsync命令&#x…

【Linux】冯诺依曼体系及操作系统

本期博客我们将深入学习操作系统的架构 目录 一、冯诺依曼体系结构 二、操作系统(Operator System) 2.1 操作系统的引入 2.2 操作系统的概念 2.3 操作系统的定位 2.4 深度理解操作系统的管理 2.5 系统调用和库函数概念 一、冯诺依曼体系结构 冯诺依曼体系这个名词相信…

webpack5搭建react框架-配置优化

webpack5搭建react框架-配置优化 一、前言 使用webpack5已经搭建好了基础的开发环境和生产环境&#xff0c;但是有些功能在使用的时候还可以进一步优化&#xff0c;所以今天就来将之前的配置做一下最终的优化。 二、配置优化 1、设置扩展名和别名 目前的配置中我们在引入一…

Java泛型之通配符类型

1. 案例分析 class Animal {Overridepublic String toString() {return "animal";} }class Cat extends Animal {Overridepublic String toString() {return "cat";} }class Dog extends Animal {Overridepublic String toString() {return "dog&quo…

2023/4/25

今天主要重新复习了一下树的基础知识&#xff0c;对于树的遍历和深度的求解进行了一些训练&#xff08;复习了一下写过的题&#xff09; 刷了两个关于树的简单题 104. 二叉树的最大深度 难度简单1586收藏分享切换为英文接收动态反馈 给定一个二叉树&#xff0c;找出其最大深度…

mysql的读提交与可重复读

前景介绍 隔离级别脏读可能性不可重复读可能性幻读可能性加读锁READ UNCOMMITTEDYESYESYESNOREAD COMMITTEDNOYESYESNOREPEATABLE READNONOYESNOSERALIZABLENONONONO mysql事务 READ COMMITTED 时间事务1事务2事务3T1beginbeginbeginT2update wx_va set value “TT1” wher…

数据库基础篇 《13.约束》

1. 约束(constraint)概述 1.1 为什么需要约束 数据完整性&#xff08;Data Integrity&#xff09;是指数据的精确性&#xff08;Accuracy&#xff09;和可靠性&#xff08;Reliability&#xff09;。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成…

Windows10下安装Ubuntu22.04(打造双系统)步骤 + 安装Nvidia显卡驱动

文章目录 下载Ubuntu22.04制作Ubuntu安装盘对硬盘分区查看磁盘分区形式 安装Ubuntu关于无法定位软件包错误安装显卡驱动 训练神经网络常用Lunix系统&#xff0c;这里使用Ubuntu22.04。 记录一下Windows10Ubuntu双系统安装方法。 下载Ubuntu22.04 下载链接&#xff1a;Ubuntu …

【Linux】一文读懂HTTP协议:从原理到应用

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录 &#x1f449;HTTP协议…

如何提高项目估算精准度 关键有3方面

软件规模可以用多种方式进行估算&#xff0c;但是用功能点估算方式更准确&#xff0c;而自动估算让估算更快速&#xff0c;我们以CoCode需求分析工具为例来说明&#xff0c;如何提高项目估算精准度&#xff1f; 一、调整功能点数 要提高项目估算精准度&#xff0c;首先应该提高…

Pytorch 入门资源(一) annaconda3下安装pytorch2.0.0和python3.11,使用Pycharm编辑器环境配置

一、环境安装 用annaconda3-2023.03-windows_x86_64&#xff0c;安装上python3.11和pytorch2.0.0环境。 下载pycharm community版本&#xff0c;将pycharm环境选择到pytorch&#xff0c;就可以开始上手Pytorch了。 指路几个安装博客&#xff1a; 【ok】Anaconda3的安装配置…

springcloud的项目使用一个tomcat部署

背景 我们项目使用springcloud、redis&#xff08;缓存&#xff09;、rocketMQ&#xff08;消息中间件&#xff09;、tinyid&#xff08;分布式id&#xff09;、minio&#xff08;文件存储&#xff09;、nacos&#xff08;配置注册中心&#xff09;这些组件开发了一个mes系统&…

YOLOv7+单目实现三维跟踪(python)

YOLOv7单目跟踪 1. 目标跟踪2. 测距模块2.1 设置测距模块2.2 添加测距 3. 主代码4. 实验效果 相关链接 1. YOLOv5单目测距&#xff08;python&#xff09; 2. YOLOv7单目测距&#xff08;python&#xff09; 3. YOLOv5单目跟踪&#xff08;python&#xff09; 4. 具体效果已在B…

中期国际:值得信赖的外汇MT4开户平台应该具备那些特点

在外汇市场中&#xff0c;有许多外汇平台供投资者选择。然而&#xff0c;由于市场存在许多复杂因素&#xff0c;选择平台时必须谨慎。投资者必须选择具有可靠资质的正规外汇MT4开户平台&#xff0c;以提高投资的安全性。选择外汇MT4开户平台非常重要&#xff0c;因此&#xff0…

LVS负载均衡群集—NAT

目录 一、群集的概述1、群集的含义2、出现高并发的解决方法3、群集的三种分类3.1负载均衡群集3.2高可用群集3.3高性能运算群集 4、负载均衡的结构 三、LVS调度器用的调度方法四、LVS的工作模式及其工作过程1.NAT模式&#xff08;VS-NAT&#xff09;2.直接路由模式&#xff08;V…

springboot整合juit和springboot整合mybatis

springboot整合juit 先看一眼包路径&#xff0c;发现main程序的路径和测试类的路径是一样的 启用新注解&#xff1a;SpringBootTest代替了之前sm整合juit时的 RunWith(SpringJUnit4ClassRunner.class) //spring配置类 ContextConfiguration(classes config.class)新的如此…

protoc 插件-protoc-gen-grpc-gateway-gosdk

&#x1f447;我在这儿 基本介绍 protoc-gen-grpc-gateway-gosdk 是一个 protoc 插件, 能根据 proto 文件一键生成 go http sdk 客户端代码&#xff0c;通过借助 grpc-gateway 插件将 grpc 接口转化为 http 的方式, 进而可以通过本插件生成 http sdk 代码。 特性 1.一键自动生…

springboot整合cache+redis

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、cache是什么&#xff1f;二、使用步骤1.使用方式1.引入依赖2.搭建项目依赖问题application.ymlTestControllerTestServiceTestServiceImplUserMapperMyRedi…

使用vue.component全局注册组件、props的使用

通过components注册的是私有子组件 例如&#xff1a; 在组件A的 components 节点下&#xff0c;注册了组件F。 则组件F只能用在组件A中;不能被用在组件C中。 注册全局组件 在vue项目的 main.js 入口文件中&#xff0c;通过 Vue.component() 方法&#xff0c;可以注册全局组件…

数据结构和算法学习记录——平衡二叉树(基本介绍、平衡因子、平衡二叉树的定义、平衡二叉树的高度)

目录 基本介绍 平衡因子 平衡二叉树 平衡二叉树的高度 基本介绍 什么是平衡二叉树&#xff1f; 以一个例子来解释一下&#xff1a; 搜索树结点按不同的插入次序&#xff0c;将会导致不同的深度和平均查找长度ASL 在二叉搜索树中查找一个元素&#xff1a; &#xff08…