惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

PCI Perspectives
PCI Perspectives
Microsoft Security Blog
Microsoft Security Blog
MongoDB | Blog
MongoDB | Blog
T
The Blog of Author Tim Ferriss
罗磊的独立博客
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
宝玉的分享
宝玉的分享
Recorded Future
Recorded Future
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
Recent Announcements
Recent Announcements
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Apple Machine Learning Research
Apple Machine Learning Research
T
Threatpost
The GitHub Blog
The GitHub Blog
M
MIT News - Artificial intelligence
Scott Helme
Scott Helme
P
Palo Alto Networks Blog
T
Tenable Blog
P
Privacy International News Feed
V
Visual Studio Blog
F
Fortinet All Blogs
酷 壳 – CoolShell
酷 壳 – CoolShell
I
Intezer
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
AI
AI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
S
Security Affairs
S
SegmentFault 最新的问题
C
Cisco Blogs
博客园 - 聂微东
MyScale Blog
MyScale Blog
V
Vulnerabilities – Threatpost
量子位
T
The Exploit Database - CXSecurity.com
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Security Latest
Security Latest
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Troy Hunt's Blog
T
Tailwind CSS Blog
Stack Overflow Blog
Stack Overflow Blog
云风的 BLOG
云风的 BLOG
A
About on SuperTechFans
The Last Watchdog
The Last Watchdog

博客园 - xiashengwang

Rocky Linux 9 安装docker Rocky Linux 9 与Centos区别,以及软件安装dnf命令 《Linux 基础点滴》:(17)SSH 密钥生成与管理 – 免密登录的利器 Linux服务器安全登录:从入门到实践 putty 基础 《Linux 基础点滴》:(16)firewalld 防火墙管理命令 《Linux 基础点滴》:(15)用户管理 – 创建、删除、权限与 sudo 《Linux 基础点滴》:(14)定时任务 – 用 crontab 自动化 《Linux 基础点滴》:(13)文本编辑入门 – 使用 Vim 《Linux 基础点滴》:(12)tldr – 简化版命令手册 《Linux 基础点滴》:(11)系统信息与资源监控 – 掌握服务器状态 《Linux 基础点滴》:(10)压缩与打包 – tar 的艺术 《Linux 基础点滴》:(9)查找与过滤 – find, grep, 管道 《Linux 基础点滴》:(8)网络基础 – 查看 IP、连通性与端口 《Linux 基础点滴》:(7)进程管理 – 查看与控制运行中的程序 《Linux 基础点滴》:(6)文件权限与所有者 – 保护你的文件 《Linux 基础点滴》:(5)文件与目录操作 – 增删改查必会命令 《Linux 基础点滴》:(4)磁盘空间查看 – df 和 du 的妙用 《Linux 基础点滴》:(3)Linux 文件系统概览 – 一切皆文件 《Linux 基础点滴》:(2)SSH 连接与基础命令 – 从登录到第一次操作 《Linux 基础点滴》:(1)初识 Linux 大家族 – 发行版分类与选择 docker学习(7)-docker compose 文件 docker学习(11)- 容器的日志(log) docker学习(10)-利用Github Action 自动化部署 docker学习(9)-Docker Swarm + Nginx 跨机器负载均衡 docker学习(8)-从 Windows 开发到 Linux 部署 docker学习(6)-数据持久化与网络通信 学会 Git Tag,让版本管理不再混乱 docker学习(5)-Dockerfile docker学习(4)-Docker常用命令 docker学习(3)-一个简单的例子 docker学习(2)-安装 docker学习(1)-基本概念 Github 使用 Self-hosted Runner 实现服务器自动化部署 github创建分支 + Pull Request 合并 Git 系统学习教程:从零到团队协作 AI学习笔记(2)-OpenClaw安装 windbg分析dmp文件 docker desktop 和 Vmware冲突的解决办法
Git Rebase vs Git Merge:深入理解与实战选择
xiashengwang · 2026-04-15 · via 博客园 - xiashengwang

2026-04-15 17:49  xiashengwang  阅读(72)  评论()    收藏  举报

git mergegit rebase 都是用来整合不同分支的修改,但它们处理提交历史的方式截然不同。理解它们的区别,能帮助你在团队协作中选择合适的策略,避免历史混乱。

一、核心概念对比

特性 git merge git rebase
原理 创建一个新的“合并提交”(merge commit),将两个分支的历史合并在一起。 将当前分支的提交 “重新播放” 到目标分支的最新提交之上,改写提交历史。
历史记录 保留真实的历史,包括分支的岔路和合并点。 线性化历史,看起来像是在一条直线上顺序开发,分支岔路被抹平。
安全性 安全,不会改写已有提交。 有风险,会改写提交的 SHA-1 值。永远不要对已推送到公共仓库的分支执行 rebase。
适用场景 公共分支(如 maindevelop)的合并。 本地分支的整理,使历史更清晰。

二、图解示例

假设你有两个分支:main 和 feature,提交历史如下:

      A---B---C  feature
     /
D---E---F---G  main

使用 git merge(在 main 上执行 git merge feature
结果:

      A---B---C  feature
     /         \
D---E---F---G---H  main (H 是合并提交)

特点:历史真实反映了分支的存在和合并点 H。如果团队需要追溯“某个功能是什么时候合并的”,merge 更合适。

使用 git rebase(在 feature 上执行 git rebase main
结果:

                      A'--B'--C'  feature (新提交)
                     /
D---E---F---G---H  main (H 是 main 的最新提交)
  • 过程: Git 会找到 featuremain 的共同祖先 E,然后把 feature 上的提交 ABC 逐个应用到 main 的最新提交 G 之上,生成新的提交 `A``B``C`(SHA-1 值改变)。原来的 ABC 会被抛弃(但可通过 reflog 找回)。

  • 特点: 历史变成了一条直线,看起来像是 feature 的修改是在 main 最新代码的基础上顺序完成的,非常干净。

三、具体操作与命令

场景:将 feature 分支的修改合并到 main

方式一:使用 Merge

git checkout main
git merge feature

如果有冲突,解决后执行 git add . git commit(会自动生成合并提交)。

推送:git push origin main

方式二:使用 Rebase(通常用于本地分支整理)

git checkout feature
git rebase main
# 如果有冲突,解决后执行:
git add .
git rebase --continue
# 重复直到所有提交应用完毕

# 然后将 feature 分支的线性历史合并到 main(此时已经是 fast-forward)
git checkout main
git merge feature   # 由于历史线性,会直接移动指针,不产生合并提交
git push origin main

四、为什么 rebase 有风险?

因为 rebase 重写了提交的 SHA-1 值。如果 feature 分支已经推送到远程,并且有其他开发者基于它工作,你执行 rebase 后再强制推送(git push --force),会导致其他人的历史混乱,引发灾难。

安全规则:

  • 可以在本地未推送的分支上使用 rebase,让历史更清晰。

  • 永远不要对已经推送到公共仓库的分支执行 rebase(例如 main、develop 或多人协作的 feature 分支)。