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 | add: translation in output |
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
操作流程整理
- 拉取最新的TargetBranch
- 切换到开发分支
- 执行rebase -i操作 ,根据实际情况来改写commit
PS
- 对于是从最新的TargetBranch通过git flow 创建出来的分支也是可以使用rebase的命令来整理commit的