赞
踩
参考:
https://blog.csdn.net/weixin_42310154/article/details/119004977
经验:
一般来说,不推荐使用rebase。
但为了让分支树看起来更简化,个人分枝偶尔也会选用rebase。这样可以线性的看到每一次提交,并且没有增加提交节点。 但这样会存在缺陷:公共分支上rebase会打乱且篡改提交记录,若别人想看该公共分支的历史提交记录,它看到的不是完整的历史记录。
并且正在开发的其他分支会定期从master上合并代码,使开发分支保持最新。由于在master执行了rebase,maser历史会形成全新的提交。当合并过来后,git会认为和本地开发分支不一样,增加冲突可能性,更不知道代码提交顺序性,造成许多诡异现象。
1、rebase 的冲突需要一个一个解决,如果有十个冲突,得先解决完第一个,然后执行如下命令后才会出现第二个冲突,直到所有冲突解决完。而merge 是一次性将所有的冲突都显示出来。
- git add -u
- git rebase --continue
- git rebase
- while(存在冲突) {
- git status
- 找到当前冲突文件,编辑解决冲突
- git add -u
- git rebase --continue
- if( git rebase --abort )
- break;
- }
- git pull
- 编辑冲突文件
- git add .
- git commit -m "feat: this is a comment"
- git push
另外,在rebase过程中,若想中途退出并恢复到rebase前的代码,可以用命令:
git rebase --abort
两个分支master和feature,
其中feature是在提交点B处从master上拉出的分支;
master上有一个新提交M,feature上有两个新提交C和D;
此时在feature分支上,执行 git rebase master 命令,相当于是想要把master分支合并到feature分支(这一步的场景就可以类比为我们在自己的分支feature上开发了一段时间了,准备从主干master上拉一下最新改动)。
下图为变基后的提交节点图:
解释下工作原理:
rebase,变基,可以直接理解为改变基底。
feature分支是基于master分支的B拉出来的分支,feature的基底是B。而master在B之后有新的提交,就相当于此时要用master上新的提交来作为feature分支的新基底。实际操作为把B之后feature的提交暂存下来,然后删掉原来这些提交,再找到master的最新提交位置,把暂存下来的提交再接上去(新节点新commit id),如此feature分支的基底就相当于变成了M而不是原来的B了。
(注意:如果master上在B以后没有新提交,那么就还是用原来的B作为基,rebase操作相当于无效,此时和git merge就基本没区别了,差异只在于git merge会多一条记录Merge操作的提交记录)
上面的例子也可实例化为如下工作场景:
张三从B拉了代码进行开发,目前提交了两次,开发到D了;李四也从B拉出来开发了并且开发完毕,他提交到了M,然后合到主干上了。此时张三想拉下最新代码,于是他在feature分支上执行了git rebase master,即把master分支给rebase过来,由于李四更早开发完并合了主干,如此就相当于张三是基于李四的最新提交M进行的开发了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。