聊下 git rebase -i

在使用git做为源代码管理工具的时候,开发的时常常会面临一个常见的问题,多个commit 须要合并为一个完整的commit提交。git

在一个基本的迭代周期里,你会有不少次commit,有跟配置文件相关的,有跟代码相关的,甚至有跟下次发布fixbug相关的。这些都是你在完成本地开发的时候一个变化记录而已。可是当你须要将你的迭代项目做为一次发布提交时就须要整合全部以前提交的那些很零碎的commit。工具

根据基本规范,你的commit应该相似"release:20161023_imageprint",在此commit里应该是完整的提交。3d

合并多个commit为一个完整的commit

我先基于develop主分支拉出一个功能分支(每一个人和每一个公司对分支的管理都不太同样,这里不须要太纠结。)。这里的develop是开发主分支,全部的开发功能代码都须要回归到这个develop分支中去。blog

git branch -a –vv事务

1

develop_fixbug_imageprint 分支是我基于远程develop分支拉出来的开发分支,我会基于这个分支来fix一些bug。咱们分别看下develop、develop_fixbug_imageprint  commit log。开发

git checkout developget

git  logit

2

git checkout develop_fixbug_imageprinttest

git log原理

3

develop_fixbug_imageprint的commit log是和devleop commit log 如出一辙。咱们如今切换到develop_fixbug_imageprint进行一些操做。

添加一个1.txt文件,而后git add . ,git commit –m’add 1.txt’。

再添加一个2.txt 文件,而后git add . ,git commit –m’add 2.txt’。
4

如今develop_fixbug_imageprint分支里有两个commit。这两个commit都是为了fix当前这个bug而作的两个提交。如今咱们要合并代码上主develop分支。总不能把这两个commit直接提交上去,这里还好只有两个commit,可是通常项目开发周期两个星期的话,你起码有十几个commit。那这样提交上去以后就很难管理和跟踪。(我之前都是这样干的,如今发现这样很差跟踪管理。)

那么咱们如何完成这个合并commit尼,就须要用到git rebase 命令。

先来解释下git rebase 。你其实能够把它理解成是“从新设置基线”,将你的当前分支从新设置开始点。这个时候才能知道你当前分支于你须要比较的分支之间的差别。

好比,develop_fixbug_imageprint分支是来自develop分支,那么从test commit开始后面咱们基本上都是各自发展,如今在develop_fixbug_imageprint分支上有两个commit,咱们须要找一个基准,这个基准就是git须要找到哪些是你后来提交的commmit,总的有个参照。

git reabse –i develop

5

git rebase 立马知道develop与develop_fixbug_imageprint之间的差别。由于咱们是基于develop设置rebase的。git rebase –i ,这里的”-i“是指交互模式。就是说你能够干预rebase这个事务的过程,包括设置commit message,暂停commit等等。

这里咱们要求很简单就是合并以前的commit且从新设置commit message。

咱们设置第二个”pick 657a291 add 2.txt” 为” s 657a291 add 2.txt”这里的s就是squash命令的简写。

6

跳出来了一个临时文件,最上面是两行commit message。咱们修改下这个整体的commit message。

7

删除以前的两条message(ESC dd),设置一总的message 而后保存退出。(ESC wq)

8

咱们查看下log。git log

9

是否是没有了以前的两个commit。

原理很简单:rebase须要基于一个分支来设置你当前的分支的基线,这基线就是当前分支的开始时间轴向后移动到最新的跟踪分支的最后面,这样你的当前分支就是最新的跟踪分支。这里的操做是基于文件事务处理的,因此你不用怕中间失败会影响文件的一致性。在中间的过程当中你能够随时取消rebase 事务。git rebase –abort

在进入git rebase –i 交互模式,你能够作的事情就不少了,能够设置edit 编辑commit 内容,可让他暂停commit操做。等等。

相关文章
相关标签/搜索