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

Git Merge命令介绍(把指定分支的提交历史合并到当前分支)经典合并、Fast-Forward快进合并FF Merge、三方合并、merge commit、squash merge、合并冲突

文章目录

  • Git Merge 完全指南:理解 Git 分支合并机制
  • 一、什么是 git merge?
    • merge 是“合并到当前分支”
  • 二、merge 的核心思想
  • 三、最经典的 merge 流程
  • 四、Fast-Forward Merge(快进合并)
    • 场景
  • 五、什么是 Three-Way Merge(三方合并)
  • 六、merge commit 是什么?
  • (补充)为什么要用 merge commit?
  • 七、git merge 常用命令
  • 1. 合并分支
  • 2. 不创建 Fast-Forward
  • 3. 只允许 Fast-Forward
  • 4. squash merge
  • 八、merge conflict(合并冲突)
    • 冲突产生原因
  • 九、冲突文件长什么样?
  • 十、解决 merge conflict
    • 1. 编辑冲突文件
    • 2. 标记已解决
    • 3. 完成 merge
  • 十一、放弃 merge
  • 十二、查看 merge 历史
    • 图形查看
    • 查看 merge commit
  • 十三、merge 与 rebase 的区别
    • merge
    • rebase
    • 如何选择?
      • 团队协作:
      • 个人 feature 整理:
  • 十四、merge 的最佳实践
  • 1. 小步合并
  • 2. merge 前先 pull
  • 3. 使用 Pull Request
  • 4. 重要分支使用 --no-ff
  • 5. 学会看 graph
  • 十五、merge 的本质理解(非常重要)
  • 十六、实际团队开发中的 merge 流程
    • 1. 创建功能分支
    • 2. 开发提交
    • 3. 同步主分支
    • 4. 合并 feature
    • 5. 删除 feature
  • 十七、总结

Git Merge 完全指南:理解 Git 分支合并机制

在日常 Git 开发中,分支(branch)是最核心的工作方式之一。

我们通常会:

  • 在 feature 分支开发功能
  • 在 bugfix 分支修复问题
  • 在 release 分支准备发布

而当开发完成后,就需要把这些修改“合并”回主线分支。

这时候就会使用:

gitmerge

git merge是 Git 中最重要的命令之一,它负责:

  • 合并分支历史
  • 整合代码修改
  • 保留开发轨迹
  • 构建团队协作流程

这篇文章将全面介绍:

  • git merge 的原理
  • merge 的工作流程
  • Fast-Forward 与 Three-Way Merge
  • merge conflict(合并冲突)
  • 常见 merge 策略
  • merge 最佳实践

一、什么是 git merge?

git merge用于:

把另一个分支的提交历史整合到当前分支。

例如:

gitmerge feature/login

意思是:

feature/login分支的修改合并到当前所在分支。

注意:

merge 是“合并到当前分支”

很多新人容易理解反。

比如:

gitcheckout maingitmerge feature/login

真正含义是:

把 feature/login 合并进 main

不是反过来。


二、merge 的核心思想

Git 的 merge 本质上是:

寻找共同祖先(merge base) 然后整合两个分支的差异

Git 会:

  1. 找到两个分支共同祖先
  2. 对比双方修改
  3. 自动合并代码
  4. 创建新的 merge commit(某些情况不会)

三、最经典的 merge 流程

假设:

main └── A──B──C | feature └──D──E

现在:

gitcheckout maingitmerge feature

merge 后:

main └── A──B──C────M \ / D──E

这里:

  • M就是 merge commit
  • Git 保留了两条历史
  • merge commit 有两个 parent

这是 Git 最标准的分支整合方式。


四、Fast-Forward Merge(快进合并)

这是最常见的一种 merge。

场景

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

如果:

  • main 在 feature 创建后没有新提交
  • main 只是“落后”于 feature

那么 merge 时:

gitcheckout maingitmerge feature

Git 会直接:

A──B──C──D──E

不会创建 merge commit。

这叫:

Fast-Forward Merge(FF Merge)

意思是:

main 指针直接向前移动。


五、什么是 Three-Way Merge(三方合并)

如果两个分支都发生了新提交:

D──E feature / A──B──C \ F──G main

这时候:

  • 无法直接快进

  • Git 必须:

    • 找共同祖先
    • 比较双方改动
    • 创建 merge commit

结果:

D──E / \ A──B──C─────M \ F──G

这就是:

Three-Way Merge

因为涉及:

  1. 共同祖先
  2. 当前分支
  3. 被合并分支

三个节点。


六、merge commit 是什么?

merge commit 是:

一个拥有多个 parent 的 commit。

普通 commit:

parent -> current

merge commit:

parent1 -> merge parent2 -> merge

查看:

gitlog--graph--oneline

效果:

* a1b2c3 Merge branch 'feature' |\ | * e5f6g7 feature commit * | h8i9j0 main commit |/

(补充)为什么要用 merge commit?

保留完整历史
合并后,你依然能清晰看到feature分支是从哪来的、改了什么
(如果不用 merge commit,历史会被“压平”,丢失分支信息)

可追溯性
当需要回滚或排查问题时,能明确知道这个合并操作连接了哪两个分支

七、git merge 常用命令

1. 合并分支

gitmerge feature/login

2. 不创建 Fast-Forward

gitmerge --no-ff feature/login

即使能 FF,也强制创建 merge commit。

适合:

  • 保留功能开发历史
  • 方便回滚 feature
  • 团队协作

结果:

main ─── M / feature

3. 只允许 Fast-Forward

gitmerge --ff-only feature/login

如果不能 FF:

merge aborted

常用于:

  • 保持线性历史
  • 禁止 merge commit

4. squash merge

gitmerge--squashfeature/login

作用:

把整个 feature 分支压缩成一个提交。

特点:

  • 不保留 feature 历史
  • 不生成 merge commit
  • 提交历史更干净

适合:

  • 小功能
  • 杂乱提交
  • 临时分支

八、merge conflict(合并冲突)

这是 Git merge 中最重要的问题。

冲突产生原因

两个分支:

  • 修改了同一文件
  • 修改了同一位置

Git 无法判断保留谁。

例如:

main:

name="main"

feature:

name="feature"

merge 时:

CONFLICT(content): Merge conflictinapp.py

九、冲突文件长什么样?

Git 会插入:

<<<<<<< HEAD name = "main" ======= name = "feature" >>>>>>> feature/login

含义:

<<<<<<< HEAD 当前分支内容 ======= 对方分支内容 >>>>>>> feature/login

需要手动修改。


十、解决 merge conflict

步骤:

1. 编辑冲突文件

手动保留正确内容:

name="new value"

删除:

<<<<<<< ======= >>>>>>>

2. 标记已解决

gitaddapp.py

3. 完成 merge

gitcommit

Git 会自动生成 merge commit。


十一、放弃 merge

如果 merge 一团糟:

gitmerge--abort

恢复到 merge 前状态。

非常有用。


十二、查看 merge 历史

图形查看

gitlog--graph--oneline--all

非常推荐。


查看 merge commit

gitlog--merges

十三、merge 与 rebase 的区别

这是 Git 中最经典的话题。

merge

特点:

  • 保留真实历史
  • 有 merge commit
  • 分支结构清晰

历史:

A──B──C────M \ / D──E

rebase

特点:

  • 改写历史
  • 提交线性化
  • 更干净

结果:

A──B──C──D'──E'

如何选择?

通常:

团队协作:

推荐:

merge

因为:

  • 安全
  • 不改历史
  • 不容易出事故

个人 feature 整理:

推荐:

rebase

因为:

  • 提交更干净
  • 阅读体验更好

十四、merge 的最佳实践

1. 小步合并

不要:

一个月后一次性 merge

应该:

频繁同步

否则冲突会爆炸。


2. merge 前先 pull

gitpull

确保分支最新。


3. 使用 Pull Request

现代团队一般:

feature -> PR -> review -> merge

而不是直接 merge。


4. 重要分支使用 --no-ff

例如:

gitmerge --no-ff feature/payment

这样未来:

gitrevert

更容易整体回滚 feature。


5. 学会看 graph

推荐:

gitlog--graph--decorate--oneline--all

这是理解 Git 历史最有效的方法。


十五、merge 的本质理解(非常重要)

很多人认为 merge 是:

“复制代码”

其实不是。

merge 本质是:

整合 commit 历史

Git 管理的是:

commit DAG(有向无环图)

merge 的核心:

连接两条提交链

代码变化只是结果。


十六、实际团队开发中的 merge 流程

典型流程:

1. 创建功能分支

gitcheckout-bfeature/order-system

2. 开发提交

gitcommit

3. 同步主分支

gitcheckout maingitpull

4. 合并 feature

gitmerge --no-ff feature/order-system

5. 删除 feature

gitbranch-dfeature/order-system

十七、总结

git merge是 Git 协作模型的核心。

它不仅是:

代码合并工具

更是:

团队开发历史管理机制

理解 merge 后,你会真正理解:

  • Git 分支模型
  • commit DAG
  • 团队协作
  • PR 工作流
  • rebase 与 merge 的区别

最后记住一句话:

merge 不是“复制代码” 而是“连接历史”

这才是 Git 最核心的思想。

http://www.jsqmd.com/news/774098/

相关文章:

  • 2026年高品质的香水喷头/电化铝香水喷头定制加工厂家推荐 - 行业平台推荐
  • 思路总结--华大(Stereo-seq)的空间通讯分析
  • Attio:用关系型数据库思维重塑CRM与团队协作
  • Quixel Mixer本地材质库管理全攻略:从下载、整理到备份,告别资源混乱
  • Bonsai Memory:为AI智能体构建分层记忆索引,实现Token消耗降低81%
  • 性价比高的6s与目视化管理咨询企业
  • 基于MCP协议构建企业级AI协作引擎:连接Claude与Gemini的33个生产力工具
  • 海明码+加密签名(软考专项)学习记录+速记+真题
  • SystemVerilog里disable fork的‘误伤’有多严重?一个实际仿真案例带你避坑
  • Git Reset命令介绍(用于移动HEAD,并选择是否同步更新暂存区工作区)三种模式:--soft、--mixed(默认)、--hard;修改最近提交、合并多个提交、取消git add、回退版本回退
  • 创业者人格AI:大模型垂直化与提示词工程实战解析
  • 警惕!POS系统4大安全风险别踩雷
  • 不止于测距:用51单片机和HC-SR04超声波模块DIY一个简易倒车雷达/防撞预警系统
  • Taro编译h5端口点击返回Taro.navigateBack({delta: 1,})刷新当前页面问题
  • GodotFirebase插件实战:为游戏快速集成云端用户认证与实时数据库
  • 从开源项目到商业落地:一个软PLC的‘前世今生’与技术启示
  • 【408考研·OS】核心考点:中断分类、线程模型 (KLT/ULT) 与调度算法方法论总结
  • 互联网大厂 Java 求职者面试:深入探讨微服务与云原生技术
  • Windows 一键部署 OpenClaw 教程|5 分钟上手本地 AI 智能体,简化全流程配置
  • MVCC与锁联手:彻底搞懂MySQL如何解决幻读
  • CWDM与DWDM技术详解:从核心差异到选型实战
  • 2026年多规格的台式真空瓶/乳液真空瓶定制加工厂家推荐 - 行业平台推荐
  • 终极指南:SketchUp STL插件让你的3D模型轻松实现3D打印
  • Java+wangEdit5导出可编辑pdf文件
  • Hotkey Detective:三步精准定位Windows热键冲突,告别快捷键失效困扰
  • 技能进化系统:用数据可视化与网状图谱管理个人知识成长
  • 蓝牙芯片采集和
  • 从“让 AI 写代码”到“让 AI 可靠交付”:工程师真正该学什么
  • 新手入门教程使用Python和OpenAI兼容SDK接入Taotoken多模型服务
  • 焦耳电熔炉玻璃固化工艺控制系统设计及温控HPSO【附代码】