注:接下来的演示操作仍将以SourceTree这个可视化工具为例。
个人感觉rebase这个功能有点多余,其实merge操作已经覆盖了它的功能。可能就是为了让整个commit看起来更顺畅一下,没有那么多的旁路分支,不那么杂乱。虽然个人不是很喜欢这个功能,但是很多开源库的作者再你提pr的时候都会要求你rebase到它最新的master分支上,这样作者评审代码的时候可能会更方便。
所以在这里给大家介绍下如何将某个分支rebase到另外一个分支上。
操作步骤
假如有如下的分支结构,我们希望将test分支rebase到master分支上。
-
首先需要确保master和test分支的代码都是最新的代码(没事git pull一下),而且当前分支是test分支。
-
然后,我们在master的M-A 这次提交上,右键点击【Rebase children of xxx interfactively】,如下图:
在这里我们可以选择是否需要将4次commit合并为1次commit,如果需要则点击【Squash with previous】即可,具体操作可见这篇文章的第11小节。不合并就直接点击OK,如下图:
点击之后一般都会有冲突,如下:
不用担心,点击Close关闭弹框即可,然后使用source tree解决冲突。在这里有一点需要特别注意:
rebase解决冲突时,与我们常规的merge解决冲突的Theris和Mine是反的。即这里的Theirs代码的是test分支上的内容,Mine代表的是master分支上的内容 -
解决完冲突之后,不要进行commit,保持你是如下这样的页面:
-
然后打开git命令行工具,可以看到提示说:所有冲突都解决了,请使用
git rebase --continue
命令。
那我们就输入这个命令即可,如何提示还是有冲突那就继续解决。当所有的冲突都解决完了,git会告诉我们rebase已经成功了,如下图:
此时我们就可以看到现在的test已经rebase到了master上(只是本地rebase好了,还并没有推送到远端哦): -
但是这里又需要我们特别注意:git告诉我们本地的test分支与远端的test分支不一致,需要我们先把那5个提交pull下来,这里一定不要pull,否则就会额外多了一个merge操作。 ( 不过如果你的test分支远端不存在的话(都是自己本地提交的),则不会有这个问题,在这里直接
git push
上去就行。)
所以在这里使用git push --force
直接强推上去。 -
rebase完成。
Q&A
Q1: 如果我之前已经习惯了使用merge,我自己的test分支上有很多提交都是从其它分支上merge过来的,而且已经解决了不少的提交。现在要rebase到master上肯定这些冲突还会再次出现,只能一个个手动解决吗?
A: 非也。首先从master merge到test上(确保后续的rebase冲突可以很好解决),然后基于当前test创建一个临时分支,将这个临时分支rebase上去。创建临时分支的操作如这里的3.1小节所介绍。这里简单解释下操作(首先保证当前分支为test分支):
//创建临时分支
git checkout --orphan tmp
//添加所有并提交
git add .
git commit -m "创建临时分支并本地提交"
最后,将tmp分支rebase到master即可,你会发现冲突很好解决,基本使用【Resolve using “Theirs”】就可以。
Q2: SourceTree这里的rebase是什么意思?与下面的rebase有什么区别?
A2: 本质行一样,没什么区别。下面的哪一个功能更丰富一点,可以让我们选择是否要【Edit Message】和【Squash commits】。文章来源:https://www.toymoban.com/news/detail-758373.html
Q3: rebase过程中,后悔了咋弄?不想rebase了。
A3: 执行git rebase --abort
就行,恢复的干干净净,不会影响你的代码。文章来源地址https://www.toymoban.com/news/detail-758373.html
到了这里,关于【Git】如何使用sourcetree进行rebase操作(变基)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!