1. Git 中 merge 和 rebase 的区别
Rebase 和 merge 都是用于集成某个分支到另一个分支的方法。然而,它们采用的方法不同。Merge 会将两个分支直接合并成一个新的提交。而 Rebase 则是将某个分支的提交复制到另一分支上,然后插入到目标分支的合适位置。
Merge(合并)
git checkout dev
git merge featuremerge
是将两个分支的内容合并成一个新的分支,让这个新的分支包含两个分支的内容。当执行merge时,Git将会创建一个新的commit,合并两个分支的代码。
优点:
- 简单易懂 - merge非常直观和易于理解2. 保留历史记录 - 由于merge创建了一个新的commit,因此可以在历史记录中查看合并的结果,并且不会改变历史记录
缺点
- 会产生冗余的commit- 由于merge会创建一个新的commit,因此可能会产生许多不必要的commit。 例如我们经常遇到的: Merge remote-tracking branch ‘origin/xxx‘ into xxx 问题
- 历史记录较为复杂 - 多个merge操作可能会导致历史记录变得复杂,难以理解。
- 引入冲突 - 当两个分支的修改都影响到文件的同一部分时,merge可能会引入冲突。
Rebase(变基)
Rebase是重新应用提交的命令,将当前分支的修改加到另一个分支上,并使得当前分支包含来自另一个分支的最新修改。当执行rebase命令时,当前分支的提交将会添加到目标分支的最后面。
优点:
- 历史记录简单 - rebase可以使得历史记录更加线性和简单,比merge更容易理解
- 减少冗余的commit - rebase会将当前分支的修改整合到目标分支中,因此可以减少不必要的commit数量
- 少产生脏数据- 当多人共同修改同一文件且merge失败时,rebase可以减少多余的commit,同时尽可能保留原作者的提交记录。
缺点
- 可以改变历史记录 - rebase会改变历史记录,因此需要谨慎使用。
- 可能会丢失提交记录 - 如果由于一些原因,rebase失败,一些提交记录可能会丢失。
- 可能会引入冲突 - 当两个分支都修改了同一个文件的同一部分时,可能会引入冲突。
总之,当Git团队需要保持干净的历史记录时,或者需要对提交的顺序进行控制时,rebase是非常有用的。而在其他工作流程或不需要保存版本顺序的情况下,merge可能是一个更简单的选择。
2. 在Intellij idea 中的使用
场景:假如有一个主分支 master ,另外一个分支 dev,在dev上做了一些改动,想合并到主分支上,有两种方式:merge 和 rebase。
准备:
1.第一步:先将master 分支checkout, 在idea 的git 里 也就是“current”。
2.第二步:鼠标右键 dev 弹窗,merge into current 或 Rebase Current onto selected 执行效果一样(都是将dev 上的修改合并到master 上,只是一个是merge 一个是 rebase 罢了)。
当然 也可以用命令行:
git merge dev 或 git rebase dev 来替代界面操作
假如我们执行的是 Merge into current 操作 可以看出,master 上已经有了dev 上的改动的代码: