git中的Fast-Forward是什么?

前言

看完本篇文章,你将能用自己的语言解释

什么是 git 中的 Fast-Forward?

正文

当前的工作状态是这样的:

  • 我的 master 分支指向了提交 B
  • 我的 dev_jjq 分支是从 master 的某个更早的提交(比如 A)创建出来的。

所以现在的提交历史图看起来是一条直线:

css 复制代码
A---B (master, HEAD)
\
(dev_jjq 还指在 A)

现在,我在 dev_jjq 分支上辛勤工作,完成了一个新功能,并做了一次提交 C。历史图就变成了:

scss 复制代码
A---B (master)
\
 C (dev_jjq)

关键的时刻来了 :我准备把在 dev_jjq 上开发的新功能合并回 master 主分支。

  1. 我首先切换回 master 分支:git checkout master
  2. 然后执行合并命令:git merge dev_jjq

这时,Git 会进行判断。它发现 master 当前的指向 B,直接就是 dev_jjq 的祖先。这意味着 dev_jjq 的提交历史完全包含了 master 自分支点以后的所有历史,没有任何分歧。

在这种情况下,Git 就会执行一次 fast-forward(快进) 合并。

快进合并的结果是: Git 不会创建任何新的提交,它只是简单地将 master 分支的指针直接向前移动 ,指向 dev_jjq 所指的同一个提交 C

合并后的历史图依然是一条干净直线,就像所有工作都是在 master 分支上顺序完成的一样:

css 复制代码
A---B---C (master, dev_jjq)

对我来说,这有什么感觉?

  • 优点:历史非常清晰和线性,没有多余的合并提交,看起来很整洁。
  • 缺点:在历史中丢失了"曾经存在过一个功能分支"的信息。对于简单的修复或短期分支,这很好;但对于重要的功能分支,我有时会希望保留分支信息。

如果我不想用 fast-forward 模式呢? 我可以在合并时使用 --no-ff (no fast-forward) 选项: git merge --no-ff dev_jjq

这样,即使满足快进条件,Git 也会强制创建一个新的合并提交,历史图会变成这样:

scss 复制代码
A---B-----------M (master)
     \         /
      C--- (dev_jjq)

这样就能在历史中清晰地看到一次合并事件和一个功能分支的存活周期,对我管理项目历史更有帮助。

最后

【问】那么什么是 git 中的 Fast-Forward 呢?

【答】如果你想将本地的 dev_jjq 分支合并到 master 分支:

bash 复制代码
# 切换到主分支
git checkout master

# 合并功能分支
git merge dev_jjq

这时,如果 dev_jjq 是 master 的直接后继,Git 就会采用 Fast-Forward 模式,将 master 指针直接向前移动到 dev_jjq 所指的提交,不会创建新的合并提交。

相关推荐
晨非辰9 小时前
数据结构排序系列指南:从O(n²)到O(n),计数排序如何实现线性时间复杂度
运维·数据结构·c++·人工智能·后端·深度学习·排序算法
じòぴé南冸じょうげん10 小时前
若依框架favicon.ico缓存更新问题解决方案:本地生效但线上未更新
前端·javascript·前端框架·html
狮子座的男孩10 小时前
js基础高级:01、数据类型(typeof、instanceof、===的使用)、数据与变量与内存(定义、赋值与内存关系、引用变量赋值、js调函数传参)
前端·javascript·经验分享·数据类型·数据与变量与内存·赋值与内存关系·引用变量赋值
Cyclo-13 小时前
PDFJS 在React中的引入 使用组件打开文件流PDF
前端·react.js·pdf
Filotimo_15 小时前
Spring Boot 整合 JdbcTemplate(持久层)
java·spring boot·后端
半桶水专家15 小时前
Go 语言时间处理(time 包)详解
开发语言·后端·golang
编程点滴15 小时前
Go 重试机制终极指南:基于 go-retry 打造可靠容错系统
开发语言·后端·golang
椒盐螺丝钉15 小时前
Vue Router应用:组件跳转
前端·javascript·vue.js
顾安r15 小时前
11.20 开源APP
服务器·前端·javascript·python·css3
9***P33416 小时前
Git测试框架使用指南
git