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

相关推荐
IT枫斗者枫哥1 分钟前
UPDATE影响0行,接口却返回成功:把版本冲突接回业务
java·后端
Tyrvision9 分钟前
新品发布前,三维动画怎么排期才不挤在最后一周?
前端
miss18 分钟前
从零做一个可视化规则引擎:Vue3 递归条件树 + 双引擎结果对比
前端·vue.js·typescript
Daorigin_com19 分钟前
道本科技携手DeepSeek:以AI重塑合同全生命周期管理
前端·人工智能·科技·网络安全·数据挖掘·前端框架·传媒
flash俊杰21 分钟前
自动更新工程:electron-updater、差分更新、灰度发布与失败回滚
前端
一帅21 分钟前
Muzzle:给 Java Agent 戴上的"安全口罩"
后端
fastjson_22 分钟前
帆软看板 - 问题收集
linux·前端·javascript
Bazingga27 分钟前
从0到1吃透Function Calling:Spring AI完整实战
后端
写了20年代码的老程序员28 分钟前
想让 AI 改 Bug 快准狠?先给日志加个业务代码坐标
java·后端·apache log4j
据说幸运很容易29 分钟前
从 Run 到 Report:现有框架引入 Allure 的实践
后端·架构