Git 中的 Rebase 与 Merge:原理、区别与最佳实践

文章目录

    • [1. 引言:为什么 Git 会有 rebase 和 merge 两种方式?](#1. 引言:为什么 Git 会有 rebase 和 merge 两种方式?)
    • [2. Git Merge:保留真实历史的合并](#2. Git Merge:保留真实历史的合并)
      • [2.1 Merge 的基本思想](#2.1 Merge 的基本思想)
      • [2.2 Merge 的使用方式](#2.2 Merge 的使用方式)
      • [2.3 Merge 的优点](#2.3 Merge 的优点)
      • [2.4 Merge 的缺点](#2.4 Merge 的缺点)
    • [3. Git Rebase:重写历史的"整理术"](#3. Git Rebase:重写历史的“整理术”)
      • [3.1 Rebase 的基本思想](#3.1 Rebase 的基本思想)
      • [3.2 Rebase 的使用方式](#3.2 Rebase 的使用方式)
      • [3.3 Rebase 的优点](#3.3 Rebase 的优点)
      • [3.4 Rebase 的缺点](#3.4 Rebase 的缺点)
    • [4. Rebase 与 Merge 的核心区别](#4. Rebase 与 Merge 的核心区别)
    • [5. 冲突处理上的区别](#5. 冲突处理上的区别)
      • [Merge 冲突](#Merge 冲突)
      • [Rebase 冲突](#Rebase 冲突)
    • [6. 一个重要原则](#6. 一个重要原则)
    • [7. 实战推荐用法](#7. 实战推荐用法)
      • [场景 1:个人功能分支](#场景 1:个人功能分支)
      • [场景 2:合并到主分支](#场景 2:合并到主分支)
      • [场景 3:提交前整理 commit](#场景 3:提交前整理 commit)
    • [8. GitHub / GitLab 的最佳实践](#8. GitHub / GitLab 的最佳实践)
    • 参考

1. 引言:为什么 Git 会有 rebase 和 merge 两种方式?

在团队开发中,我们经常会遇到这样的场景:

  • 多个人在同一个仓库并行开发
  • 主分支(main / master)在不断前进
  • 自己的功能分支需要同步最新代码

这时,Git 给我们提供了两种选择:

  • git merge
  • git rebase

它们都能"合并代码",那到底有什么区别?


2. Git Merge:保留真实历史的合并

2.1 Merge 的基本思想

merge 的核心思想是:

把两个分支的历史"汇合"在一起,并生成一个新的合并提交。

示意图如下:

latex 复制代码
A---B---C---D (main)
     \     /
      E---F (feature)

合并后:

latex 复制代码
A---B---C---D------M (main)
     \           /
      E---F----- (feature)

其中 M 是一个 Merge Commit


2.2 Merge 的使用方式

bash 复制代码
git checkout main
git merge feature

注意要合并的时候切换到目标分支


2.3 Merge 的优点

  • 不修改历史,绝对安全
  • 提交记录完整可追溯
  • 适合多人协作、公共分支

2.4 Merge 的缺点

  • 提交历史可能出现大量 merge commit
  • 日志图可能较为"杂乱"
  • 不利于线性回溯提交

3. Git Rebase:重写历史的"整理术"

3.1 Rebase 的基本思想

rebase 的核心思想是:

把当前分支的提交"挪到"另一个分支的最新提交之后。

示意图:

latex 复制代码
A---B---C---D (main)
     \
      E---F (feature)

Rebase 后:

latex 复制代码
A---B---C---D---E'---F' (feature)

注意:

  • E'F'新提交
  • 原来的 EF 已被替换

3.2 Rebase 的使用方式

bash 复制代码
git checkout feature
git rebase main

3.3 Rebase 的优点

  • 提交历史 线性、干净
  • 更容易阅读和回滚
  • 非常适合整理本地提交

3.4 Rebase 的缺点

  • 重写提交历史
  • 如果操作不当,容易引发协作问题
  • 不适合已经推送到远程的公共分支

4. Rebase 与 Merge 的核心区别

维度 merge rebase
是否生成新提交 是(merge commit) 否(重写提交)
历史是否线性
是否修改历史
风险程度
适用场景 公共分支 本地分支

操作位置对比

操作 当前所在分支 目标分支 命令格式
git rebase 当前分支 要变基到的分支 git rebase 目标分支
git merge 当前分支 要合并进来的分支 git merge 来源分支

5. 冲突处理上的区别

Merge 冲突

  • 只解决一次冲突
  • 生成一个 merge commit

Rebase 冲突

  • 每一个提交都可能冲突
  • 需要多次 git rebase --continue

6. 一个重要原则

永远不要 rebase 已经推送到远程的公共分支

原因:

  • 会改变提交 hash
  • 导致他人无法正常拉取代码
  • 可能引发灾难性冲突

7. 实战推荐用法

场景 1:个人功能分支

✅ 推荐 rebase

bash 复制代码
git checkout feature
git rebase main

目的:

👉 保持提交历史干净


场景 2:合并到主分支

✅ 推荐 merge

bash 复制代码
git checkout main
git merge feature

目的:

👉 保留真实开发历史


场景 3:提交前整理 commit

bash 复制代码
git rebase -i HEAD~3

可用于:

  • 合并提交
  • 修改提交信息
  • 删除无用提交

8. GitHub / GitLab 的最佳实践

  • 功能开发:rebase 同步主分支
  • 最终合并:mergesquash merge
  • 禁止对 main/master 执行 rebase

参考

【五分钟学会git rebase和 git merge的区别】

Git:图解 merge 和 rebase 的区别

相关推荐
胖大和尚3 小时前
Git初始化本地文件夹,并推送到远端
git
啵啵啵12344 小时前
Git 底层原理:分支为什么只是一个 41 字节的文件
git
demon75520035 小时前
Git Worktree详解介绍
git·worktree
胖大和尚7 小时前
当前仓库推送到同一台机器上的另一个文件夹
git
轮到我狗叫了1 天前
git - 版本控制工具 - 对应的常见命令 - 以及无需后续每次手动source conda
git
changxiang1 天前
GIT 备忘
git
DogDaoDao2 天前
Windows 开发提效工具全景指南:60+ 工具的工程化分层配置
windows·git·程序员·开发工具·powershell·everything·msys2
wdfk_prog2 天前
GitHub push 失败:如何扫描并清理 Git 历史中的大文件
git·elasticsearch·github
大明二代2 天前
使用 Traefik、cert-manager 和 DNS-01 为内网 Kubernetes 服务配置 HTTPS
git·kubernetes·flux
小芒果_012 天前
git常用命令速查
大数据·git·elasticsearch