概括

rebase翻译过来为“变基”,可以理解为改变基础,它可以用于分支合并和修改提交记录。

合并分支的区别

我们知道merge操作也可以用于分支合并,但是其和rebase操作有着明显的不同。假定有一个分支foo在B提交处检出了分支bar,接着两个分支各自前进出现了分叉,现在要将bar分支合并回foo分支。

A--B--C----E  foo
\
----D bar

首先使用merge操作,在foo分支下执行git merge bar命令,git就会在当前分支(即foo分支)下生成一个新的commit节点,从而实现分支的合并。

A--B--C----E---F foo
\ /
----D----
bar

而reabse操作合并分支的过程与之明显不同,我们在foo分支下执行git rebase bar命令。

现在来看看rebase操作的合并过程,它先是会暂存当前分支上从分叉开始之后commit节点,然后回退到分叉开始的节点。

stage: C, E

A--B  foo
\
----D bar

接着bar分支上的所有commit被移动到foo分支上,最后再合并之前暂存的节点。

A--B--D--C'--E' foo
\
----D bar

可以看到rebase操作合并之后的提交记录是一条线,而不像merge操作一样变成棱形,因此rebase操作合并分支会让提交记录看起来更加简洁。

工作流程

接下来基于rebase操作设计一个简单的分支协同开发流程,流程分为检出分支前和分支上提交后两个部分。

检出之前先在dev分支上pull以获取分支上最新提交,这样可以减少后续提交时的冲突,当然该步骤不是必须的。

接着便可以检出分支来进行开发,下面是该流程的命令示例。

[origin/dev => dev => ${new_branch}]

(dev)$ git pull
(dev)$ git checkout -b ${new_branch}

开发完成并在本地分支上提交后,就可以进行分支的合并了,首先还是先pull拉取dev分支上的最新提交。

接着分为两种情况,一种是没有其他人提交显示“Already up to date.”,这时候就直接切换到dev分支,然后执行rebase操作合并分支,最后提交到远程。

还有一种当然是有人提交过了,这时候就要先执行rebase操作将dev分支合并到当前开发的分支,接着可能就会出现冲突,需要手动修改冲突后执行git add ${conflict_file}git rebase --continue完成冲突修改。

冲突修改之后的操作和前面是一样的这里不再叙述,详细请参考下面的命令示例。

[${new_branch} => dev => origin/dev]

(${new_branch})$ git pull origin dev:dev
=========IF NOT UP TO DATE=========
(${new_branch})$ git rebase dev
(${new_branch})$ <fix the conflict>
===================================
($(new_branch))$ git checkout dev
(dev)$ git rebase ${new_branch}
(dev)$ git push

修改提交记录

rebase操作除了合并分支,还可以用于提交记录的修改。

当然一般不推荐在多人协同开发的分支上修改提交记录,一来是修改记录时的误操作可能会导致提交数据丢失。

二来是使用rebase修改提交记录后,需要使用--force选项强制推送到远程,假设刚好有其他人提交了代码而你没有及时更新,就会导致其他人的代码被你覆盖掉。

rebase操作修改提交记录其实也很简单,先是执行命令git rebase -i <START> [END],选项-i指的是使用交互式操作方式,后面两个参数是操作的范围。

这里<START>指的是开始的提交记录,而[END]则是结束的提交记录,如果结束的提交记录省略则默认为HEAD。注意这里范围是前面为开区间后面为闭区间,用区间表示为(START, END]。提交记录既可以用哈希值表示,也可以用头指针的偏移值表示,例如HEAD~1表示头指针指向的上一个提交。

上面命令执行完之后,就会出现如下格式的文本,同commit一样都是使用编辑器打开,修改完成后保存即可。

pick acaa54 Add `demo.md`
pick baed03 Add one line

每一行代表一个提交记录,第一个字段是对提交记录的操作命令,第二个字段是提交记录的哈希值,最后则是提交记录的注释。

下面是完整的操作命令和其作用,默认为pick命令即表示使用该提交记录且不做更改。

# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.

总结

虽然rebase操作功能强大,但掌握其正确使用才是重中之重。还有使用rebase还是merge合并分支仍有争议,两种方式各有利弊,这需要团队内部进行权衡选择。

Git Rebase操作的更多相关文章

  1. git rebase 操作撤销

    git rebase可以更改提交历史,在不影响别人的情况下,能够重整git树. 但如果git rebase操作失误,却在push后才发现,怎么撤销rebase操作呢? 使用git reflog + g ...

  2. 解决git rebase操作后推送远端分支不成功的问题

    转:解决git rebase操作后推送远端分支不成功的问题 前段时间在工作中同事在rebase时遇到一个问题来问我,今天突然想起来觉得有必要记录一下. 在我们日常工作中,经常使用git座位代码管理工具 ...

  3. git的学习笔记(一):git本地操作

    1.Git介绍 Git是一个开源的分布式版本控制软件,用以有效.高速的处理从很小到非常大的项目版本管理. Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发. Git ...

  4. Git rebase命令实战

    一.前言 一句话,git rebase 可以帮助项目中的提交历史干净整洁!!! 二.避免合并出现分叉现象 git merge操作 1.新建一个 develop 分支   2.在develop分支上新建 ...

  5. 你真的懂git rebase吗?

    前段时间由于某种原因,开始接手开发公司前端Vue搭建的项目 该前端项目采用的是基于git rebase的形式去合并代码,而我之前使用git一直都是采用merge的形式合并分支代码,对于rebase一概 ...

  6. 【转】git rebase详解

    git合并代码方式主要有两种方式,分别为:1.merge处理,这是大家比较能理解的方式.2.rebase处理,中文此处翻译为衍合过程. git rebase操作讲解例子: cd /usr/local/ ...

  7. git merge 与 git rebase的区别?

    一,git merge 与 git rebase的区别 1,git merge 例如: master分支合并dev分支,git将两个分支dev和master上的所有commit , 按照提交时间的先后 ...

  8. git pull、git fetch、git merge、git rebase的区别

    一.git pull与git fetch区别 1.两者的区别       两者都是更新远程仓库代码到本地. git fetch相当于是从远程获取最新版本到本地,不会自动merge. 只是将远程仓库最新 ...

  9. [置顶] 【Git入门之十】Rebase操作

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12309627 Rebase,衍合?变基?唉,我也不知道要怎么翻译合适...变 ...

随机推荐

  1. BootstrapBlazor实战 Menu 导航菜单使用(1)

    实战BootstrapBlazorMenu 导航菜单的使用, 以及整合Freesql orm快速制作菜单项数据库后台维护页面 demo演示的是Sqlite驱动,FreeSql支持多种数据库,MySql ...

  2. WIN10 使用注册表设置单应用KIOSK模式(不限win10版本)

    注意事项 下载安装Autologon.exe. 以下示例采用账号:- 账户:'KIOSK'- 密码:'KIOSK' 设置步骤 新建用户 1.进入windows设置->账户->其他用户,点击 ...

  3. C++实现矩阵类和向量类

    C++期末作业内容,写完之后觉得过于臃肿,又重新搞了个新的.新的当作业交,旧的拿来给同学参考. [问题描述]请仿照复数类,设计一个矩阵类,设计矩阵类的构成元素 1.编写构造函数完成初始化 2.编写成员 ...

  4. 1.12 Linux已经霸占了服务器领域!

    如今的 IT 服务器领域是 Linux.UNIX.Windows 三分天下,Linux 系统可谓后起之秀,特别是"互联网热"以来,Linux 在服务器端的市场份额不断扩大,每年增长 ...

  5. SQL注入到getshell

    SQL注入到getshell 通过本地 pikachu来复现  前提: 1.存在SQL注入漏洞 2.web目录具有写入权限 3.找到网站的绝对路径 4.secure_file_priv没有具体值(se ...

  6. WPF 制作雷达扫描图

    实现一个雷达扫描图. 源代码在TK_King/雷达 (gitee.com),自行下载就好了 制作思路 绘制圆形(或者称之轮) 绘制分割线 绘制扫描范围 添加扫描点 具体实现 首先我们使用自定义的控件. ...

  7. kernel heap bypass smep,smap && 劫持modprobe_path

    kernel heap bypass smep,smap && 劫持modprobe_path exp1 smep:smep即用户数据不可执行,当 CPU 处于 ring0 模式时,执 ...

  8. 亿信BI——维度转换组件使用

    功能模块: 用户点击"维度转换"模块进行维度转换操作,维度转换页面的顶部导航栏包括基本属性和转换设置两部分. 基础属性: 在基本属性模块部分,编号.标题和类型是必填项且系统已经默认 ...

  9. final变量、方法与类

    学习内容: 一.final变量 1.设定为final的变量,其值不可被改变. 2.final定义的变量必须在声明时对其进行赋值操作. 3.final可以修饰对象.被修饰为final的对象,只能恒定指向 ...

  10. Fail2ban 配置详解 监禁配置(jail.conf)

    ### # 包含配置 ### [INCLUDES] # after = # 在加载本配置文件之后再加载指定的独立配置文件. before = paths-debian.conf # 在加载本配置文件之 ...