git rebase

1 在上面的过程中,更新代码我使用的是 git pull origin B1 --rebase 而不是 git pull origin B1 这也是平时使用 rebase 注意的一点,git pull 这条命令默认使用了 --merge 的方式更新代码,如果你不指定用 --rebase,有的时候就会发现日志里有这样的一次提交 Merge branch 'dev' of gitlab.xpaas.lenovo.com:liuyy23/lenovo-mbg into dev 什么?自己分支合并到了自己分支,显然这个没有什么必要,而且在时间轴上也不好看,平白无故多了一条线出来,对于强迫症的我来说看着就难受。。。

2 还有就是使用 rebase 之后,如果直接使用 git push origin B1 发现是不好使的,提示也说明了提交失败的原因,我个人是这么理解的,使用 rebase 之后,master分支上比B1分支上多的修改,直接“插入”到了B1分支修改的内容之后,也就是 master 分支的修改在 B1 分支上重演了一遍,相对远程 B1 分支而言,本地仓库的B1分支的“基底”已经变化了,直接 push 是不行的,所以确保没有问题的情况下必须使用 --force 参数才能提交,这也就是官方对 rebase 作为 “变基” 的解释(个人观点)。

3 rebase 会多次冲突,理论上前几次直接取base的,最后一次的处理双方的,但实践中,无法判断当前为最后一次

4 git pull origin base --rebase

=

git checkout base

git pull

git  checkout feature

git rebase base

5 https://blog.csdn.net/q95548854/article/details/98033268

 

此时我们切换到feature分支上,执行rebase命令,相当于是想要把master分支合并到feature分支(这是一个把master新提交拉到我们自己分支的场景(这一步的场景就可以类比为我们在自己的分支feature上开发了一段时间了,准备从主干master上拉一下最新改动。模拟了git pull --rebase的情形)

图可以这样理解,feature分支现在就是 A-B-M-C'-D',M无论提交时间是在C D前后,都放在C' D‘前。

 

官方原文解释(如果觉得看不懂可以直接看下一段):当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支(feature,因为变基后force push)指向基分支(master_dev)的最新提交,最后将刚才提取的修改(提取得feature提交应用到基分支的最新提交的后面

结合例子解释:当在feature分支上执行git rebase master时,git会从master和featuer的共同祖先B开始提取feature分支上的修改,也就是C和D两个提交,先提取到。然后将feature分支指向master分支的最新提交上,也就是M。最后把提取的C和D接到M后面,注意这里的接法,官方没说清楚,实际是会依次拿M和C、D内容分别比较,处理冲突后生成新的C’和D’。一定注意,这里新C’、D’和之前的C、D已经不一样了,是我们处理冲突后的新内容,feature指针自然最后也是指向D’

通俗解释(重要!!):rebase,变基,可以直接理解为改变基底。feature分支是基于master分支的B拉出来的分支,feature的基底是B。而master在B之后有新的提交,就相当于此时要用master上新的提交来作为feature分支的新基底。实际操作为把B之后feature的提交先暂存下来,然后删掉原来这些提交,再找到master的最新提交位置,把存下来的提交再接上去(接上去是逐个和新基底处理冲突的过程),如此feature分支的基底就相当于变成了M而不是原来的B了。(注意,如果master上在B以后没有新提交,那么就还是用原来的B作为基,rebase操作相当于无效,此时和git merge就基本没区别了,差异只在于git merge会多一条记录Merge操作的提交记录

下面这个场景反一反

往公共分支上合代码的时候,使用merge。如果使用rebase,那么其他开发人员想看主分支的历史,就不是原来的历史了,历史已经被你篡改了。举个例子解释下,比如张三和李四从共同的节点拉出来开发,张三先开发完提交了两次(C D)然后merge上去了,李四(M)后来开发完如果rebase上去(注意李四需要切换到自己本地的主分支,假设先pull了张三的最新改动下来,然后执行<git rebase 李四的开发分支>,然后再git push到远端),则李四的新提交变成了张三的新提交的新基底,本来李四的提交是最新的,结果最新的提交显示反而是张三的,就乱套了。

posted on 2022-11-15 16:05  silyvin  阅读(100)  评论(0编辑  收藏  举报