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

避免过多 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 纪录

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

时间: 2024-11-01 08:48:45

[Git] Rebase - 使用 Interactive 模式来精简 commit 纪录的相关文章

聊下 git rebase -i

在使用git开发的时候经常会面临一个常见的问题.多个commit 需要合并为一个完整的commit提交. 我们先说第一个合并多个commit为一个完整的commit 我先基于develop主分支拉出一个功能分支(每个人和每个公司对分支的管理都不太一样,这里不需要太纠结.).这里的develop是开发主分支,所有的开发功能代码都需要回归到这个develop分支中去. git branch -a –vv develop_fixbug_imageprint 分支是我基于远程develop分支拉出来的开

git<git rebase冲突解决>

git rebase 使用总结: 使用git rebase 修改以前已经提交的内容 比如要修改之前的commit的 hashcode为:187f869c9d54c9297d6b0b1b4ff47d2ec781a55e 1,git rebase 187f869c9d54c9297d6b0b1b4ff47d2ec781a55e^ --interactive --退回到要修改的commit的前一个点上,执行后,git会调用默认的vi编辑器显示commit到最新commit的所有记录,把我们要修改的那一

git rebase 翻译

1,英文文档: git-rebase(1) Manual Page NAME git-rebase - Reapply commits on top of another base tip SYNOPSIS git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>] [<upstream> [<branch>]] git rebase [-i | --

学习 Git Rebase

有问题为什么不问问神奇的 man 呢? rebase 也算是我比较常用的一个指令了,但是很长时间以来,对这个指令的认识还是不够深刻,于是就找了个时间认真地读了一下 git rebase 的文档.这份文档不需要在网络上查找,在自己的电脑上直接使用 man git-rebase 就可以查看了.在这份文档中,被提到的几个重要的 rebase 参数就是 newbase.upstream.branch.除此之外,-i 也是一个能够极大的提升使用体验的选项,允许我们交互式的选取需要操作的提交. git re

git rebase简介(基本篇)

一.基本 git rebase用于把一个分支的修改合并到当前分支. 假设你现在基于远程分支"origin",创建一个叫"mywork"的分支. $ git checkout -b mywork origin 假设远程分支"origin"已经有了2个提交,如图 现在我们在这个分支做一些修改,然后生成两个提交(commit). $ vi file.txt $ git commit $ vi otherfile.txt $ git commit ...

[git]rebase和merge

转自:http://blog.csdn.net/wh_19910525/article/details/7554489 Git merge是用来合并两个分支的. git merge b # 将b分支合并到当前分支 git rebase b # 把 b分支合并到当前分支 这个和svn有点类似,svn将branch合并到trunk上,也是在trunk的workcopy上,选择要合并过来的branch进行合并 ----------------------------------- 他们的 原理 如下:

Git git rebase 使用

原文:http://gitbook.liuhui998.com/4_2.html 一.基本 git rebase用于把一个分支的修改合并到当前分支. 假设你现在基于远程分支"origin",创建一个叫"mywork"的分支. $ git checkout -b mywork origin 假设远程分支"origin"已经有了2个提交,如图 现在我们在这个分支做一些修改,然后生成两个提交(commit). $ vi file.txt $ git c

git rebase简介

原文: http://gitbook.liuhui998.com/4_2.html 一.基本 git rebase用于把一个分支的修改合并到当前分支. 假设你现在基于远程分支"origin",创建一个叫"mywork"的分支. $ git checkout -b mywork origin 假设远程分支"origin"已经有了2个提交,如图 现在我们在这个分支做一些修改,然后生成两个提交(commit). $ vi file.txt $ git

git rebase原理(转)

git rebase 不会取回代码 要用git fetch先取回, git rebase 是合并代码. (1)首先用git fetch返回服务器上的代码 (2)首先用git rebase origin/master 合并 (3)如果发生冲突了会提示, 然后可以使用git diff查看冲突, 在手工改掉冲突, 在用git add ‘文件名’ 添加修改后文件,最后用git rebase --continue继续没完成的合并 (4)最后就可以用git push 更新到服务器上去. 转自: http:/