Git: 聊聊Rebase命令,与Merge的区别

转帖自2015-12-02 lazybios 日拱一卒

相比Merge命令,大家对Rebase要相对陌生一些,Rebase这个命令在《Pro Git book》中被翻译为「衍合」,感觉好别扭,个人感觉无论是从音还是行(为)叫做「变基」要更佳恰当一些。

Rebase的大致流程

Step1: 场景假定

你基于一个远程分支origin创建了一个mywork的分支

git checkout -b mywork origin

Step2: 进行开发

创建好分支后,你就开始兢兢业业的在mywork分支上开展工作了,一段时间过去,你总共进行了2次提交:C5, C6. 这时你去pull一下origin分支,发现在你工作的同时,别人也没歇着,orgin分支在这段时间也有了两次提交C3, C4:

Step3: 合并分支

发现异同之后,你想在你现在的工作进度上把别人的功能合并过来,这个时候就要涉及到分支合并了,此时你有两个选择,一个是merge,另一个是rebase(时刻记住merge与rebase干的是一件事儿),这里我们使用rebase

先切换会origin分支,通过pull指令将origjn分支上的最新改动拉取下来。然后在用git checkout mywork切换会mywork分支,到这里就能用git rebase orgin来进行变基了。

到这里如果遇到了冲突,终端会给出你提示要求你先去处理冲突,当你把冲突处理完之后,通过git add确认改动后,不用commit直接执行git rebase —continue变基就算完成了。

这里简单说下原理,在你执行「变基」操作的时候,git会将你mywork分支中的所有新提交撤销commit,并把这些改动临时帮你寄存在.git/rebase目录下,之后再将清空后的mywork分支更新到origin分支状态,最后再把刚才临时帮你保存的变动应用到同步过后的mywork分支上。这样就起到了「变基」的作用,这种改动是从commit的最后一个公共部分开始的。所以叫「变基」。不过需要重点搞清的两点:

  1. merge和rebase合并后的结果是一模一样的,形象的说,二者是殊途同归。
  2. 使用rebase「变基」后的commit与之前没有变基前的commit,即上图中C6’与C6是不同的,它们的SHA-1值不同,Git会把它们看成两次提交。

最后的最后,建议在使用rebase命令时最好能耐心点把命令行提示的信息看完,其实那里面已经包含了一切,而且内容也不多。

Github上Rebase的使用场景

现在社区中推荐的主流Git合作方法,也是利用Rebase命令,即Fork一个代码库后,保留一个remote分支用来跟近主库进度,另开一个feature分支来打patch,当patch打好后,在本地同步一下remote分支上的代码,保持与主库一致,如果在你打patch这段时间,主库发生了变化,那么你就需要在本地预先做一次rebase操作,以保证你的改动是构建在主库最新代码之上的。这其实相当与你帮助作者在本地处理好了冲突,这样作者再合并你的代码时候,也就能比较轻松了。换个角度,其实使用rebase这个过程也是一个自我检查的过程,可以强制你对改动进行Review,从而减轻贡献者和所有者之间的工作量。因为没有人比你更熟悉你的代码。

Rebase与Merge的区别

Git合并分支有两个命令一个是merge,另一个就是rebase,两者最终目的都是一致的,但在一些细节的处理上却大不相同。下图是分别用merge和rebase合并分支后的示意图。可以看出,使用rebase命令合并后的分支呈线性,而用merge后确多处一个分支来,这个小小的差异,其实对最终结果没有影响,仅仅是方式上的差异。

解释 git pull —rebase

git pull —rebase,这个命令在实际使用中的出场率还是很高的。我们先从git pull说起,git pull 完整的应该是git fetch + git merge FETCH_HEAD,默认时候git pull会先拉取代码,再进行merge,上面说了使用merge会多出一条合并的commit以及一条分支线来,如果commit和merge频繁的话,可能会出现下图这样的情况,但是rebase则不同,其会保持线性,这样提交记录看起来就会整洁许多,使用—rebase就是这个意思用git rebase取代git merge

下图是使用 git fetch + git merge时间长了的提交记录,这个还不算复杂,你可以在此基础上再往复杂想一下,或者Google一下类似的图。

参考引用

  • http://dwz.cn/2goS5e
  • http://dwz.cn/2goSKc
时间: 2025-01-05 02:35:29

Git: 聊聊Rebase命令,与Merge的区别的相关文章

git remote 仓库命令 rebase 和 merge

git remote add origin https://git.oschina.net/wcms/WCMS.git //添加仓库 git remote 查看当前仓库 git remote remove origin //删除仓库 git push origin  :version  //删除远程分支 git remote 仓库命令 rebase 和 merge

(转)git rebase 命令

转自:http://blog.csdn.net/hudashi/article/details/7664631/ 原文: http://gitbook.liuhui998.com/4_2.html 一.基本 git rebase用于把一个分支的修改合并到当前分支. 假设你现在基于远程分支"origin",创建一个叫"mywork"的分支. $ git checkout -b mywork origin 假设远程分支"origin"已经有了2个提交

git pull --rebase 和 git pull 的区别

转载:http://hungyuhei.github.io/2012/08/07/better-git-commit-graph-using-pull---rebase-and-merge---no-ff.html pull --rebase 首先是吐嘈 如果你正在 code review,看到上图(下文将称之为:提交线图)之后,特别是像我这样有某种洁癖的人,是否感觉特别难受?如果是的话,请看下文吧 :) 为什么 Git 作为分布式版本控制系统,所有修改操作都是基于本地的,在团队协作过程中,假设

Git----拉取远程分支,git pull,git rebase,git pull --rebase的区别

git pull 相当于自动的 fetch 和 merge 操作,会试图自动将远程库合并入本地库,在有冲突时再要求手动合并. git rebase 可以确保生产分支commit是一个线性结构,方便rollback.其实生产也可以选择打tag来发布. 注:通过rebase可以确保主分支commit history线性结构上每个commit点都是相对独立完整的功能单元.除了美感,这样做也有助于团队间的分工协作,比随便merge效果好. git pull --rebase(推荐用这个) 把本地 rep

对比git pull和git pull --rebase

1.使用下面的关系区别这两个操作:git pull = git fetch + git mergegit pull --rebase = git fetch + git rebase 2 一.基本 git rebase用于把一个分支的修改合并到当前分支. 假设你现在基于远程分支"origin",创建一个叫"mywork"的分支. $ git checkout -b mywork origin 假设远程分支"origin"已经有了2个提交,如图 现

Git分支Rebase详解

分支的衍合 把一个分支中的修改整合到另一个分支的办法有两种:merge 和 rebase(译注:rebase 的翻译暂定为"衍合",大家知道就可以了.).在本章我们会学习什么是衍合,如何使用衍合,为什么衍合操作如此富有魅力,以及我们应该在什么情况下使用衍合. 基本的衍合操作 请回顾之前有关合并的一节(见图 3-27),你会看到开发进程分叉到两个不同分支,又各自提交了更新. 图 3-27. 最初分叉的提交历史. 之前介绍过,最容易的整合分支的方法是 merge 命令,它会把两个分支最新的

git:rebase的原理

git:rebase的原理 前提: 在最近的项目中,我碰到这样一个情况:第一版app上线之后,团队紧接着进行第二版本的开发,由于团队成员对git使用不熟悉,所以开发的每一次提交都是往远端master分支上提交. 第一版本打包上线之后,我想让后续的开发中master分支保持代码高可用性,于是在远端建立新的分支second_version用于第二版本的开发,到时候再合并到master分支上,奈何有的团队成员不会提交远程其他分支,导致master被污染(如下图) 由于团队成员对git的熟练程度不同,有

git fetch 、git pull 与 git pull --rebase

1. git fetch 与 git pull 都是从远程拉取代码到本地,git fetch只是拉取到本地,git pull不仅拉取到本地还merge到本地分支中.所以git pull是git fetch与git merge的集合体.  2. git pull 与 git pull --rebase git pull的默认行为是git fetch + git merge,  git pull --rebase则是git fetch + git rebase. 从目的来说,两者没差别,运行之后,

Git 版本管理工具命令速查

转自:http://www.jb51.net/article/55442.htm 一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r 查看远程所有分支git commit -am "init" 提交并且加注释 git remote add origin [email protected]:ndshowgit push origin mast