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

相关推荐
2401_878454531 小时前
Themeleaf复用功能
前端·学习
葡萄城技术团队3 小时前
基于前端技术的QR码API开发实战:从原理到部署
前端
八了个戒4 小时前
「数据可视化 D3系列」入门第三章:深入理解 Update-Enter-Exit 模式
开发语言·前端·javascript·数据可视化
noravinsc5 小时前
html页面打开后中文乱码
前端·html
小满zs5 小时前
React-router v7 第四章(路由传参)
前端·react.js
小陈同学呦5 小时前
聊聊双列瀑布流
前端·javascript·面试
来自星星的坤6 小时前
SpringBoot 与 Vue3 实现前后端互联全解析
后端·ajax·前端框架·vue·springboot
AUGENSTERN_dc6 小时前
RaabitMQ 快速入门
java·后端·rabbitmq
键指江湖6 小时前
React 在组件间共享状态
前端·javascript·react.js
爱宇阳6 小时前
如何在本地修改 Git 项目的远程仓库地址
git