无论是开发、运维,还是测试,大家都知道 Git 在日常工作中的地位。
而且众多 Git 命令当中,Git rebase 和 Git merge 都是可以将一个分支的修改合并到当前分支当中去。
但是,如果由于使用不当会造成很多不必要的麻烦,这不,公司新来个技术总监有次就发飚了:谁再乱用 Git rebase 直接开除。。。。。
所以,今天我们一起好好探讨一下这两个命令的作用与区别在哪?到底怎么用合适?
git rebase(变基) 命令:复制当前分支的所有最新提交,然后将这些提交添加到指定分支提交记录之上。
git rebase还提供了 6 种操作模式:
下图介绍了经过 rebase 前后提交历史的变化情况。
现在我们来用一个例子来解释一下上面的过程。
假设我们现在有2条分支,一个为 master ,一个为 feature/1,他们都基于初始的一个提交add readme
进行检出分支,之后,master分支增加了3.js
,和4.js
的文件,分别进行了2次提交,feature/1也增加了1.js
和2.js
的文件,分别对应以下2条提交记录。
master 分支如下图:
feature/1分支如下图
结合起来看是这样的
此时,切换到 feature/1 分支下,执行 git rebase master
,成功之后,通过 log 查看记录。
如下图所示:可以看到先是逐个应用了 mater 分支的更改,然后以 master 分支最后的提交作为基点,再逐个应用 feature/1的每个更改。
所以,我们的提交记录就会非常清晰,没有分叉,上面演示的是比较顺利的情况,但是大部分情况下,rebase 的过程中会产生冲突的,此时,就需要手动解决冲突,然后使用git add
、git rebase --continue
的方式来处理冲突,完成 rebase,如果不想要某次 rebase 的结果,那么需要使用 git rebase --skip
来跳过这次 rebase。
fast-forward模式
no-fast-forward模式
合并冲突修复的过程 ,动画演示如下:
不同于 git rebase的是,git merge 在不是 fast-forward(快速合并)的情况下,会产生一条额外的合并记录,类似Merge branch 'xxx' into 'xxx'的一条提交信息。
另外,在解决冲突的时候,用 merge 只需要解决一次冲突即可,简单粗暴,而用 rebase 的时候 ,需要一次又一次的解决冲突。
git rebase 和 git merge 主要差异是什么?最近ChatGPT大火,请它来回答一下:
Git merge 将两个分支中的所有提交都合并到一起,并创建一个新的合并提交,保留了历史记录。这导致了 Git 历史记录中出现多个分支合并点的情况,从而使历史记录更加复杂。
Git rebase 是将一个分支的提交序列“拉直”,并且将其与另一个分支合并。这意味着,提交历史看起来好像是一条直线,没有分叉,因此整个提交历史看起来更加整洁,历史记录保持相对简单。
总的来说,Git rebase 可以提供更整洁的提交历史,但它需要更多的注意力和精细的操作,因为它可能导致原有的提交变得不可用。Git merge 则是更为保守的合并方法,它更简单,但历史记录更加复杂。因此,选择哪种方法取决于团队和项目的需求和偏好。
merge 命令一般用于将开发分支、热修复分支等合并到主分支上,因为该命令不会修改分支的历史信息,只会增加新节点,非常适合主分支这种稳定性且需要用于版本控制的分支上。
rebase 命令一般用于将基分支的新提交记录,合并到正在进行开发任务或修复任务的分支上,因为该命令能保证开发分支的历史与基分支的历史保持一致,从而减少污染性。
但要注意,rebase 命令最好不要用于一个公共的分支,假设你们公司的开发分支是一个公用的分支,此时多人在这个分支上开发,由于rebase的修改历史的特点,可能会出现丢失修改的问题,对于这种运用,建议团队之间进行沟通后决定使用merge或rebase来保证该公用开发分支的可用和完整。
rebase 和 merge优缺点和用法各个团队不一样,因人而异。业界没有定论。如果没有充分理解 rebase,还是老老实实用 merge 吧。用 merge 肯定在功能上不会出问题的!
引用官方文档一句话:总的原则是,只对尚未推送或分享给别人的本地修改执行rebase(变基)操作清理历史,从不对已推送至别处的提交执行 rebase(变基)操作,这样,你才能享受到两种方式带来的便利。
所以,千万不要乱用。
注:部分内容来自https://blog.csdn.net/qq_24147051/article/ details/118050241