13.Git分支-变基(rebase)、rebase VS merge
1.变基的基本操作
在Git中整合来自不同分支的修改主要有两种方法:merge和rebase。
看下面的例子: 开发任务分叉到了两个不同的分支,并且都有了新的提交。

这时候我们可以使用 git merge 命令将experiment分支合并进入master分支,Git会将C3、C4以及两者最近的共同祖先做一个三方合并,并且生成一个新的提交。如下图所示:

其实我们还可以使用rebase命令:rebase命令将提交到某一分支上的提交都移至另一个分支上
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
如下图所示: 使用rebase之后,将experiment分支上的提交移动到了master分支的后面。

原理:首先找到两个分支(当前所在分支experiment和目标基底分支master)的最近共同祖先(即C2),然后对比当期分支相对于最近共同祖先的所有提交,提取相应的修改存为临时文件,然后将当前分支指向目标基底(即C3),最后将此前存好的临时文件依次应用(理解为将从当前分支上,从最近共同祖先开始的后一个提交节点,开始复制,放到目标基底后)。
完成rebase操作之后,可以运行以下命令,进行一次快速移动。
$ git checkout master
$ git merge experiment
操作完成之后,提交历史如下图所示。

与直接使用merge命令相比,rebase命令可以使提交历史更加的整洁,看上去就像是一条直线。使用rebase的目的是是提交历史看起来更加的整洁,其实,无论是通过merge还是rebase,整合的最终结果都是一样的,只不过rebase的提交历史看起来更加的整洁。rebase是将一系列提交按照原有次序依次应用到另一分支上,而merge是将最终结果merge在一起。
2.rebase VS merge
对于rebase和merge哪种好,有两种观点:
1.有一种观点认为,仓库的提交历史即是记录着实际上发生过什么,它是一种历史文档,本身具有价值,不能随意修改,这些历史应该被保留下来,供后人进行查阅。这种观点支持使用merge而不是rebase。
2.另一种观点正好相反,他们认为提交历史是项目开发过程中发生的事情,没有人会出版一本书的第一版草稿,都是需要进行多次修订之后才能进行出版的,修订之前的这些历史不应该被读者看到。这种观点鼓励使用rebase。
总的原则:只对尚未推送或分享给他人的本地修改执行rebase操作清理历史,从不对已经提交到别处的提交进行rebase操作。
13.Git分支-变基(rebase)、rebase VS merge的更多相关文章
- git常用命令速查:创建,修改提交,撤销,切换分支,合并分支,变基解决冲突
创建 $ git init #在当前目录下创建一个空的本地仓库 $ rm -rf .git #删除本地仓库 $ git add . #把当前目录下的所有文件添加到暂存区 $ git commi ...
- Git (13) -- Git 分支 -- 分支的新建与合并
@ 目录 0.准备工作 1.新建分支 一个简单提交历史: 创建一个新分支指针: iss53 分支随着工作的进展向前推进: 基于 main 分支的紧急问题分支 hotfix branch: main 被 ...
- Git知识总览(四) git分支管理之rebase 以及 cherry-pick相关操作
上篇博客聊了<Git知识总览(三) 分支的创建.删除.切换.合并以及冲突解决>,本篇博客我们主要来看一下 rebase 变基相关的操作.rebase 操作和 merge 操作最终都可以达到 ...
- Git-merge & rebase(变基)
在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase. merge: merge有两种方法,fast-forward(快速合并)和three-way merge(三方合并 ...
- Git知识总览(六) Git分支中的远程操作实践
前几篇博客陆陆续续的讲了好多关于Git操作的内容,本篇博客仍然也不例外,不过本篇博客的主题是关于git的远程操作的.依照之前博客的风格,我们依然依托于LearningGitBranch中的相关内容来探 ...
- Git分支中的远程操作实践
Git分支中的远程操作实践 前几篇博客陆陆续续的讲了好多关于Git操作的内容, 其中在上篇博客聊了<Git中的merge.rebase.cherry-pick以及交互式rebase>,本篇 ...
- 在Visual Studio 中使用git——分支管理-下(九)
在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...
- 14.Git分支-rebase有趣的例子、变基带来的问题及解决方案
1.有趣的变基例子 如下图所示,你创建了一个特性分支server,然后进行了一些提交(C3和C4),然后又从C3上创建了特性分支client,提交了C8和C9,最后你又回到了server,提交了C10 ...
- git变基--rebase
变基过程: 两个分支 先考虑不用变基的合并: $ git checkout master $ git merge experiment 合并后: 如果变基:(以下为变基过程) $ git checko ...
随机推荐
- 【webpack系列】从零搭建 webpack4+react 脚手架(四)
经过三个章节的学习,你已经学会搭建了一个基于webpack4的react脚手架.如果要更改配置,比如,你希望把编译后的js文件和css文件等单独放dist下的static目录下,你想想,是不是有点麻烦 ...
- [Linux][转载]Curl命令详解
命令:curl 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,是一款很强大的http命令行工具,当处在无界面的服务器上的时候,利用curl下载上传文件是较为方便的事情. 语法 ...
- Windows 2008 如何启用 TLS1.1 1.2
1.下载工具:下载>>> 2.在服务器运行本软件,点击“Bes”按钮,然后必须确保有TLS 1.2被选中,SSL2 SSL3可以不用选择,然后点击Apply按钮,这时系统提醒您重启, ...
- AspNet Core 下利用普罗米修斯+Grafana构建Metrics和服务器性能的监控 (无心打造文字不喜勿喷谢谢!)
概述 Prometheus的主要特点 组件 结构图 适用场景 不适用场景 安装node_exporter,系统性能指数收集(收集系统性能情况) 下载文件 解压并复制node_exporter应用程序到 ...
- 给JS包写TypeScript用的类型申明文件
TS (TypeScript)区别于JS (JavaScript)一个最大的不同是TS增加了类型.当一些TS代码要使用JS包的时候,最好这些JS包都有类型介绍,比如这个变量是什么类型,那个函数参数的什 ...
- haproxy代理配置段参数设定
代理配置段:有四个配置段 default:设定默认参数, frontenf:前端服务器的设定 backend:后端服务器的设定 listening:是设定前端和后端一一对应的设定 参数: 1bind: ...
- java新手入门
参考地址 java博客 1.jdk 安装 /usr/libexec/java_home -V 查询jdk的版本 2.tomcat 安装教程 配置 mkdir -p /Library/Tom ...
- SFTP服务的使用!!
在Client端安装Xshell或者SecureCRT等具有SFTP文件传输功能的软件,在服务器端安装好SFTP服务并启动,就可以用SFTP传输文件了! from: http://www.cnbl ...
- Objective-C中整数与字符串的相互转换
2013/4/15整理: 将整数转换成字符串 Convert Integer to NSString: 方法一: int Value = 112233; NSString *ValueString = ...
- XAML控件不可访问,它具有一定的保护级别
其它namespace的代码访问控件时会出现这个问题 需要把控件状态由protected改为public <TextBlock x:FieldModifier="public" ...