git rebase 和git merge使用及区别

在 Git 代码管理工具中,git rebasegit merge 都用于合并分支,但它们的方式不同,会对提交历史产生不同的影响。


1. git merge(合并分支,保持历史)

  • merge 会把两个分支的历史记录合并保留所有提交记录 ,并生成一个新的合并提交(merge commit)。
  • 它会创建一个 分叉(fork)合并 ,使历史记录不变但会有多余的合并提交。

示例

bash 复制代码
sh
复制编辑
# 假设我们当前在 main 分支
git checkout main
# 合并 feature 分支
git merge feature

如果 feature 分支有新的提交,Git 会创建一个新的 merge commit ,把 feature 的更改合并到 main

示例:合并前

css 复制代码
css
复制编辑
A---B---C  (main)
     \
      D---E  (feature)

合并后

css 复制代码
css
复制编辑
A---B---C---M  (main)
     \     /
      D---E  (feature)

特点: 保留提交历史 ,不会丢失任何提交记录。
适用于多人协作 ,可以清晰看到合并的过程。
可能会产生额外的 merge commit,导致历史看起来比较混乱。


2. git rebase(变基,重写历史)

  • rebase把一个分支的提交移动到另一个分支的最新提交之后不会生成额外的合并提交
  • 它会重写提交历史 ,避免合并时的分叉,使历史记录更线性、更清晰

示例

bash 复制代码
sh
复制编辑
# 切换到 feature 分支
git checkout feature
# 变基到 main 分支
git rebase main

git rebase重新应用 feature 分支上的所有提交,就像它们是直接从 main 分支开始的一样。

示例:变基前

css 复制代码
css
复制编辑
A---B---C  (main)
     \
      D---E  (feature)

变基后

css 复制代码
mathematica
复制编辑
A---B---C---D'---E'  (feature)

特点: 历史记录更整洁 ,避免了额外的 merge commit。
适用于个人开发者 ,提交记录看起来像是从 main 直接创建的,没有分叉。
重写历史,可能会影响协作开发(如果已经推送到远程,别人拉取时可能有冲突)。


3. merge vs rebase 的区别

对比项 git merge git rebase
合并方式 直接合并,创建 merge commit 变基后重新应用提交
是否修改历史 保留所有历史 修改提交历史
是否有额外的 commit 可能有额外的 merge commit 只有线性提交
推荐使用场景 多人协作,保持完整的历史 个人开发,保持清晰的提交历史
是否会引发冲突 有时会产生冲突 可能会有较多冲突

4. 什么时候用 merge,什么时候用 rebase

  • 多人协作时推荐 merge,因为它不会篡改提交历史,团队开发更安全。
  • 个人开发时推荐 rebase,可以保持提交历史干净、线性。

最佳实践:

  1. 在本地使用 rebase,保持自己分支的提交整洁
  2. 在合并到主分支时使用 merge,避免篡改团队历史
  3. 不要对已推送的分支执行 rebase,避免影响团队成员的代码同步

5. mergerebase 的综合使用

如果你想在 feature 分支开发,但主分支 main 更新了,可以使用:

perl 复制代码
sh
复制编辑
# 先切换到 feature 分支
git checkout feature
# 变基 main 分支,获取最新提交
git rebase main
# 解决冲突后继续
git rebase --continue
# 推送到远程
git push origin feature --force  # 如果已推送过,需要强制推送

然后,在最终合并到 main 时,使用 merge

bash 复制代码
sh
复制编辑
git checkout main
git merge feature  # 最终合并

总结

  • git merge 合并分支,保留所有历史,适用于多人协作。
  • git rebase 重写提交历史,避免多余的合并提交,适用于个人开发。
  • 本地用 rebase,远程用 merge,避免破坏团队历史记录

这样,你的 Git 版本控制既清晰,又不会影响团队合作!

相关推荐
Deng9452013145 分钟前
Vue + Flask 前后端分离项目实战:从零搭建一个完整博客系统
前端·vue.js·flask
威迪斯特8 分钟前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构
wuhen_n35 分钟前
JavaScript内置数据结构
开发语言·前端·javascript·数据结构
大鱼前端36 分钟前
为什么我说CSS-in-JS是前端“最佳”的糟粕设计?
前端
不爱吃糖的程序媛39 分钟前
Capacitor:跨平台Web原生应用开发利器,现已全面适配鸿蒙
前端·华为·harmonyos
AC赳赳老秦41 分钟前
2026国产算力新周期:DeepSeek实战适配英伟达H200,引领大模型训练效率跃升
大数据·前端·人工智能·算法·tidb·memcache·deepseek
CHU72903542 分钟前
淘宝扭蛋机抽盒小程序前端功能解析:解锁趣味抽盒新体验
前端·小程序
毕设源码-钟学长1 小时前
【开题答辩全过程】以 基于Springboot的扶贫众筹平台为例,包含答辩的问题和答案
java·spring boot·后端
-凌凌漆-1 小时前
【npm】npm的-D选项介绍
前端·npm·node.js
鹿心肺语1 小时前
前端HTML转PDF的两种主流方案深度解析
前端·javascript