欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

git rebase 使用加图解

程序员文章站 2022-07-13 16:19:06
...

参考:https://blog.csdn.net/chenansic/article/details/44122107#图示

rebase

本地两个分支 一个我的分支 test 一个主分支 master

现在我修改的部分要合并到 master 上,可以有两种选择 merge 或者 rebase

两者的最后得到的结果是一样的,但是区别是 rebase 一个两个分支 就各位了一个分支,test合并前所有的 patch也就是commit 消失了

而merge 则还是两个分支,只不过在merge后这个点交汇

图示

merge

git rebase 使用加图解

rebase

git rebase 使用加图解
为了让分支树看起来更简化,所以我们选用rebase

如何rebase 呢?

首先我的本地代码库都不是最新的,所以先从远端仓库pull一下

git checkout master`
git pull

然后 开始和test分支rebase

git checkout test
git rebase master

这个时候就开始rebase 了,一般情况下rebase都是会有冲突的,详细查看冲突可以用命令git status然后就会显示哪个文件有冲突,然后打开有冲突的哪个文件,会发现有一些“<<<<<<<”, “=======”, “>>>>>>>” 这样的符号。

“<<<<<<<” 表示冲突代码开始

“=======” 表示test与master冲突代码分隔符

“>>>>>>>" 表示冲突代码的结束

<<<<<<<  
所以这一块区域test的代码

=======  
这一块区域master的代码


>>>>>>> 

rebase 和 merge的另一个区别是rebase 的冲突是一个一个解决,如果有十个冲突,先解决第一个,然后用命令

git add -u 
git rebase --continue 

继续后才会出现第二个冲突,直到所有冲突解决完,而merge 是所有的冲突都会显示出来。 
另外如果rebase过程中,你想中途退出,恢复rebase前的代码则可以用命令 
git rebase --abort

所以rebase的工作流就是

git rebase 
while(存在冲突) {
    git status
    找到当前冲突文件,编辑解决冲突
    git add -u
    git rebase --continue
    if( git rebase --abort )
        break; 
}

最后冲突全部解决,rebase成功!!

然后我需要把本地的test 分支push 到远端test分支上然后再给远端的master分支 PR。

但是git push 以后总是提示不让我push 百度了一下发现原因:

比如远端仓库的代码 A 和 B 都 clone 了一份,然后B修改了x.txt文件后push到了仓库, 这个时候 A 就不能直接push了,因为A的x.txt文件没有修改,所以此时A应该把远端的仓库pull一下,merge掉x.txt文件的冲突,才能push所以我这里就犯了一个错误,应该在rebase 前,先把原来本地的test分支push到远端,否则rebase之后就相当于两个人一个人改了文件。另一个人就无法push了。

所以这里需要pull一下 
git pull 
因为是merge所以这里会出现所有的conflict 
git status 
查看 编辑冲突后再 git pull一下,就合并了。 
最后把本地分支test push到远端分支 
git pull 
git push origin test 
最后PR(pull request)即可。

总结

rebase 工作流:

git rebase 
while(存在冲突) {
    git status
    找到当前冲突文件,编辑解决冲突
    git add -u
    git rebase --continue
    if( git rebase --abort )
        break; 
}

merge工作流 :

1.git pull  (或fetch && merge) 
2.编辑冲突文件
3.git pull