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

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

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

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

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

git branch -a –vv

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

git checkout develop

git  log

git checkout develop_fixbug_imageprint

git log

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’。

现在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

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命令的简写。

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

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

我们查看下log。git log

是不是没有了之前的两个commit。

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

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

聊下 git rebase -i的更多相关文章

  1. 聊下git pull --rebase

    有一种场景是经常发生的. 大家都基于develop拉出分支进行并行开发,这里的分支可能是多到数十个.然后彼此在进行自己的逻辑编写,时间可能需要几天或者几周.在这期间你可能需要时不时的需要pull下远程 ...

  2. 聊下 git 多账户问题

    git 多账户问题 标签(空格分隔):git github gitlab git多账户 背景 git 多账号配置 ssh 多密钥对配置 背景 在使用 git 的时候我们都会面临多账户问题,比较常见的就 ...

  3. 聊下git merge --squash

    你经常会面临着将dev分支或者很多零散的分支merge到一个公共release分支里. 但是有一种情况是需要你处理的,就是在你的dev的分支里有很多commit记录.而这些commit是无需在rele ...

  4. 聊下 git 使用前的一些注意事项

    连接方式https.ssh 在使用git的时候,不管你的服务器是开源平台github还是私服gitlab,你都需要clone仓库到本地,这个clone的时候就需要你选择连接方式.这个连接方式决定了你与 ...

  5. 聊下 git remote prune origin

    在你经常使用的命令当中有一个git branch –a 用来查看所有的分支,包括本地和远程的.但是时间长了你会发现有些分支在远程其实早就被删除了,但是在你本地依然可以看见这些被删除的分支. 你可以通过 ...

  6. 使用git rebase合并多次commit

    使用git rebase合并多次commit 聊下 git rebase -i

  7. git rebase实战

    在develop分支上rebase另外一个分支master,是将master作为本地,develop作为远端来处理的. 最后的效果是,develop分支看起来像是在master分支的最新的节点之后才进 ...

  8. git rebase 合并多次提交.

    一.应用场景 为什么需要合并多个提交呢? 常常一个功能的开发,修修补补 commit 了 n 多次,带来的结果就是提交过多过杂,不够直观,究竟哪些提交是对应这个功能的呢?还有就是,如果我要将这个功能迁 ...

  9. [译]git rebase

    rebase就是重新定义你分支的起点, 分支上的commit将生成对应的新的commit并放在你指定的新的起点commit后, 分支上的老commit将被删除. rebase就是将你的分支从一个com ...

随机推荐

  1. 使用yield进行异步流程控制

    现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...

  2. 搞懂$.each和$(selector).each

    $.each:该方法用于遍历任何集合,包括数组和对象 $(selector).each:该方法用于遍历Jquery对象 语法:$.each(obj,callback,args) ①遍历数组 var a ...

  3. canvas 图片拖拽旋转之一——坐标转换translate

    引言 对canvas中绘制的图片进行旋转操作,需要使用ctx.translate变换坐标系,将图片旋转的基点设为坐标系的原点,然后ctx.rotate旋转. 这个时候,因为canvas坐标系发生了旋转 ...

  4. Kooboo CMS - 之后台注册用户流程方法。

    今天决定写一篇好一点的文章,吼吼!首先我们必须找到这个文件,这个文件是UsersController.cs,我们找到和添加新用户有关的方法,如下代码: public virtual ActionRes ...

  5. git log命令全解析,打log还能这么随心所欲!

    git log命令非常强大而好用,在复杂系统的版本管理中扮演着重要的角色,但默认的git log命令显示出的东西实在太丑,不好好打扮一下根本没法见人,打扮好了用alias命令拍个照片,就正式出道了! ...

  6. css3全屏背景图片切换特效

    效果体验:http://hovertree.com/texiao/css3/10/ 一般做图片切换效果,都会使用JS或者jQuery脚本,今天发现,其实只用CSS也可以实现.试试效果吧. 效果图: 代 ...

  7. WNMP集成环境下配置thinkPHP

    在网上查了许多解决方法,下面是自己测试过能行的方法,只需在nginx.conf文件添加内容就可以了. 打开nginx.conf文件 ## Try the requested URI as files ...

  8. Lind.DDD.Utils.HttpHelper关于对HttpClient的正确使用

    回到目录 官方的不一定是对的,机器最能证明一切 不知道从什么时候起,我们在写数据库连接,网络连接,文件操作时会习惯加上using,这种习惯被我们误称为一种模式,但事实上,一切事情都有因有果的,使用us ...

  9. CSS3 float深入理解浮动资料整理

    CSS浮动(float,clear)通俗讲解 CSS 浮动 CSS float浮动的深入研究.详解及拓展(一) CSS float浮动的深入研究.详解及拓展(二) 1.浮动实现图文环绕(理解难点) 浮 ...

  10. 取消IE提示下载安全提问

    需求:在企业访问内部WEB系统下载文件时,IE总会弹出安全提问,征得用户同意后弹出下载保存框.现用户需要点击下载后,直接弹出下载保存框. 方案:这涉及IE安全定义问题,进行相关设置即可.方法如下: