概括

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. EntityFramwork常见问题

    1.常用的语句有哪些 添加migration      dotnet ef migrations add [MIgrationName] 删除刚添加的migration      dotnet ef ...

  2. Bugku CTF练习题---社工---信息查找

    Bugku CTF练习题---社工---信息查找 flag:KEY{462713425} 解题步骤: 1.观察题目,思考题目内容,了解答案是群号 2.这里涉及到好多的信息,首先有网址,第二个是今日头条 ...

  3. [STL] deque 双端队列

  4. Linux中的RCU机制

    什么是RCU? RCU(Read-Copy Update),顾名思义就是读-拷贝-修改,它是基于其原理命名的.对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝 ...

  5. Idea使用入门

    jeecgboot推荐使用的idea是2019,原使用的2017在自动识别maven项目上有点问题,甚至2019在一些报错下仍然可以直接运行项目     idea的安装结构(卸载细节涉及) 下载文件位 ...

  6. 老生常谈系列之Aop--Spring Aop源码解析(一)

    老生常谈系列之Aop--Spring Aop源码解析(一) 前言 上一篇文章老生常谈系列之Aop--Spring Aop原理浅析大概阐述了动态代理的相关知识,并且最后的图给了一个Spring Aop实 ...

  7. 890. Find and Replace Pattern - LeetCode

    Question 890. Find and Replace Pattern Solution 题目大意:从字符串数组中找到类型匹配的如xyy,xxx 思路: 举例:words = ["ab ...

  8. Cocos---简单案例:红气球

    红气球 知识点 场景切换 动画播放,帧事件,Tween 按钮控件 音效管理 案例介绍 开始界面 点击按钮自动进入游戏界面 游戏界面 游戏目的找出红气球,如果点击红气球意味着游戏成功,其余意味着游戏失败 ...

  9. iOS全埋点解决方案-数据存储

    前言 ​ SDK 需要把事件数据缓冲到本地,待符合一定策略再去同步数据. 一.数据存储策略 ​ 在 iOS 应用程序中,从 "数据缓冲在哪里" 这个纬度看,缓冲一般分两种类型. 内 ...

  10. 万字+28张图带你探秘小而美的规则引擎框架LiteFlow

    大家好,今天给大家介绍一款轻量.快速.稳定可编排的组件式规则引擎框架LiteFlow. 一.LiteFlow的介绍 LiteFlow官方网站和代码仓库地址 官方网站:https://yomahub.c ...