通过下面两个git rebase
的应用,我们也学习一下git rebase
交互模式的使用。
(一)修改更早commit的message(重点)
这个命令非常有用,对提交历史进行变更,非用不可的命令。
1、先来看下历史日志
我的需求是修改第三次的commit的message。
2、查看第三次提交的详细信息
执行git log + commit_ID
,会把该对应commit和他之前的commit的详细信息都显示出来。看第一个commit信息,就是我们需要的。
从图中可以看出,分支中第三次提交的message信息是:在temp分支提交temp-test.txt文件
。
3、修改第三次提交的message。(重点)
需要用到命令:git rebase
,变基的操作可以进行交互式操作,需要用到参数-i
。
这里需要注意一下:
- 我们对
temp
分支的第三次提交的message进行变更,因为message是作为commit数据结构当中的一个属性,所以如果要对message进行变更,那么该commit的ID号是肯定要做改变的。 - 其次要变更第三个提交的message信息,这个
rebase
(变基)中这个基,要选择被变更提交的父亲提交为基准点。(这个很重要)
(1)执行变基操作
执行命令:git rebase -i + 父commit_ID
执行上述命令后,会跳转到一个交互页面上。
接下来详细介绍一下交互页面中的内容:
这个页面的意思是说,你在做变基(rebase)的时候,针对某一个commit进行处理策略。
- 第一行
pick 4f890b5 在temp分支提交temp-test.txt文件
说明:
pick
:意思是挑选,我们可以把pick
的位置,换成对应的策略,来重新编辑该提交。
也就是pick
的位置表示对该commit进行怎样的处理,后边表示要处理的是哪个commit。 - 注释中
commands
下边就是各种策略(命令)的介绍。 - 我们这里介绍用到这次用到的命令。(其他的以后在扩展)
我们现在要用的策略就是reword
,
r,reword <commit>=use commit,but edit the commit message
意思是该提交的历史变更信息是要保留的,但是我需要修改这个提交中的message信息。
提示:用r
和reword
都可以,r
表示简写。
(2)编辑修改提交的策略
因为我们要改变4f890b5
提交的message,所以就需要reword
命令。
修改4f890b5
的策略
我们只修改第三次提交,其他的提交不改变。
然后退出保存(:wq!
)即可。
(3)编辑提交内容
上一步操作退出后,还会跳转到一个新的交互页面,如下图:
编辑第一行的mesage的信息。保存退出。
提示:带#
号表示备注,在提交的message中是不会出现的。
出现下图,表示修改成功了。
对提示信息说明:
-
Successfully rebased and updated refs/heads/temp.
:显示执行成功,其实他完成了两个步骤,前边的rebase
帮我们把message处理完毕,后边还把该提交的HEAD指针(commit-id)进行了更新。 - 其实我们在仔细看一下,第二行的开头
detached HEAD ed6984e
,说明是分离头指针状态,且ed6984e
提交是我们之前没有的提交。 - 分离头指针状态其实他有些时候是很有用的,就像现在这个变基
rebase
操作,是离不开分离头指针的,只不过这是一个完整的变基行为,我们无法查看到具体的细节。Git先变成分离头指针状态,把HEAD指针指向了基准点,然后在上边做调整,调整完毕之后提交,把HEAD指针执行最新的提交,如此循环把后边的提交也补充上,就这完成以提交为基准点的变基。
(4)查看版本库中的历史提交日志
通过以上步骤,我们把第三次提交的massage信息修改完成了。
而第三次提交的commit-id也发生了改变,之前是4f890b5
,而现在是ed6984e
这里重点说明:
使用git rebase
命令进行修改指定提交的操作,实际上是以该指定提交的父提交为基准点,进行的变基操作。
不单单第三次提交的commit-id发生了改变,且之后所有的提交的commit-id都发生了改变。
(5)最后,特别要注意
上边所讲的变基(rebase)的行为,是正在自己的分支上做变更,还没有贡献到团队的共享分支上。