git merage和git rebase合并分支
git merage和git rebase合并分支
在日常开发中,一般工作流程如下:
从主分支上拉取自己的工作分支
修改代码,完成工作
在自己分支上进行了commit
和主分支代码进行合并
推送到远端
向主分支提出合并请求
在完成工作的过程中,主分支上可能已经有了新的内容合入,所以需要合并工作分支和主分支的代码。
合并不同分支一般有两种方式:merage和rebase
git rebase
下面展示用rebase合并分支,达到的“变基”的效果:
- A\B\C\M\N等表示分支上的commit改动
- 变基的通俗解释:work分支是从master的B处拉出的分支,即基底是B;rebase之后,将work的基底变为master的C
rebase之前:
master: A --- B --- C
\
work: M --- N
rebase之后:
master: A --- B --- C
\
work: M' --- N'
rebase操作的思路
$ git checkout work
$ git rebase master
or
$ git rebase master work
#切换回自己的工作分支,执行rebase操作
#中途可以git rebase --abort,让分支还原到开始的状态
#git会提示哪些文件冲突,解决完冲突添加修改的文件
$ git add xxx
$ git rebase --contiune
#rebase是按照commit依次合并,所以可能需要多次contiune
#直到rebase完成
#如果推送到远端,需要-f强制推送
$ git push --force origin xxx
模拟实际操作
feature_work是自己的工作分支,从master分支分离之后,已经有其他内容合入了master分支。
也就是feature_work的主分支基,已经落后于当前master,我们需要把当前master的基替换到feature_work分支下。
操作完成后相当于:feature_work的基底是master最新的(自己修改的一些commit也会替换在最新的master基础上),这样就可以再提交合入主分支的申请。
- 更新本地master分支代码
$ git checkout master
$ git pull
- 切换回工作分支,执行rebase操作
$ git checkout feature_work
$ git rebase master
可以看到信息为"rebase readme"的commit执行合并
并且README.md文件冲突,需要去代码解决
- 添加修改后的冲突文件,执行rebase continue
$ git add README.md
$ git rebase --continue
信息为"start modification"的commit执行合并
start.cpp冲突,重复上述操作,直到所有的commit合并完成
- 这里如果更多commit有冲突,需要重复执行"解决冲突-add file-continue"的操作
$ git add start.cpp
$ git rebase --continue
Applying: start modification
#合并完成,最新的基底已经应用到'start modification'上了
- 提交到远端
#这时代码由于解决了和master的冲突,大概率会和当前分支远端存在冲突;并且没有新的commit产生,所以这时直接push不会成功
#-f强制推送到远端,注意当前分支上其他人的代码
$ git push origin feature_work --force
git merage
git merage操作分支的结构示意
- O是merage后在work分支上新增的commit
merage之前:
master: A --- B --- C
\
work: M --- N
merage之后:
master: A --- B --- C ---
\ \
work: M --- N --- O
操作示例
#确保master代码更新,切换回工作分支
$ git checkout master
$ git pull
$ git checkout work
#执行merage操作,会产生一个Merage xx to xx ...的commit
$ git merage master
#也可以用git merage --abort放弃合并
解决冲突
#添加冲突文件,提交commit
$ git add xxx
$ git commit -m "xxx"
#推送到远端
$ git push origin work
两者的适用场景
在工作分支只有自己在修改的时候,使用git rebase可以减少多余的commit,
但分支是公共分支,有多人修改的时候,rebase可能会扰乱协作,应该使用merage合并分支。
git merage会产生记录merage步骤的commit,有时候会需要这些信息记录。
参考地址
https://blog.csdn.net/weixin_42310154/article/details/119004977
https://blog.csdn.net/mocas_wang/article/details/106750498