Git Cherry-pick使用
概述
无论项目大小,当你和一群程序员一起工作时,处理多个 Git 分支之间的变更都会变得很困难。有时,与其把整个 Git 分支合并到另一个分支,不如选择并移动几个特定的提交。这个过程被称为 "挑拣", 即 Cherry-pick。
本文将介绍 "Cherry-pick" 的内容、原因和方法。
让我们开始吧~
什么是 Cherry-pick?
通过 cherry-pick
命令,Git 可以将任何分支中的选定提交合并到当前的 Git HEAD 分支中。
在执行 git merge
或 git rebase
时,一个分支的所有提交都会被合并。而 cherry-pick
命令则允许你选择单个提交进行整合。
区别图示如下:
△ 使用 merge 的情况: 在执行 merge 或 rebase 时,一个分支的所有提交都会被整合。
△ 使用 cherry-pick 的情况: 允许你选择个别提交进行整合。在本例中,只有 C2 被整合到主分支,而不是 C4。
为什么要用 Cherry-pick?
下面的情况可能更容易理解 "Cherry-pick" 的作用。
想象一下,您正在为即将到来的每周 spring 实施新功能。代码准备就绪后,您将把它推送到远程分支,准备进行测试。
然而,客户并不满意所有的修改,要求你只提交某些修改。因为客户还没有批准下次发布的所有修改,所以 git rebase
不会产生预期的结果。因为 git rebase
或 git merge
会将上一次冲刺的所有调整都纳入其中。
而 "Cherry-pick" 就能解决这个问题!因为 "Cherry-pick" 只关注提交中添加的改动,所以它只会带来已批准的改动,而不会添加其他提交。
使用 "Cherry-pick" 还有其他一些原因:
- 这对修复 bug 非常重要,因为开发分支中的 bug 都是用它们的提交设置的。
- 通过使用
git cherry-pick
,而不是其他应用指定提交的改动的选项(如git diff
),可以避免不必要的争斗。 - 如果因为各 Git 分支的版本不兼容而无法进行完整的分支合并,它就是一个很有用的工具。
什么时候用 Cherry-pick?
简而言之就是:尽量少用。之所以要尽量少用 cherry-pick,是因为它很容易产生 "重复"提交:当你使用 cherry-pick 将一个提交整合到 HEAD 分支时,Git 必须创建一个内容完全相同的新提交。不过,这是一个全新的提交对象,有自己的 SHA 标识符。同时也会失去跟踪提交历史的能力。
如果你不按顺序提交了很多提交,这些提交就会被记录在你的分支中,这可能会导致你的 Git 分支出现不理想的结果。
只要能用传统的合并或重置来整合,就应该这么做。Cherry-pick 应保留给不可能这样做的情况,例如必须创建 Hotfix 或只想从一个废弃的分支中保存一个或几个提交。
如何使用 Cherry-pick 命令?
流程概述
下面是使用步骤:
- 拉取本地分支。使用
git fetch
。 - 回到要合并的分支。你可能会通过运行
git checkout main
来做到这一点。 - 找到要拉入分支的提交。转到
git log
,为每条提交获取唯一的提交哈希值。 - "Cherry-pick" 您想要加入该分支的提交。运行以下命令:
git cherry-pick <commit sha>
。这将只把这个提交拉入当前分支。 - (可选) 在某些情况下, 可能需要手动解决冲突.
- 像往常一样推送这个分支:
git push origin main
。
具体命令
在 cherry-pick
命令的最简单形式中,你只需使用要集成到当前 HEAD 分支中的提交的 SHA 标识符即可。
要获取提交哈希值,可以使用 git log
命令:
git log --oneline
知道 commit 的哈希值后,就可以使用 cherry-pick
命令。
语法如下:
git cherry-pick <commit sha>
📝Notes:
<commit sha>
可以是多个
例如:
git cherry-pick 85c5532
这将把指定的更改专用于当前已签出的分支。
如果你想做进一步修改,也可以指示 Git 在你的工作副本中添加提交改动。
语法如下:
git cherry-pick <commit sha> --no-commit
如:
git cherry-pick 85c5532 --no-commit
如果您想同时选择多个提交,请添加它们的提交哈希值,中间用空格隔开:
git cherry-pick hash1 hash3
在挑选提交时,不能使用 git pull
命令,因为它会从一个版本库中获取提交并自动合并到另一个版本库中。cherry-pick
命令是专门用来避免这种情况发生的工具;取而代之的是使用 git fetch
,它会获取提交但不应用它们。
Cherry-pick 实战
要尝试该过程,请启动终端并生成一个示例项目:
mkdir fruit.git
cd fruit.git
git init .
创建一些数据并提交:
echo "Kiwifruit" > fruit.txt
git add fruit.txt
git commit -m 'First commit'
现在,创建一个项目的 fork 来代表远程开发者:
mkdir ~/fruit.fork
cd !$
echo "Strawberry" >> fruit.txt
git add fruit.txt
git commit -m 'Added a fruit"
这是一个有效的提交。现在,创建一个糟糕的提交,代表你不想合并到项目中的内容:
echo "Rhubarb" >> fruit.txt
git add fruit.txt
git commit -m 'Added a vegetable that tastes like a fruit"
返回你的权威版本库,从你假想的开发者那里获取提交(使用 git fetch
获取):
$ cd ~/fruit.git
$ git remote add dev ~/fruit.fork
$ git fetch dev
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done...
$ git log –oneline dev/master
e858ab2 Added a vegetable that tastes like a fruit
0664292 Added a fruit
b56e0f8 First commit
你已经从假想的开发者那里获取了提交,但还没有将它们合并到你的版本库中。你想接受第二个提交,但不想接受第三个,所以要使用 cherry-pick
:
git cherry-pick 0664292
现在,第二个提交就在你的版本库中:
$ cat fruit.txt
Kiwifruit
Strawberry
将更改推送到远程服务器,就大功告成了!
Cherry-pick 多个提交实战
从 dev 挑选数个 commits 进行合并:
git cherry-pick 85c5532 366a196 53ebe44 --no-commits
然后, 可能第一个合并会出现冲突, 手动解决冲突, 并git add
具体文件或 git rm
.
继续 cherry-pick:
git cherry-pick --continue
第二个提交可能没有冲突, 直接合并.
第三个提交可能又有冲突, 手动解决冲突, 并git add
具体文件或 git rm
.
继续 cherry-pick:
git cherry-pick --continue
最后再执行 git cherry-pick --continue
, 会提示你没有在运行的任务.
此时, 可以提交:
git push origin main
总结
Cherry-pick 是一个功能强大的命令,如果没有正确理解可能发生的情况,使用它可能会带来麻烦。不过,当你搞砸并提交到错误的分支时,它可能会拯救你的生命(至少是你的日常工作)。
📚️参考文档
- What is Git cherry-picking? | Opensource.com
- How to merge only specific commits from a pull request with git cherry-pick | MattStauffer.com
- Git Cherry Pick - How to use the "cherry-pick" command in Git | Learn Version Control with Git
三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.
相关文章:

Git Cherry-pick使用
概述 无论项目大小,当你和一群程序员一起工作时,处理多个 Git 分支之间的变更都会变得很困难。有时,与其把整个 Git 分支合并到另一个分支,不如选择并移动几个特定的提交。这个过程被称为 "挑拣", 即 Cherry-pick。 本…...

红帽8.5 ansible 安装和部署 |(简单版)
什么是ansible Ansible是一款基于OpenSSH开源的自动化运维工具,可以用它来配置系统、部署软件和编排更高级的 IT 任务,并且使用具有极高的安全性,ansible是当前市面上主流的自动化运维工具之一 为什么使用ansible 比较直观的说,…...

Visual Studio 2019 c++ 自定义注释 ----doxygen
可加入C 也可自定义。 <?xml version"1.0" encoding"utf-8"?> <CodeSnippets xmlns"http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"><CodeSnippet Format"1.0.0"><Header><Title>注释…...

面试题. 零矩阵
编写一种算法,若M N矩阵中某个元素为0,则将其所在的行与列清零。 示例 1: 输入: [[1,1,1],[1,0,1],[1,1,1] ] 输出: [[1,0,1],[0,0,0],[1,0,1] ] 示例 2: 输入: [[0,1,2,0],[3,4,5,2],[1,3…...

易语言下载器
静态网站整站下载器 https://bbs.125.la/forum.php?modviewthread&tid14791313&highlight%E4%B8%8B%E8%BD%BD%E5%99%A8 易语言 之音乐下载器 https://blog.51cto.com/u_15309652/3153642 (File Download Assistant)下载链接:https…...

原生js获取今天、昨天、近7天的时间(年月日时分秒)
有的时候我们需要将今天,昨天,近7天的时间(年月日时分秒)作为参数传递给后端,如下图: 那怎么生成这些时间呢?如下代码里,在methods里的toDay方法、yesterDay方法、weekDay方法分别用于生成今天、昨天和近7天的时间: <template><div class="box"&…...

最强自动化测试框架Playwright(29)-文件选择对象
FileChooser对象通过page.on("filechoose")事件监听。 如下代码实现点击百度搜图按钮,上传文件进行搜索。 from playwright.sync_api import Playwright, sync_playwright, expectdef run(playwright: Playwright) -> None:browser playwright.chro…...

【烂尾】K8S部署
0x01 初见K8S 在地下城的迷宫深处,有一个神奇的存在,它就是Kubernetes!宛如一个勇敢的冒险者,它穿越着这个复杂的迷宫,带领着容器们战胜各种惊险的挑战。 Kubernetes就像是一位无所畏惧的剑士,手握着强大…...

电机故障诊断(python程序,模型为MSCNN结合LSTM结合注意力机制模型,有注释)
代码运行环境要求:TensorFlow版本>2.4.0,python版本>3.6.0 1.电机常见的故障类型有以下几种: 轴承故障:轴承是电机运转时最容易受损的部件之一。常见故障包括磨损、疲劳、过热和润滑不良,这些问题可能导致噪音增…...

二叉树(ACM版)
【数据结构1-2】二叉树 - 题单 - 洛谷 【数据结构】day2-树_J娇娇_的博客-CSDN博客 上学时的作业 P1827 [USACO3.4] 美国血统 American Heritage 二叉树特点写法(非二叉树) 截取字符串写法 #include<string> #include<cstring> #include…...

Scratch 之 如何制作鼠标框(2)—— 鼠标框框定角色
hello,大家好,欢迎来到鼠标框系列的第二课时! 咱们废话不多说,直接开始 首先,温故知新一下,上个教程我们讨论了如何绘制鼠标框,网址:绘制鼠标框 你说,一个鼠标框&…...

爬虫逆向实战(九)--猿人学第十三题
一、数据接口分析 主页地址:猿人学第十三题 1、抓包 通过抓包可以发现数据接口是api/match/13 2、判断是否有加密参数 请求参数是否加密? 无请求头是否加密? 无响应是否加密? 无cookie是否加密? 在“cookie”模块…...

NeuralNLP-NeuralClassifier的使用记录(一),训练预测自己的【英文文本多分类】
NeuralNLP-NeuralClassifier的使用记录,训练预测自己的英文文本多分类 NeuralNLP-NeuralClassifier是腾讯开发的一个多层多分类应用工具,支持的任务包括,文本分类中的二分类、多分类、多标签,以及层次多标签分类。支持的文本编码…...

Pycharm社区版连接WSL2中的Mysql8.*
当前时间2023.08.13,Windows11中默认的WSL版本已经是2了,在WSL2中默认的Ubuntu版本已经是22.04,而Ubuntu22.04中默认的Mysql版本已经是8.*。 Wsl 2 中安装mysql WSL2中安装Mysql的方法参考自微软官方文档【开始使用适用于 Linux 的 Windows …...

前端传递参数时,form-data 和 json 的区别
在传递参数时,form-data 和 JSON 是两种常见的数据格式。 form-data 是一种多部分表单数据格式,通常用于上传文件或包含二进制数据的表单提交。它使用 multipart/form-data 格式来编码数据。在使用 form-data 格式时,数据会被分割成多个部分&…...

FairyGUI-Unity侧菜单扩展
目录 缘由: 分析: 准备: 完整代码: 缘由: 在使用FairyGUI作为项目UI开发时,有时会使用FairyGUI提供的Scripting Define Symbols。当前FairyGUI中的Scripting Define Symbols有: 骨骼动画 …...

学习笔记十八:污点、容忍度
污点、容忍度 污点、容忍度管理节点污点把k8snode2当成是生产环境专用的,其他node是测试的给k8snode1也打上污点 污点、容忍度 给了节点选则的主动权,我们给节点打一个污点,不容忍的pod就运行不上来,污点就是定义在节点上的键值属…...

amis百度前端框架,在js中使用amis写json转页面
amis百度前端框架,在js中使用用amis写的json页面 1.在项目中使用百度 amis 的sdk做开发库。 <script src="./sdk/sdk/sdk.js"></script> 2。加载sdk中的库: amis = amisRequire(amis/embed);amisLib = amisRequire(amis);const match = amisRequire…...

openEuler安装jdk、openEuler离线安装jdk、openEuler设置jdk、openEuler在线安装
记录一下本人使用openEuler安装jdk的过程,希望能帮到看到帖子的你! 方式一:在线安装: 在 openEuler 上安装 JDK(Java Development Kit)的步骤如下: 更新系统: 在安装 JDK 之前,建议先更新系统软件包。打开终端并执行以下命令: sudo dnf update 这将更新系统中的软…...

Photoshop制作漂亮光泽感3D按钮
原文链接(https://img-blog.csdnimg.cn/45472c07f29944458570b59fe1f9a0e0.png)...

【网络爬虫】模拟登录与代理
代理...

无线局域网基础知识与架构
1.1 无线局域网 无线局域网(Wireless Local Area Network,WLAN)是指以无线信道作为传输 媒介的计算机局域网络,是计算机网络与无线通信技术相结合的产物,它以无线多 址信道作为传输媒介,提供传统有线局域网的功能,能…...

uniapp tabbar 浏览器调试显示 真机不显示
解决方案,把tabBar里面的单位全改为px,rpx是不会显示的! 注意了,改完一定要重新运行,不然无效,坑爹 "tabBar": {"borderStyle": "black","selectedColor": &quo…...

极智AI | 地平线BPU跑通YOLOv5
欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文来介绍一下 地平线BPU跑通YOLOv5。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq 硬件设备为地平线旭日x3,开发环境和执行环…...

循环服务器(同时连接多个客户端,为每个客户端创建一个子进程处理其消息)
服务器 客户端 结果...

【从零学习python 】38.Python包的使用及导入方式
文章目录 包的使用1. 导入包的方式总结2. __init__.py文件有什么用3. __all__ 注意事项进阶案例 包的使用 一个模块就是一个 py 文件,在 Python 里为了对模块分类管理,就需要划分不同的文件夹。多个有联系的模块可以将其放到同一个文件夹下,为…...

docker 容器满了常用处理方法
docker 容器满了常用处理方法 1、运行 df -h 查看剩余磁盘占用情况 2、进入到docker目录 cd /var/lib/docker 3、运行du -h --max-depth1 (检索文件的最大深度1,即只检索汇总计算当前目录下的文件) 4、进入占用最大的 /containers文件夹&am…...

28、springboot的静态模版(前端页面)重加载和 devtools开发者工具
springboot的静态模版重加载和 devtools开发者工具 总结:实现静态模板重加载的两个方法 方法1:在 yml 配置文件,关闭页面模板缓存, 再按 ctrlf9 重新构建 方法2:直接添加 devtools 依赖,再按 ctrlf9 重新构…...

[FPGA IP系列] FPGA常用存储资源大全(RAM、ROM、CAM、SRAM、DRAM、FLASH)
本文主要介绍FPGA中常用的RAM、ROM、CAM、SRAM、DRAM、FLASH等资源。 一、RAM RAM(Random Access Memory)是FPGA中最基本和常用的内部存储块,根据不同架构可以实现不同容量,最大可达几十Mb。 FPGA中的RAM主要包括: 分布式RAM:存在于逻辑块…...
Spark SQL优化:NOT IN子查询优化解决
背景 有如下的数据查询场景。 SELECT a,b,c,d,e,f FROM xxx.BBBB WHERE dt ${zdt.addDay(0).format(yyyy-MM-dd)} AND predict_type not IN ( SELECT distinct a FROM xxx.AAAAAWHERE dt ${zdt.addDay(0).format(yyyy-MM-dd)} ) 分析 通过查看SQL语句的执行计划基本…...