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

【Git】一文详解Git Rebase和Merge区别 看完必会

Git Rebase和Merge区别


1️⃣ 原始分支历史

A---B---C  main\D---E  feature
  • main 分支有提交 A → B → C
  • feature 分支从 B 分叉,提交 D → E

2️⃣ Merge 后的历史

执行:

git checkout main
git merge feature
A---B---C--------F  main\          /D--------E  feature
  • F 是 merge commit
  • 历史有分叉,能看到原始开发轨迹

3️⃣ Rebase 后的历史

执行:

git checkout feature
git rebase main
A---B---C  main\D'---E'  feature
  • D 和 E 被“搬到” C 之后
  • 历史线性化,看起来像 feature 从最新 main 开始开发
  • 没有 merge commit

✅ 总结:

  • Merge:保留分叉历史,适合公共分支,冲突少
  • Rebase:线性化历史,适合本地整理分支,便于阅读和维护

代码示例

写一个 完整的本地 rebase 示例,从创建分支到整理提交,步骤清晰易懂。


1️⃣ 初始化仓库

mkdir git-rebase-demo
cd git-rebase-demo
git init

创建一个文件并提交几个初始版本:

echo "Version 1" > file.txt
git add file.txt
git commit -m "Add version 1"echo "Version 2" >> file.txt
git commit -am "Update to version 2"echo "Version 3" >> file.txt
git commit -am "Update to version 3"

此时 main 分支历史:

A---B---C  main

2️⃣ 创建一个功能分支

git checkout -b feature
echo "Feature 1" >> file.txt
git commit -am "Add feature 1"echo "Feature 2" >> file.txt
git commit -am "Add feature 2"

分支历史:

A---B---C  main\D---E  feature

3️⃣ main 分支新增提交

切回 main 并更新:

git checkout main
echo "Version 4" >> file.txt
git commit -am "Update to version 4"

现在历史:

A---B---C---F  main\D---E  feature

4️⃣ 本地 Rebase 功能分支到 main

切回 feature:

git checkout feature
git rebase main

执行后:

A---B---C---F  main\D'---E'  feature
  • D’ 和 E’ 是重新应用在 F 之后的新提交
  • 历史线性化,没有 merge commit

5️⃣ 处理冲突(如果有)

如果 rebase 过程中有冲突:

# 编辑冲突文件解决
git add file.txt
git rebase --continue
  • 如果放弃 rebase:
git rebase --abort

6️⃣ 整理提交(交互式 rebase)

比如把 feature 的两个提交合并成一个:

git rebase -i HEAD~2

编辑:

pick <hash> Add feature 1
squash <hash> Add feature 2

结果:

A---B---C---F  main\G  feature (feature 1+2 合并)

这样就完成了 本地 feature 分支的 rebase 和整理提交历史


http://www.dtcms.com/a/363394.html

相关文章:

  • 整体认识K8s之PriorityClass优先级调度/HPA自动扩缩容机制
  • golang 依赖管理
  • 网络技术名词 CDN NAT GA DNS
  • 深度学习篇---Pytorch常用优化器
  • 力扣72:编辑距离
  • 用 PyTorch 实现食品图像分类:从数据预处理到模型训练与预测
  • mayfly-go:web 版 linux、数据库等管理平台
  • 码农必备!本地调试神器act,GitHub Actions最佳拍档
  • C++ 条件变量,互斥锁
  • vue飞自在酒店管理系统(代码+数据库+LW)
  • 第十七讲:编译链接与函数栈帧
  • Python图像处理模块介绍
  • Linux 文本处理四剑客:cut, sort, uniq, tr
  • springboot redisson 分布式锁切面入门与实战
  • HTML应用指南:利用POST请求获取全国便利蜂门店位置信息
  • 面试tips--JVM(4)--Minor GC Major GC Full GC
  • 从理念到实践:三层解耦架构与“无系统”论
  • 59.螺旋矩阵II
  • 科研界“外挂”诞生了:科学多模态模型Intern-S1-mini开源
  • linux开发板(rk3568,树莓派)自动连接保存好的WIFI
  • 百度网盘基于Flink的实时计算实践
  • SpringMVC —— Spring集成web环境和SpringMVC快速入门
  • 微信小程序列表之分页、刷新、加载更多开发
  • [密码学实战]逆向工程常见工具合集及下载地址(四十七)
  • 顶级天才会思考什么问题
  • Unity切换平台资源重新编译缓慢
  • 嵌入式git分支管理策略
  • 江协科技STM32学习笔记补充之002 对比介绍 I²C 和 SPI 两种常见的串行总线接口
  • Linux 环境配置 Boost 库详细步骤
  • C++二维数组的前缀和