git高级特性之 - cherry-pick

2023-10-31

背景

在开发过程中,我们一般会使用多分支来管理开发。在特殊情况下,其中一个分支的改动,我想搬到我的另一个分支(它会作为一个新的提交引入到你当前分支上),关于这种操作,如果使用git 的话,那就可以做到了,这就是我们这篇博客想要介绍的 git cherry-pick 高级特性。

介绍

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

首先看下官方介绍: 运行下面的命令

git help cherry-pick

基本语法:

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff]
		  [-S[<keyid>]] <commit>…​
git cherry-pick --continue
git cherry-pick --quit
git cherry-pick --abort

其中:
-n, --no-commit       不自动提交
-e, --edit            编辑提交信息

配置项

git cherry-pick命令的常用配置项如下。

-e,–edit

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

-n,–no-commit

只更新工作区和暂存区,不产生新的提交。

-x

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

-s,–signoff

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

-m parent-number,–mainline parent-number

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

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

git cherry-pick -m 1 <commitHash>

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

一般来说,1号父分支是接受变动的分支(the branch being merged into),2号父分支是作为变动来源的分支(the branch being merged from)。

实践案例

自动提交

如果没有出现冲突,该命令将自动提交。

git cherry-pick <commit_id>

当cherry-pick时,没有成功自动提交,这说明存在冲突,因此首先需要解决冲突,解决冲突后需要git commit手动进行提交;
或者git add .后直接使用git cherry-pick --continue继续。

不自动提交

参数 -n,–no-commit
只更新工作区和暂存区,不产生新的提交。

git cherry-pick -n <commit_id>

增加额外说明信息

git cherry-pick -x <commit_id>

在原来的提交信息下,增加一行额外说明信息(cherry picked from commit …),用来说明该次commit是从哪里cherry-pick的。
如果是从自己的私人分支之间做这个操作,就不要使用这个,这样的信息是无用的。
如果是cherry-pick别的同事的提交,可以使用这个参数,这个额外信息将非常有用。

重新编辑提交信息

如果想要在cherry-pick后重新编辑提交信息,则使用git cherry-pick -e命令

git cherry-pick -e <commit_id>

有冲突的情况

如果在执行git cherry-pick时遇到冲突,一般会有下面的几种提示:

git cherry-pick --continue
git cherry-pick --quit
git cherry-pick --abort

如果要继续cherry-pick,则首先需要解决冲突,通过git add .将文件标记为已解决,然后可以使用git cherry-pick --continue命令,继续进行cherry-pick操作。

如果要中断这次cherry-pick,则使用git cherry-pick --quit,这种情况下当前分支中未冲突的内容状态将为modified,

如果要取消这次cherry-pick,则使用git cherry-pick --abort,这种情况下当前分支恢复到cherry-pick前的状态,没有改变。

cherry-pick分支

git cherry-pick <branchname>

如果在git cherry-pick后加一个分支名,则表示将该分支最近一次提交,转移到当前分支。

一次pick连续的多个提交

语法如下:

git cherry-pick <commit_id_0>..<commit_id_n>

中间的两个点,表示把两个commit区间的所有commit都复制过去。
注意:
上面的操作,不会包含第一个commit_id_0,即只会复制(commit_id_1 到 commit_id_n)。
所以使用时,记得算好第一个commit id。

如果要包含第一个commit_id_0提交,可以使用下面的语法:

git cherry-pick <commit_id_0>^..<commit_id_n>

注意,多了一个符号^

转移到另一个代码库

Cherry pick 也支持转移另一个代码库的提交,方法是先将该库加为远程仓库。

git remote add target git://gitUrl

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

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

git fetch target

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

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

git log target/master

最后,使用git cherry-pick命令转移提交。

git cherry-pick <commitHash>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git高级特性之 - cherry-pick 的相关文章

随机推荐

  • Puppeteer开发过程中遇到的问题及解决方案

    最新出了一个BUG 最新版的安装之后在MacOS M1芯片无法打开新窗口 工欲善其事必先利其器 请先检查本机是否安装NodeJS环境以及查阅API Google官方文档 https developers google com web too
  • Linux svn 命令每次都要输入密码o(╯□╰)o

    环境 Ubuntu 20 04 服务器ssh远程登录 所以运行不了钱包之类的图形工具管理密码 subversion 1 13 验证可行的步骤 1 删除原来的配置 rm subversion rf 2 执行一次svn命令输入密码后 会在目录
  • 为什么int类型可以直接赋值给char类型?

    1 为什么int类型变量不能直接赋值给char类型变量 char a 97 gt a 为char类型变量 a 赋值常量值 97 char b a 3 gt d 97 3 100 ASCII对应的字符为 d char c a 3 gt 报错
  • 入门:使用MySQL Workbench新增MySQL数据库并授权给新用户

    一 新增用户 打开MySQL Workbench可视化工具 点击左侧菜单的 Users and Privileges 链接 再点击右侧界面下方的 Add Account 按钮 输入新用户名 user kagome 主机连接地址 表示从任何地
  • 使用webpack打包的单页面项目如何设置favicon.icon文件

    上一篇文章 如何给网站设置favicon ico图标 介绍了favicon ico是什么 怎么配置 有哪几种方式 但发现webpack打包的单页面项目却与普通项目不同 所以这篇文章介绍一下使用webpack打包的单页面项目如何设置favic
  • 详解nginx服务器绑定域名和设置根目录的方法

    主要介绍了详解nginx服务器绑定域名和设置根目录的方法 nginx服务器绑定域名以及设置根目录非常方便 小 编觉得挺不错的 现在分享给大家 也给大家做个参考 一起跟随小编过来看看吧 nginx服务器绑定域名以及设置根目录非常方便 首先进入
  • COSCon'20 开源硬件论坛&深圳开源聚会

    COSCon开源硬件论坛 发轫于2018 软硬同台 共享大开源 共生于2019 多元携手 共筑源生态 开源硬件生态的可持续 更需要产业落地前行 今年 在制造业行业固有困难凸显和全球贸易多方遭受冲击的影响下 开源硬件论坛将同大家一起聚焦探索开
  • K-Means聚类算法

    K Means聚类算法 k means算法又名k均值算法 K means算法中的k表示的是聚类的k个簇 means代表取每一个聚类中数据值的均值作为该簇的中心 或者称为质心 即用每一个聚类的质心对该簇进行描述 其算法思想大致为 先从样本集中
  • 用scala 写spark程序

    scala sdk下载地址 https downloads lightbend com scala 2 12 0 scala 2 12 0 zip scala eclipse 下载地址 http downloads typesafe com
  • window下最新版的EMQX4.4.3服务器的搭建和用户名密码的设置

    一 下载EMQX软件包 下载 EMQX 开源版 EMQX 二 解压 我放到D盘下 测试必须是根目录 三 通过命令窗口进入bin目录 输入 emqx start 四 打开浏览器输入 127 0 0 1 18083 五 打开mqttfx 设置客
  • Leetcode 220. Contains Duplicate III (Sliding window + set)

    Contains Duplicate III Hard You are given an integer array nums and two integers indexDiff and valueDiff Find a pair of
  • C++ 智能指针与陷阱

    Smart Pointer 启示录 爲什麽要使用智能指針 智能指針的致命弱點 1 重複刪除 2 無法分享 this 指針 3 内存泄漏 啓發 爲什麽要使用智能指針 C 11 带来了几个比较重要且实用的新特性 smart pointers 就
  • 【chineseocr_lite】OCR结果原位置输出

    直接上效果图 原来效果 字体下载路径 https github com sonatype maven guide zh raw master content zh src main resources fonts simsun ttc mo
  • Mac 终端连接linux程服务器并相互传输文件

    连接远程Linux ssh p 22 用户名 ip地址 然后输入密码即可 从本地上传到远程 scp 本机地址 远程主机用户 远程ip 远程文件地址 从远程传输文件到本地 scp 远程主机用户 远程ip 远程文件地址 本机地址 如 scp r
  • springmvc+log4j.xml操作日志记录,详细配置

    原文地址 http www cnblogs com v weiwang p 4814050 html 参考地址 http rockelixir iteye com blog 1902352 需要导入包 log包 log4j 12 17 ja
  • 细粒度车型识别项目(基于DenseNet201, 数据集Stanfordcars-196,准确率:94.13%)

    之前做的一个细粒度车型识别项目 数据集 斯坦福大学公开细粒度车型识别数据集 196类 测试准确率达到94 13 深度学习框架 pytorch 下面是部分代码文件 有需要的联系我 wx cx157021
  • Linux不同方式安装卸载软件包如何区分(二进制、源码、rpm、yum)

    后续案例补充 二进制安装 源码安装 yum安装 rpm安装 描述 二进制包里面包括了已经编译完成 可以直接运行的程序 可以说相当于源码编译后打包 源代码包里面包括了程序原始的程序代码 需要在计算机上编译以后才可以产生可运行程序 从软件仓库安
  • Java中接口和抽象类有什么区别

    题目 请问Java中接口和抽象类有什么区别 解答 1 先看接口和抽象类的概念 接口是Java编程语言中的抽象类型 是抽象方法的集合 抽象类是一个类中含有抽象方法 抽象类前面用abstract关键词修饰 2 再说接口和抽象类间区别 接口可以含
  • MySQL的主键和外键

    使用 MySQL必知必会 中的表 向表products插入数据出错 从报错信息看 应当是表的主键和外键的问题 先用show create table products查看表products的创建信息 外键关系涉及一个包含中心数据值的父表 以
  • git高级特性之 - cherry-pick

    文章目录 背景 介绍 配置项 e edit n no commit x s signoff m parent number mainline parent number 实践案例 自动提交 不自动提交 增加额外说明信息 重新编辑提交信息 有