git-rebase

git commit 整理小提示

问题

发现目前代码提交的时候,有同事其实可以把debug用的commit可以与实际的改动合成一个[虽然更加建议的是用单元测试和TDD来做开发],但是并没有这样做,导致每次的合入多合入了不少没用的Commit信息。

引导作用

希望可以通过这篇小分享可以达到把Git commit log与历史操作的意图能映射起来,能够快速找出可能当时修改的需求是什么,或者方便找出大概是哪些commit修改过哪部分的模块,达到快速定位,而不用全部靠经验来去问,减少沟通成本的开销

使用工具

git rebase -i $branch_name

branch_name是需要rebase到的分支,可以理解为提交MR的Target分支即可

操作例子

下面会以简单的场景作为例子来展示

上图中有三个commit,本质上是对同一个功能进行修改。但是实际上只有最后一个Commit是有意义的,因此我们的目的是通过改写commit把三个commit的commitlog合成一个,并且保存三个commit的改动的代码。

执行命令后会弹出下图界面

1
git rebase -i develop

根据我们的目的,应该把前置的东西修改成如下状态,然后用Vim的方法进行保存。

(之后会对下面的状态会进行补充说明。
此处描述一下操作的目的,由于git的限制,第一个commit必须不能为Fixup的状态,所以我们实际上的操作要变成把第一个commit的commit log 改写,然后把后面两个的commit 保留代码修改,丢弃后两个的commit log )

然后就会rebase中的状态

查看git status

我们应该使用git commit –amend来继续commit的修改

对其进行修改,我们把红色圈圈的部分修改为下图(实际上即把第三个commit log 的msg作为修改值),然后保存

然后继续

查看git log 

我们成功把三个commit合成了一个commit,并且把commit log改写成了我们想要的样子

Git rebase 参数讲解

pick 代表的是直接复用commit
edit  使用commit,但是需要commiter手动修改commit msg 
reword  使用commit,并且使用在此处修改后的commit msg ( 可以理解为edit + git commit –amend的连击操作)
squash  使用commit,并且把commit msg 直接追加到上一个commit ,如果上图中第二个改写为s,出现的最终commitlog应该为(注意生成结果是一个commit)

1
2
add: translation in output
debug: add log run success

fixup  使用commit,并且丢弃其commit msg ,保留代码的变动
exec  执行其他的shell命令
break 可以理解为打断点,就如果对某个commit的改动不太确定可以通过break停在某个commit上,使用–continue即可继续rebase的流程
drop  丢弃commit
label  对此commit打标签
reset  把head重置到此,这里的reset 是软reset,即此commit后的修改都会保留到git 工作区中,不会消失
merge 直接merge其他的分支或者commit

操作流程整理

  1. 拉取最新的TargetBranch
  2. 切换到开发分支
  3. 执行rebase -i操作 ,根据实际情况来改写commit

PS

  1. 对于是从最新的TargetBranch通过git flow 创建出来的分支也是可以使用rebase的命令来整理commit的