git将一段commit合并到另一个分支

作者 by adtxl / 2021-07-01 / 暂无评论 / 450 个足迹

部分转载自https://www.jianshu.com/p/4a8f4af4e803

当我们项目中存在多个分支,有时候我们需要将某一个分支中的一段提交同时应用到其他分支中,就像下图:

image.png

我们希望将develop分支中的C~E部分复制到master分支中,这时我们就可以通过rebase命令来实现(如果只是复制某一两个提交到其他分支,建议使用更简单的命令:git cherry-pick)。
在实际模拟中,我们创建了master和develop两个分支:

master分支:

imagec28c7f66487d832e.png

develop分支:

imagec212f9ea6a316d7c.png

使用如下命令:

git rebase [startpoint] [endpoint] --onto [branchName]

其中,[startpont] [endpoint] 指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。因此,为了让这个区间包含C提交,我们将区间起始点向后退了一步。
--onto的意思是要将该指定的提交复制到哪个分支上。
所以,在找到C(90bc0045b)和E(5de0da9f2)的提交id后,我们运行以下命令:

git  rebase   90bc0045b^   5de0da9f2   --onto master

运行完成后查看当前分支的日志:

image327f14cbb705b4d7.png

可以看到,C~E部分的提交内容已经复制到了G的后面了,大功告成?NO!我们看一下当前分支的状态:

imageb66f20caffa02b66.png

当前HEAD处于游离状态,实际上,此时所有分支的状态应该是这样:

image00669c988f01e718.png

所以,虽然此时HEAD所指向的内容正是我们所需要的,但是master分支是没有任何变化的,git只是将C~E部分的提交内容复制一份粘贴到了master所指向的提交后面,我们需要做的就是将master所指向的提交id设置为当前HEAD所指向的提交id就可以了,即:

      git checkout master
      git reset --hard  0c72e64

image5578f36f241dc96d.png

独特见解