上篇博客聊了《git分支管理之rebase 以及 cherry-pick相关操作》本篇博客我们就以Learning Git中的关卡进行展开。下方列举了LearningGit中的 merge、rebase、reset、revert、cherry-pick 以及交互式rebase相关关卡的操作以及对应的解析。后边在聊交互式rebase操作是,不单单给出了LearningGit中的内容,而且给出了真正的Git分支在交互式rebase操作时的具体案例。

learngitbranching的地址为:https://learngitbranching.js.org/

一、代码合并

在下方示例中所有目标的初始化状态是下方这样的,然后我们要按照目最终目标,使用相关的git命令来达到相关的目标。

Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

1、git merge

下方就是我们要达到的目标,下方是我们达到下方目标所要做的事情:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

下方对应的就是我们实现上述目标所对应的命令操作,具体如下所示:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

 2、git rebase 

闯完git merge的关,我们来看一下git rebase的关。下方就是我们最终要实现的目标。实现下方目标和上面的merge操作差不多,只不过最后一步不是使用合并操作,而是在bugFix上执行变基操作,具体分析如下:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

下方是我们的具体命令操作:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

二、分离HEAD

1、移动HEAD指针

HEAD指针是指向当前所在的操作分支,比如我们现在是在master分支,那么HEAD就指向master分支,然后master分支指向的是我们的commit号。分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。下方左边的图就是我们要完成的目标,右边是我们分支的初始化状态。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

实现上述目标一行命令足矣,可以使用 git checkout C3 命令就可以将HEAD命令指向C3提交上。git checkout HEAD^ 命令可以将HEAD指针向上移动一个距离,git checkout HEAD~3 则可以将HEAD向上移动三个距离。具体操作如下所示:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

2、在提交树上移动分支

下方要完成的不单单是HEAD指针的移动,而是分支指针的移动,在Git上可以移动你所创建分支的指向,使其指向任意提交过的分支上。下方就来看一下如何在git上移动分支指针,下方左边是我们要完成的目标,右边是分支的初始化状态。需要做的事情如下:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

需要操作的命令如下所示:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

3、撤销操作

接下来我们来看一下撤销操作,同样左边是我们要完成的目标,右边是初始状态。从下方的目标中我们可以看出 local 分支的撤销操作是使用的 git reset 操作的, 因为是在本地来向上移动的,进行reset后是不可以push到远端的。而push分支使用的是revert操作,撤销了C2的提交后,再C2的基础上又生成了一个新的提交。reset 操作是不可以被push到远端的,而revert则可以,稍后会进行实验。下方会有具体的操作。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

下方就是我们为了完成目标而又的具体的操作:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

如果你reset某个提交,想在将分支号移动到之前的提交上,可以使用上面的 git branch -f 操作,将相应的分支移到相应的提交上。下方是将 local 分支又移动回了C3, 如下所示。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

接下来我来看一下对 reset 后的分支进行push, 以及对 revert 分支后进行push。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

下方我们再做个尝试,在一个分支上进行了reset , 然后在reset后的分支上做了一些提交。最后我们将这些提交进行push,然后看一下具体的效果。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

三、cherry-pick和交互式rebase

之所以将这两个放在一块,是因为使用两者都可以达到相同的目标,只是操作不同。下方会分别介绍。

1. cherry-pick

下方我们来看一下cherry-pick这一关,下方我们需要将 bugFix 分支上的 C3 、side 分支上的 C4 以及another分支上的C7通过cherry-pick的形式拿到 master分支上。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

下方主要还是使用了cherry-pick来达到我们的目标的,主要还是一个命令的使用 , 在 master 分支上执行 git cherry-pick C3 C4 C7, 可以将C3 C4 C7这三个提交摘到master分支上了。具体如下所示:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

2、交互式rebase

解析我们来使用交互式rebase来做节点的迁移,当然下方的操作也是可以使用cherry-pick来完成的。左边是我们要完成的目标,右边则是初始化状态。我们需要将C2 C3 C4 C5的提交顺序转换成C3, C5, C4的顺序。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

下方就是我们交互式rebase操作的具体步骤,本质上就一个命令 git rebase -i HEAD~4, 然后操作相关的节点即可。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

3、交互式rebase实践

接下来我们来看一下在真正的git分支上是如何使用交互式rebase操作的。下方是做交互式rebase操作之前的分支关系。目前所在的分支是bugFix, 其中有4个提交。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

现在要做的是在bugFix上进行交互式rebase, 在终端中输入 git rebase -i master, 目的是将 bugFix 分支上的提交通过交互式rebase的方式将其变基到master分支上。下方是输入git rebase -i maste命令后所出现的界面,我们可以通过vim编辑器编辑将要执行的变基操作。下方是对应的几种交互式命令

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

下方我们对相关操作执行的交互式的操作:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

点击回车键的话会弹出下方的vim编辑器来让你修改 f53560c 这个操作的commit message,修改完毕后进行保存即可。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

下方是在rebase合并时产生了冲突,我们需要对冲突进行解决。解决完毕后,执行 git add 将冲突文件进行存储,并且执行git rebase --continue 来继续我们的rebase操作。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

经过一系列解决冲突的操作,最终我们的rebase操作是成功的,会提示下方的 Successfully。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

交互式rebase操作成功后,接下来我们来看一下当前分支的情况,,从结果中我们不难看出:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

4、交互式rebase的squash操作

接下来我们来看一下squash的操作,下方我们会在当前所在分支和上次提交上执行squash操作,其对应的命令的为:git rebase -i HEAD~1,如下所示:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

我们对该操作执行squash命令,如下所示,编辑完进行保存即可。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

保存后会出现下方的操作,目的是用来编辑两次提交合并后的commit message 的。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

编辑完保存即可,下方就是我们进行上述操作后所对应的相关信息。

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

5、交互式rebase的另一个示例

接下来我们来看一下另一个交互式rebase的示例,完成下方的目标,我们需要做下方几步:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP  

下方就是对应的具体命令操作:

  Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase-LMLPHP

今天博客就先到这儿吧,下篇博客继续聊git相关的内容。

05-07 15:27