【知识】可视化理解git中的cherry-pick、merge、rebase
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn]
如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~
这三个确实非常像,以至于对于初学者来说比较难理解。
总结对比
先给出对比:

| 特性 | git merge | git rebase | git cherry-pick |
|---|---|---|---|
| 功能 | 合并分支,保留历史 | 重新应用提交,使历史线性化 | 挑选特定提交,复制到另一个分支 |
| 提交顺序 | 保留分支的分叉和合并点 | 改变提交顺序,使历史线性化 | 不改变提交顺序,仅复制指定提交 |
| 哈希值 | 不改变原始提交哈希值 | 改变原始提交哈希值 | 生成新的提交哈希值 |
| 历史清晰度 | 保留分支历史,适合多人协作 | 线性化历史,适合个人开发 | 灵活挑选提交,但可能使历史复杂 |
| 适用场景 | 合并分支,保留完整历史 | 更新分支,清理提交历史 | 将特定修复或功能应用到其他分支 |
| 可视化结果 | https://learngitbranching.js.org/?NODEMO=&locale=zh_CN | https://learngitbranching.js.org/?NODEMO=&locale=zh_CN | https://learngitbranching.js.org/?NODEMO=&locale=zh_CN |
| 是否创建新提交 | 创建合并提交(merge commit) | 重新应用提交,生成新的提交 | 复制指定提交,生成新的提交 |
| 是否修改历史 | 不修改历史 | 修改历史,重新应用提交 | 修改历史,复制指定提交 |
| 冲突处理 | 合并冲突,解决后完成合并 | 逐个解决冲突,继续变基 | 逐个解决冲突,继续挑选提交 |
可视化理解
假设我们有以下的提交历史:
A -- B -- C [main]\D -- E [feature]
-
main分支包含提交 A、B 和 C。 -
feature分支从main的 B 提交分叉,包含提交 D 和 E。
1. 使用 git merge
如果我们在 main 分支上运行 git merge feature,Git 会创建一个新的合并提交,将 feature 分支的更改合并到 main 分支。
可视化结果:
A -- B -- C -- F [main]\ /D -- E [feature]
-
F 是一个新的合并提交,表示
main和feature分支的合并。 -
提交历史保留了分支的分叉和合并点,适合多人协作场景。
2. 使用 git rebase
如果我们在 feature 分支上运行 git rebase main,Git 会将 feature 分支的提交 D 和 E 重新应用到 main 分支的最新提交 C 上。
可视化结果:
A -- B -- C [main]\D' -- E' [feature]
-
提交 D 和 E 被重新应用到 C 上,生成了新的提交 D' 和 E'。
-
提交历史变得更加线性,适合个人开发或清理提交历史的场景。
3. 使用 git cherry-pick
假设我们只想将 feature 分支上的提交 E 应用到 main 分支,可以在 main 分支上运行 git cherry-pick E。
可视化结果:
A -- B -- C -- E' [main]\D -- E [feature]
-
提交 E 被复制到
main分支上,生成了新的提交 E'。 -
提交历史中只包含了被挑选的提交,适合将特定修复或功能应用到另一个分支的场景。
个人理解
- git merge 适合大部分情况,谁拉取了、做了几次提交、合并到了什么位置等,都非常清晰;
- git rebase 适合个人开发者。虽然它能把记录拉成一条直线,但对于团队开发而言,在看谁修改了哪部分的时候就懵逼了,非常不直观;
- git cherry-pick 适合在分支上做了一系列修改,不想把这么多提交都放到主分支上去的时候用。只需要把分支上最终的提交拿到主分支就可以了。也比较清晰。
因此,我觉得: merge > cherry-pick >> rebase
操作示例
1. git merge 示例
# 切换到 main 分支
git checkout main# 合并 feature 分支
git merge feature
2. git rebase 示例
# 切换到 feature 分支
git checkout feature# 将 feature 分支的提交重新应用到 main 分支
git rebase main
3. git cherry-pick 示例
# 切换到 main 分支
git checkout main# 挑选 feature 分支上的提交 E
git cherry-pick E
相关文章:
【知识】可视化理解git中的cherry-pick、merge、rebase
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 这三个确实非常像,以至于对于初学者来说比较难理解。 总结对比 先给出对比: 特性git mergegit rebasegit cherry-pick功能合并…...
【deepseek】deepseek-r1本地部署-第二步:huggingface.co替换为hf-mirror.com国内镜像
一、背景 由于国际镜像国内无法直接访问,会导致搜索模型时加载失败,如下: 因此需将国际地址替换为国内镜像地址。 二、操作 1、使用vscode打开下载路径 2、全局地址替换 关键字 huggingface.co 替换为 hf-mirror.com 注意:务…...
新站如何快速获得搜索引擎收录?
本文来自:百万收录网 原文链接:https://www.baiwanshoulu.com/8.html 新站想要快速获得搜索引擎收录,需要采取一系列有针对性的策略。以下是一些具体的建议: 一、网站内容优化 高质量原创内容: 确保网站内容原创、…...
如何使用tushare pro获取股票数据——附爬虫代码以及tushare积分获取方式
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据 总结 一、Tushare 介绍 Tushare 是一个提供中国股市数据的API接口服务,它允许用户…...
解决vsocde ssh远程连接同一ip,不同端口情况下,无法区分的问题
一般服务器会通过镜像分身或者容器的方式,一个ip分出多个端口给多人使用,但如果碰到需要连接同一user,同一个ip,不同端口的情况,vscode就无法识别,如下图所示,vscode无法区分该ip下不同端口的连接ÿ…...
Elasticsearch 自定义分成器 拼音搜索 搜索自动补全 Java对接
介绍 通常用于将文档中的文本数据拆分成易于索引的词项(tokens)。有时,默认的分词器无法满足特定应用需求,这时就可以创建 自定义分词器 来实现定制化的文本分析。 自定义分词器组成 Char Filters(字符过滤器&#x…...
基于物联网设计的疫苗冷链物流监测系统
一、前言 1.1 项目开发背景 随着全球经济的发展和物流行业的不断创新,疫苗和生物制品的运输要求变得越来越高。尤其是疫苗的冷链物流,温度、湿度等环境因素的控制直接关系到疫苗的质量和效力,因此高效、可靠的冷链监控系统显得尤为重要。冷…...
RocketMQ消息是如何存储的?
大家好,我是锋哥。今天分享关于【RocketMQ消息是如何存储的?】面试题。希望对大家有帮助; RocketMQ消息是如何存储的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 使用了一个高性能、分布式的消息存储架构…...
Ubuntu 16.04安装Lua
个人博客地址:Ubuntu 16.04安装Lua | 一张假钞的真实世界 在Linux系统上使用以下命令编译安装Lua: curl -R -O http://www.lua.org/ftp/lua-5.3.3.tar.gz tar zxf lua-5.3.3.tar.gz cd lua-5.3.3 make linux test 安装make 编译过程如果提示以下信息…...
【JavaSE】String类常用字符串方法总结
目录 1. length() 求字符串长度 2. isEmpty() 判断字符串是否为空 3. String对象的比较 3.1 equals() 判断字符串是否相同 3.2 compareTo() 比较字符串大小 3.3 compareToIgnoreCase 忽略大小写比较 4. 字符串查找 4.1 charAt() 返回指定索引处的字符 4.2 indexOf() 4…...
python3+TensorFlow 2.x(二) 回归模型
目录 回归算法 1、线性回归 (Linear Regression) 一元线性回归举例 2、非线性回归 3、回归分类 回归算法 回归算法用于预测连续的数值输出。回归分析的目标是建立一个模型,以便根据输入特征预测目标变量,在使用 TensorFlow 2.x 实现线性回归模型时&…...
机器人抓取与操作概述(深蓝)——1
工业机器人:① “臂”的形态 ② “手”的形态 ③ 视觉,力和触觉 1 机器人的不同形态 “臂”的形态 “手”的形态 2 常见的操作任务 操作:插入、推和滑 抓取:两指(平行夹爪)抓取、灵巧手抓取 落地-产…...
简单聊聊“DeepSeek”
目录 DeepSeek一夜火爆并受到广泛关注的优势 技术实力与创新 低成本与高效率 开源与免费 市场策略与应用领域 团队与资金优势 行业认可与媒体关注 DeepSeek在推理效率上的特别之处 多头潜在注意力(MLA) 多词元预测(MTP)…...
使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书
使用 Docker Nginx Certbot 实现自动化管理 SSL 证书 在互联网安全环境日益重要的今天,为站点或应用部署 HTTPS 已经成为一种常态。然而,手动申请并续期证书既繁琐又容易出错。本文将以 Nginx Certbot 为示例,基于 Docker 容器来搭建一个…...
粒子群算法 笔记 数学建模
引入: 如何找到全局最大值:如果只是贪心的话,容易被局部最大解锁定 方法有:盲目搜索,启发式搜索 盲目搜索:枚举法和蒙特卡洛模拟,但是样例太多花费巨量时间 所以启发式算法就来了,通过经验和规…...
【C语言】结构体与共用体深入解析
在C语言中,结构体(struct)和共用体(union)都是用来存储不同类型数据的复合数据类型,它们在程序设计中具有重要的作用。 推荐阅读:操作符详细解说,让你的编程技能更上一层楼 1. 结构体…...
es6.7.1分词器ik插件安装-和head插件连接es特殊配置
es6.7.1分词器ik插件安装-和head插件连接es特殊配置 如果对运维课程感兴趣,可以在b站上、A站或csdn上搜索我的账号: 运维实战课程,可以关注我,学习更多免费的运维实战技术视频 1.查看es6.7.1和es-head安装位置和es插件路径 [ro…...
java求职学习day18
常用的设计原则和设计模式 1 常用的设计原则(记住) 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 常用的设计原则 (1)开闭原则(Open Close Principle…...
单链表专题(上)
链表的定义与创建 线性表: 1. 物理结构上不一定是线性的 2. 逻辑结构上一定是线性的 链表是一种物理存储结构上非连续,非顺序的存储结构 链表也是线性表的一种,但是在物理结构上不是连续的 链表是由一个一个的节点组成,需要数…...
【stm32学习】STM32F103相关特性
| 名称 | 缩写 | 频率 | 外部连接 | 功能 | 用途 | 特性 | |--------------------|------|----------------|---------------|------------|--------------|----------------| | 外部高速晶体振荡器 | HSE | 4~16MHz …...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
