避免过多 commit 纪录造成线图繁杂
透过 Rebase Interactive Mode?来将 commit log 进行精简
前言
在开发的过程中,会随着各种原因将代码提交至 local repository 中,并且在完成最终功能的开发后,会将 local 的变动 push 到 remote repository 中;此时为了避免过多无特别意义的 commit 纪录造成线图的繁杂,因此会透过各种方式来将 commit log 进行精简,其中处理方式多为 git reset 或 git rebase 来达成,想知道 reset 处理方式可以参考 [Git] Reset - mixed, hard and soft?内容 ,而此篇文章将针对 rebase 方式进行说明。
环境
- git v2.8.1.windows.1
- SourceTree? v1.3.8.0
实际演练
笔者先随意建立六笔 commit 纪录,以此模拟开发的提交过程,而在完成 func 1 ~ func 5 功能后发现建立了过多提交纪录,因此想要透过 rebase 来调整这些提交纪录;调整的原因有可能是因为?commit message?打错,或者是想要合并一些提交纪录,甚至想要直接移除某次的 commit 纪录(包括异动内容)等,以下透过简单范例来实际体验看看。
执行 git rebase -i 069f5ac
?来进入 rebase 的 interactive 模式,其中 069f5ac 是这个分支最早 commit 节点,表示我们想要调整这个节点(069f5ac)开始至HEAD中间的提交纪录。
执行命令后,在上方会列出所有需要 rebase 的 commit 节点,我们可以依照需求调整个节点前方的命令(command),而各种命令的说明如下方黄色区块所示。调整完上方红色区块命令后,就可以输入 :wq
存档离开编辑模式,接着就会依照顺序(由上至下)逐一执行各列命令来达成 rebase 目的。以下说明。
我们有以下几种常见选择可以调整
- pick: 只接使用这个commit,不做任何调整
- reword:?使用这个commit,只调整 commit message
- squash: 使用这个commit融入前一个commit中,合并两个commit?message来表示(可以修改)
- fixup:?使用这个commit融入前一个commit中,使用前一个commit的message来表示(不可修改)
- drop: 直接移除这个commit
?以下笔者将透过几个简单的例子试试比较常用的功能。
reword
编辑这个 commit 的 message 文字
进入 interactive 模式后默认的命令集如下
按下?i
插入编辑修改 0dd5343 为 reword?后,输入?:wq
存档离开后,直接进行 rebase?
跳出调整 commit message 画面
随意调整一下,执行 i
插入编辑后,输入?:wq
存档离开后,接续进行 rebase?
顺利完成
看一下线图,确实已修改 func 3 的 commit message
使用前后,有异动的 commit 都被调整过(建立新?commit 点),并且顺利 reword?func 3?结点之 commit message 文字
squash
与前个 commit 合并,合并后节点的 message 以两者合并作显示 (可修改)
进入 interactive 模式后默认的命令集如下
按下?i
插入编辑修改 0dd5343 为 squash 后,输入?:wq
存档离开后,直接进行 rebase?
跳出调整两个合并?commit message 画面
调整完毕,执行 :wq
存档离开后,接续进行 rebase
顺利完成
看一下线图,这个 squash commit message 就如同刚刚所设定,合并两者?message 于此新节点。
使用前后,有异动的 commit 都被调整过(建立新?commit 点),并且顺利 squash func 3 & func 2?结点
fixup
与前个 commit 合并,合并后节点的 message 以前者作显示 (不可修改)
进入 interactive 模式后默认的命令集如下
按下 i
插入编辑改 0dd5343 为 fixup?后,输入?:wq
存档离开后,直接进行 rebase?
顺利完成,注意这里不像先前 squash 会跳出 commit message 更改画面
看一下线图(commit message 只保存 func 2 [前一个commit点] )
使用前后,有异动的 commit 都被调整过(建立新?commit 点),并且顺利 squash func 3 & func 2?结点
drop
移除这个 commit 节点
进入 interactive 模式后默认的命令集如下
按下 i
插入编辑改 0dd5343 为 drop?后,输入?:wq
存档离开后,直接进行 rebase?
在 rebase func 4 的时候发生冲突
解决冲突?
因为原本 func 3 的 commit 已经被 drop 了,因此需要解决 func 2?(HEAD) 与 func 4 之间存在的冲突;在此由于不需要 func 3 功能,所以直接把文件中 function 3 文字移除,模拟去除此项功能。
重新 git add
与 git rebase --continue
继续进行 rebase?
重新修改 commit message?
按下 :wq
存档离开后,在 rebase func 5 的时候又发生冲突
解决冲突
重新 git add
与 git rebase --continue
?继续进行 rebase
修改 commit message
顺利完成
看一下线图,func 3消失了
使用前后,有异动的 commit 都被调整过(建立新?commit 点),并且顺利 drop func 3?结点
参考资讯
https://blog.yorkxin.org/posts/2011/07/29/git-rebase/
希望此篇文章可以帮助到需要的人
若内容有误或有其他建议请不吝留言给笔者喔 !
原文:大专栏 [Git] Rebase - 使用 Interactive 模式来精简 commit 纪录
原文地址:https://www.cnblogs.com/petewell/p/11474101.html