应用场景
当我们项目中存在多个分支,有时候我们需要将某一个分支中的一段提交同时应用到其他分支中,如图:
我们希望将develop分支中的C~E部分复制到master分支中,这时我们就可以通过rebase命令来实现(如果只是复制某一两个提交到其他分支,建议使用更简单的命令:git cherry-pick)。
在实际模拟中,我们创建了master和develop两个分支:
develop:
master:
命令使用
我们使用命令的形式为:
git rebase [startpoint] [endpoint] --onto [branchName]
其中,[startpoint][endpoint]指定了一个编辑区间(前开后闭),--onto的意思是要将该指定的提交复制到哪个分支上。
所以,在找到 C (50dfead52c8d59bcda5c1d45d7d4722acfc7dad9)
和 E (286133a430d71d65ea027ea9456306df6631c97b)
的提交id后,我们运行以下命令:
git rebase 50dfead52c8d59bcda5c1d45d7d4722acfc7dad9 286133a430d71d65ea027ea9456306df6631c97b --onto master
如果代码存在冲突,需要我们先解决一下冲突,代码中没有冲突之后执行命名:
git add <conflicted_files>
git rebase --continue
// 或者将退回到rebase之前的状态
git rebase --abort
运行完成后查看当前分支的日志:
可以看到,C~E部分的提交内容已经复制到了G的后面了,大功告成?NO!我们看一下当前分支的状态:
当前HEAD处于游离状态,实际上,此时所有分支的状态应该是这样:
所以,虽然此时HEAD所指向的内容正是我们所需要的,但是master分支是没有任何变化的,git只是将C~E部分的提交内容复制一份粘贴到了master所指向的提交后面,我们需要做的就是将master所指向的提交id设置为当前HEAD所指向的提交id就可以了,即:
git checkout master
git reset --hard <commit id>