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

相关推荐
Wetoria3 分钟前
管理 git 分支时,用 merge 还是 rebase?
前端·git
大P哥阿豪11 分钟前
Go defer(二):从汇编的角度理解延迟调用的实现
开发语言·汇编·后端·golang
前端开发与ui设计的老司机13 分钟前
UI前端与数字孪生融合新领域:智慧环保的污染源监测与治理
前端·ui
风象南25 分钟前
SpringBoot 与 HTMX:现代 Web 开发的高效组合
java·spring boot·后端
一只小风华~26 分钟前
Web前端开发: :has功能性伪类选择器
前端·html·html5·web
wstcl1 小时前
让你的asp.net网站在调试模式下也能在局域网通过ip访问
后端·tcp/ip·asp.net
Mr_Mao4 小时前
Naive Ultra:中后台 Naive UI 增强组件库
前端
前端小趴菜056 小时前
React-React.memo-props比较机制
前端·javascript·react.js
摸鱼仙人~7 小时前
styled-components:现代React样式解决方案
前端·react.js·前端框架
sasaraku.8 小时前
serviceWorker缓存资源
前端