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

git rebase 操作记录

场景一:Fast-Forward 合并
dev 分支合并到main 分支,不想产生一个新的合并节点,而是基于main分支生成最新commit,操作如下:

git checkout main       # 切换到 main 分支
git pull origin main    # 更新 main 到最新
git checkout dev        # 切换到 dev 分支
git rebase main         # 将 dev 的提交基于 main 的最新提交(已整合 main 的最新更改)git log --oneline        # 查看 dev 分支的提交历史,确保 rebase 成功# 由于你已通过 rebase 或 merge 修改了 dev 分支的提交历史,需 强制推送(覆盖远程 dev 的历史)
git push origin dev --force 
# 或简写为:
git push -f origin dev

什么是 Fast-Forward 合并?

Fast-Forward(快进合并) 是 Git 在合并分支时的一种优化方式,当 当前分支的提交历史是目标分支的直接后裔 时,Git 会直接移动目标分支的指针到当前分支的最新提交,而无需创建新的合并提交。


Fast-Forward 合并的条件

Fast-Forward 合并成立的 必要条件 是:

  1. 当前分支(如 feature)是目标分支(如 main)的直接延伸
  2. 当前分支没有与目标分支无关的独立提交

示例 1:Fast-Forward 合并的典型场景

步骤 1:创建并切换到新分支
git checkout main          # 当前在 main 分支
git checkout -b feature    # 创建并切换到 feature 分支
步骤 2:在新分支提交更改
# 在 feature 分支进行开发并提交
git commit -m "添加新功能"
步骤 3:合并到 main 分支
git checkout main
git merge feature          # 自动触发 Fast-Forward
合并结果
  • main 分支的指针直接移动到 feature 的最新提交。
  • 无新提交生成,提交历史呈线性。

示例 2:非 Fast-Forward 合并(存在独立提交)

步骤 1:在 main 和 feature 分支均有提交
# 在 main 分支提交
git checkout main
git commit -m "修复 main 分支的 bug"# 在 feature 分支提交
git checkout feature
git commit -m "完善新功能"
步骤 2:合并 feature 到 main
git checkout main
git merge feature          # 此时无法 Fast-Forward
合并结果
  • Git 会创建一个新的 合并提交,保留分支的历史分支结构。

Fast-Forward 合并的优缺点

优点缺点
提交历史线性化,无冗余合并提交丢失分支的分支结构,无法追溯分支来源
简化历史查看若分支有独立提交,需强制使用 --no-ff

如何强制避免 Fast-Forward?

使用 --no-ff 选项,即使满足条件也强制创建合并提交:

git merge --no-ff feature

Fast-Forward 合并的可视化对比

Fast-Forward 合并
A → B → C (main 和 feature 分支指针)↑feature 分支创建于 main 的 B 提交后提交 C 后合并,main 直接指向 C
非 Fast-Forward 合并
main 分支:A → B → D (独立提交)
feature 分支:A → B → C (独立提交)
合并后:A → B → D → M (合并提交 M)↖       ↗C (feature)

总结

  • 适用场景:当分支提交历史完全线性时,Fast-Forward 合并可简化历史。
  • 注意事项:若需保留分支结构(如追溯功能开发路径),建议使用 --no-ff
  • 命令速记
    • git merge --ff-only <branch>:仅 Fast-Forward 合并,失败则报错。
    • git merge --no-ff <branch>:强制非 Fast-Forward 合并。
http://www.lryc.cn/news/604688.html

相关文章:

  • 《Java 程序设计》第 11 章 - 泛型与集合
  • chukonu阅读笔记(2)
  • 【LY88】双系统指南及避坑
  • 阿里云AI代码助手通义灵码开发指导
  • 【读书笔记】设计数据密集型应用 DDIA 第三章:存储与检索
  • OPCap:Object-aware Prompting Captioning
  • PHP/Java/Python实现:如何有效防止恶意文件上传
  • 【Qt开发】信号与槽(三)-> 自定义信号和槽
  • <RT1176系列13>LWIP概念介绍
  • 游戏盾是如何做到免疫攻击的
  • Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
  • 离线录像文件视频AI分析解决方案
  • android 性能优化
  • 密码学安全性简介
  • 深入浅出:在 Spring Boot 中构建实时应用 - 全面掌握 WebSocket
  • 电池自动生产线:科技赋能下的高效制造新范式
  • Ubuntu LNMP
  • MCU中的CAN总线是什么?
  • 44、鸿蒙HarmonyOS Next开发:视频播放 (Video)组件和进度条 (Progress)组件的使用
  • LLM—— 基于 MCP 协议(SSE 模式)的工具调用实践
  • 常见的cms框架的webshell方法
  • JAVAEE--4.多线程案例
  • 机器学习之线性回归的入门学习
  • SpringBoot学习 |springboot概念+微服务架构
  • 【HarmonyOS】鸿蒙ArkWeb加载优化方案详解
  • 相亲小程序匹配与推荐系统模块搭建
  • Redis知识点(2)
  • 问题1:uniapp在pages样式穿刺没有问题,在components组件中样式穿刺小程序不起效果
  • 短剧小程序系统开发:重塑影视内容消费格局
  • Apple基础(Xcode②-Flutter结构解析)