git rebase 和git merge使用及区别

在 Git 代码管理工具中,git rebase 和 git 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. merge 和 rebase 的综合使用

如果你想在 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 版本控制既清晰,又不会影响团队合作!

相关推荐
我喜欢就喜欢1 分钟前
Chrome 插件开发实战指南
前端·chrome
夕阳_醉了3 分钟前
花了一天的时间,地板式扫盲了vue3所有API盲点
前端·javascript·vue.js
LinDaiuuj13 分钟前
Figma Specs 高效交付与开发协作指南
前端·figma
R²AIN SUITE15 分钟前
项目管理平台怎么和OA、钉钉、飞书、Git仓库打通?从消息通知到双向同步的5种实现路径
git·钉钉·飞书
我命由我1234524 分钟前
5-2.Python 编码进阶 - 字符串进阶(拼接、普通格式化、普通格式化数字精度控制、快速格式化、遍历、常用方法)
java·开发语言·后端·python·学习·java-ee·学习方法
专业程序开发源25 分钟前
django视听资源推荐系统16690-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
风骏时光牛马26 分钟前
大模型底层架构与推理机制源码深度剖析
前端
多客:duokelijie28 分钟前
婚恋交友小程序合规梳理:上线运营需要准备哪些资质与许可手续?
后端·mysql·微信小程序·前端框架·uni-app·php·持续部署
yunwei3732 分钟前
eBPF 实例教程:使用内核跟踪点监控 GPU 驱动活动
linux·后端·性能优化
高频因子挖掘机38 分钟前
别再手动维护股票名称映射表:用 Python 查询交易所元数据
后端·github·api