码迷,mamicode.com
首页 > 其他好文 > 详细

[Git] Rebase - 使用 Interactive 模式来精简 commit 纪录

时间:2019-09-06 12:43:46      阅读:368      评论:0      收藏:0      [点我收藏+]

标签:常用   参考   并且   log   comm   环境   cti   tree   输入   

避免过多 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 addgit rebase --continue 继续进行 rebase?技术图片

重新修改 commit message?技术图片技术图片

按下 :wq 存档离开后,在 rebase func 5 的时候又发生冲突技术图片

解决冲突技术图片技术图片

重新 git addgit 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 纪录


[Git] Rebase - 使用 Interactive 模式来精简 commit 纪录

标签:常用   参考   并且   log   comm   环境   cti   tree   输入   

原文地址:https://www.cnblogs.com/petewell/p/11474101.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!