Git Rebase
尽量合理使用Rebase
,而不是大量使用merge
,原因很简单,多人开发情况下,使用Git merge
会造成大量分支交叉的情况,代码结构看起来很乱,强迫症者很难受。
但是,使用Git Rebase
也要合理,尤其是在主分支(master
/main
)上,禁止在主分支上执行Git Rebase
操作,理由是Git Rebase
操作会修改commitID
,当有别人在主分支拉取代码了之后,你又在主分支执行rebase
操作,有可能会导致主分支的commitID
改变。
所以,我建议以feature
为单位,如果多个人处理一个feature
的时候,可以采用rebase
操作,但是再合并到主开发分支,或者主发布分支的时候,采用squash and merge
操作来减少非必要的commit
消息,同时保证主分支的commit
安全性。
流程介绍
首先我的项目有四个分支分别是:main
、dev
、dev-0
、dev-1
;
这三个分支分别是主分支,开发分支,业务人员0的开发分支、业务人员1的开发分支;
初始的分支情况如图所示:
此时,main
分支提交了一个commit<main分支提交第1次>
,dev
分支提交了一个commit<dev添加第1次>
,dev-0
和dev-1
此时从dev
分支创建。
第一步:dev-0提交
我们在dev-0
分支提交几次commit
,提交后的图如下图所示:
此时dev-0
提交了几个分支。
第二步:dev-1提交
我们在dev-1
分支同时也提交几次commit
,提交后的图如下图所示:
此时dev-0
和 dev-1
彼此之间的分支远离开了。
第三步:dev-0和dev-1合并
dev-0
和 dev-1
开发完毕需要合并分支提交测试了,此时我们使用git rebase
操作,如下:
假如我们最终用dev-0
的分支提交测试,此时我们执行:
git checkout dev-0 # 切换到dev-0分支
git rebase origin/dev-1 # 变基到dev-1分支上
此时可能会发生冲突,我们根据提示,解决冲突,执行git add
+ git rebase --continue
,直到出现successful
提示,这表示我们变基成功。
此时分支情况如下图所示:
此时我们的dev-0
已经成功变基在dev-1
的提交上了,此时我们可以将我们的提交push到dev-0
的远程分支上,执行:git push -u origin dev-0
会报错,如下图所示:
因为本地的dev-0
通过rebase
操作添加了dev-1
的三个commit
而远端的dev-0
还没有这三个commit
,所以会导致push
失败,此时我们需要强制push
,执行git push -f origin dev-0
此时的提交图如下图所示:
此时dev-0
和 dev-1
的所有更改都在 dev-0
上。
第三步:dev-0合并到dev分支
接着我们将dev-0
合并到 dev
分支上
此时我们通过git
来创建一个pull request
, 并且在选择合并方式时选择squash and merge
,将多个commit
消息合并成一个commit
再执行提交,再界面上输入合并后的commit
消息
此时合并后的分支结构如下图所示:
dev
分支上新增一个commit
消息,这个时候就已经完成了开发分支的合并工作了,此时只需要根据开发分支去提测就行了😇😇
第四步:简单回滚操作
如果出现问题了怎么办,可以通过回滚操作来回退之前的版本,例如,我们新提交的这个分支有问题,我们需要回退到之前的版本怎么办,通过git reset
命令来操作:
git reset "需要回退到哪个版本,这里填那个版本的commit ID"
git push -f origin dev
此时分支结构图如下:
此时dev
分支已经回退到上一个版本了,可以通过对dev-0
分支再次执行修改操作,然后再通过创建squash and merge
请求合并到dev
分支上。
结语
Git
的操作有很多,但是一定要注意团队开发内部需要统一规范操作,否则等到项目越来越大的时候,维护会变得越来越困难。- 多人合作开发的时候,要养成定期
git fetch
的习惯,并且每隔一段时间合并一次代码,而不是开发完成后再合并,避免冲突爆炸。