当前位置: 首页 > news >正文

【知识】可视化理解git中的cherry-pick、merge、rebase

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn]

如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~

这三个确实非常像,以至于对于初学者来说比较难理解。

总结对比

先给出对比:

特性git mergegit rebasegit cherry-pick
功能合并分支,保留历史重新应用提交,使历史线性化挑选特定提交,复制到另一个分支
提交顺序保留分支的分叉和合并点改变提交顺序,使历史线性化不改变提交顺序,仅复制指定提交
哈希值不改变原始提交哈希值改变原始提交哈希值生成新的提交哈希值
历史清晰度保留分支历史,适合多人协作线性化历史,适合个人开发灵活挑选提交,但可能使历史复杂
适用场景合并分支,保留完整历史更新分支,清理提交历史将特定修复或功能应用到其他分支
可视化结果https://learngitbranching.js.org/?NODEMO=&locale=zh_CNhttps://learngitbranching.js.org/?NODEMO=&locale=zh_CNhttps://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 是一个新的合并提交,表示 mainfeature 分支的合并。

  • 提交历史保留了分支的分叉和合并点,适合多人协作场景。


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

http://www.lryc.cn/news/528070.html

相关文章:

  • 【deepseek】deepseek-r1本地部署-第二步:huggingface.co替换为hf-mirror.com国内镜像
  • 新站如何快速获得搜索引擎收录?
  • 如何使用tushare pro获取股票数据——附爬虫代码以及tushare积分获取方式
  • 解决vsocde ssh远程连接同一ip,不同端口情况下,无法区分的问题
  • Elasticsearch 自定义分成器 拼音搜索 搜索自动补全 Java对接
  • 基于物联网设计的疫苗冷链物流监测系统
  • RocketMQ消息是如何存储的?
  • Ubuntu 16.04安装Lua
  • 【JavaSE】String类常用字符串方法总结
  • python3+TensorFlow 2.x(二) 回归模型
  • 机器人抓取与操作概述(深蓝)——1
  • 简单聊聊“DeepSeek”
  • 使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书
  • 粒子群算法 笔记 数学建模
  • 【C语言】结构体与共用体深入解析
  • es6.7.1分词器ik插件安装-和head插件连接es特殊配置
  • java求职学习day18
  • 单链表专题(上)
  • 【stm32学习】STM32F103相关特性
  • PostGIS笔记:PostgreSQL中表、键和索引的基础操作
  • 蓝桥杯python语言基础(3)——循环结构
  • 微服务网关鉴权之sa-token
  • 23【进制的理解】
  • jemalloc 5.3.0的tsd模块的源码分析
  • 【Convex Optimization Stanford】Lec3 Function
  • 深入 Rollup:从入门到精通(三)Rollup CLI命令行实战
  • wangEditor富文本编辑器,Laravel上传图片配置和使用
  • chrome源码剖析—进程通信
  • JJJ:linux时间子系统相关术语
  • 0 基础学运维:解锁 K8s 云计算运维工程师成长密码