微知识-git rebase常用的3个场景和2个本质

如何修改历史提交的commit 的msg信息 r

- git rebase -i xxxx 其中xxx是需要修改的commit的father , -i 是指交互式

- 将pick 修改为r 表示修改commit msg

- 其他的不要动

git rebase的原理是,在交互式界面好比是输入命令,然后把所有需要操作的commit进行一些命令操作。然后在命令行指定的-i xxx 主要是让git rebase自动帮我们从某个commit开始把他的子节点遍历放上去

如何将多个连续的commit合并到一起

原理和前面类似,掌握了rebase的底层原理其实就是 rebase的命令 + commit的obj的sha1数字指针

- git rebase -i xxx

- 由于rebase会根据-i 遍历所有子节点,但是可能只需要修改某几个,就只修改某几个

- 将需要把A B C D合并到一起,假设A最先提交,BCD最后,那么都合并到A,然后在A前面依然是pick,然后修改BCD的都为s,squash压缩类似压缩饼干。他这里s命令的作用就好比把当前commit合并到前一个commit中。所以abcd合并到一起,本质是把bcd压缩到a中。然后bcd压缩到他们前面,就可以用rebase到的s命令。

- 然后弹出交互信息,添加一行交互信息并且提交

这里透出一个本质 rebase -i之后,好比是rebase的子命令脚本,他会根据这个脚本依次处理。不处理的就用pick 需要处理的就用其他命令。比如s是把他压缩到前面。r是当前commit修改msg。

而且这里的操作对象都是每个commit,然后相当于rebase是修改不同commit进行一些操作。

另外还有一个场景,如果要把不连续的每个commit如何整理到一起呢?把握了本质rebase运行机制,很快处理。把rebase当做一个脚本,然后在脚本中顺序指定需要操作的commit,如果要合并多个不连续的,就选择一个pick,其他的放在他后面使用s 进行压缩进去就行了。

这里的2个本质总结一下:

  1. rebase -i 本质是开启一个rebase的处理脚本,并且是一行行顺序直行
  2. 操作的对象是commit信息,操作的命令是p r s。commit本质是gitobj

如果把自己当做git的设计者,这里rebase命令,会先读取rebase -i指定的脚本,然后依次读取每行,然后根据每行的子命令进行处理。比如如果是r就修改这个msgid,本质是修改git obj的msgid。如果是s,应该是把其他几个commit或者obj的diff进行merge,然后合并,但是不会删除其他obj,保留s到前面的那个obj,并且修改那个obj

其他rebase的cmd后期补充

后记:

通过把rebase当做一个脚本,操作commit,假设是设计者对commit序列化的进行一些合并 重命名操作obj,从而能够灵活的理解和掌握git,并且不用死记硬背。

更多git本质的理解以后逐渐更新。

相关推荐
GoppViper2 小时前
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
笔记·git·后端·学习·golang·github·源代码管理
m0_464832363 小时前
Linux服务器上安装git lfs命令
git
贩卖纯净水.10 小时前
白月光git
git·github
爱吃瓜的猹z14 小时前
git reset 几点疑问
git·源代码管理
悟空201620 小时前
001、Git开发流程规范
git
Li小李同学Li20 小时前
git学习【持续更新中。。。】
git·学习·elasticsearch
晨春计1 天前
【git】
android·linux·git
念幽1 天前
Git常用命令
git
神技圈子1 天前
【git系列】git中的那些迷惑的术语以及概念详解
git
benben0441 天前
Photoshop使用方法大全
git