`
Josh_Persistence
  • 浏览: 1632864 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

git rebase与git merge的区别即联系

    博客分类:
  • Git
阅读更多

一、简介

           在Git中,有两种方法将两个不同的branch合并。一种是通过git merge,一种是通过git rebase。然而,大部分人都习惯于使用git merge,而忽略git rebase。本文将重点介绍git rebase的原理、使用方式及应用范围以及与git merge的区别。

 

二、git merge

当我们在开发一些新功能的时候,往往需要建立新的branch。



 在上图中,每一个绿框均代表一个commit。除了c0,每一个commit都有一条有向边指向它在当前branch当中的上一个commit。项目在c2之后就开了另外一个branch,名为experiment。在此之后,master下的修改被放到c4 commit中,experiment下的修改被放到c3 commit中。

如果我们使用merge合并两个分支,比如讲experiment上的提交(c3)合并到master上,则可以使用如下命令:

 

$ git checkout master
$ git merge experiment

 merge后得到的commit log如下图所示

 



 

我们看到,merge所做的事情实际上是:

  1. 首先找到masterexperiment中最新的commit的最近公共祖先,在这里就是c4c3的最近公共祖先c2
  2. experiment分支上在c2以后的所有commit合并成一个commit,并与master合并
  3. 如有合并冲突(两个分支修改了同一个文件),首先人工去除重复。
  4. 在master上产生合并后的新commit。

 

三、git rebase

rebase所做的事情也是合并两个分支,但是它的方式略有不同。基于上例描述,rebase的工作流程是:

  1. 首先找到masterexperiment中最新的commit的最近公共祖先,在这里就是c4c3的最近公共祖先c2
  2. experiment分支上在c2以后的所有commit*全部移动到*master分支的最新commit之后,在这里就是把c3移动到c4以后。



 

由于git的每一个commit都只存储相对上一个commit的变化(或者说是差值,delta)。我们通过移动c3到master,代表着在master上进行c3相应的修改。为了达成这一点,只需在experiment分支上rebase master

 

$ git checkout experiment
$ git rebase master

 

 

需要注意的是,rebase并不是直接将c3移动到master上,而是创建一个副本。我们可以通过实际操作发现这一点。在rebase前后,c3的hash code是不一样的。

rebase前的commit log是

 

* 1b4c6d6 (master) <- c4
| * 66c417b (experiment) <- c3
|/  
*   972628d

 

rebase后的commit log是


* d9eeb1a - (experiment) <- c3'
* 1b4c6d6 - (master) <- c4
* 972628d
 可以发现c3的hash code从66c417b变到了d9eeb1a

 

在这之后,我们只需要在master上进行一次前向合并(fast-forward merge)

 

$ git checkout master
$ git merge experiment
 

 rebase之后的commit log呈线性,更加清晰。此时如果experiment分支不再被需要,我们可以删除它。

 

$ git branch -d experiment

 

四、何时使用

我们一般只在本地开发的时候rebase一个自己写出来的branch。

谨记,千万不要rebase一个已经发布到远程git服务器的分支。例如,你如果将分支experiment发布到了GitHub,那么你就不应该将它rebasemaster上。因为如果你将它rebasemaster上,将对其他人造成麻烦。

总结

git rebase帮助我们避免merge带来的复杂commit log,允许以线性commit的形式进行分支开发。

更多有关git rebase的更多用法,见这篇文章

 

 

  • 大小: 4.2 KB
  • 大小: 4.9 KB
  • 大小: 4.9 KB
  • 大小: 4.2 KB
0
2
分享到:
评论

相关推荐

    详解git merge 与 git rebase的区别

    主要介绍了详解git merge 与 git rebase的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    前端大厂最新面试题-git rebase_ git merge.docx

    前端大厂最新面试题-git rebase_ git merge.docx

    Sungq1990#blog#git rebase操作1

    merge主要发生在这样几个地方1 两个人同时开发一个分支,在拉取对方代码的时候2 要将代码合并到master的时候git pull origin master

    git分支操作.txt

    gti详细的分支操作,在git中,可以使用git merge 和git rebase两个命令来进行分支的合并。 git merge 和git rebase在大体上都差不多,下文主要以git merge来例来讲解分支的合并流程。 如果你想了解分支合并的更多...

    git 视频教程

    git视频教程.4.6.Git 命令 - git merge、git mergetool.mp4 git视频教程.4.7.Git 命令 - git log、git stash、git tag.mp4 git视频教程.5.1.Git 命令 - git fetch.mp4 git视频教程.5.2.Git 命令 - git pull.mp4 git...

    Git的merge和rebase你真的了解吗?

    Git具有以下主要功能和特点: 版本控制:Git最基本的功能是版本控制,可以记录每个文件的修改历史,包括修改内容、作者、时间等。通过Git,开发者可以轻松回溯到任何一个历史版本,查看修改细节、恢复代码等,有助...

    ZhongJinHacker#notes#git_merge和git_rebase总结1

    文件可能会发生冲突,需要解决一下最后结果* 85ef130 (HEAD -&gt; master) Merge branch 'dev'可以看出,merge 有保留d

    Git学习笔记.pdf

    Git中关于rebase, merge, cherry-pick, rm等的深入讲解

    Git-2.21.0-64-bit.zip

    * A "merge -c" instruction during "git rebase --rebase-merges" should give the user a chance to edit the log message, even when there is otherwise no need to create a new merge and replace the ...

    Git Version Control Cookbook 无水印pdf 0分

    Discover how you can force rebase on some branches and use regular Git merge on other branches Extract metadata from a Git repository Familiarize yourself with Git notes Discover how you can work ...

    Git Version Control Cookbook 2nd Edition

    You’ll then move on to discovering the features that Git rebase has to offer and use regular Git merge on other branches. You’ll explore Git notes and learn how to utilize the update, list, and ...

    test-git-merge-cherry-squache

    test-git-merge-cherry-squache

    Git.Version.Control.Cookbook.1782168451

    Discover how you can force rebase on some branches and use regular Git merge on other branches Extract metadata from a Git repository Familiarize yourself with Git notes Discover how you can work ...

    SourceTree:SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端管理工具

    SourceTree拥有一个精美简洁的界面,大大简化了开发者与代码库之间的Git操作方式,这对于那些不熟悉Git命令的开发者来说非常实用。 SourceTree拥有完整的Git功能: 通过一个简单的用户界面即可使用所有的Git命令 ...

    git-2.22.0-2019-06-07更新.rar

    *“git rebase --rebase-merges”取代旧的“--preserve-merges” 选项; 后者现在标记为已弃用。 *使用--recurse-submodules进行克隆时给出的错误消息 已更新。 *完成帮助程序代码现在关注存储库本地 配置...

    git-style-guide:在GitHub上使用git的个人指南

    如果您看到一个将分支合并到自身中的提交,只需运行git rebase ,它将进行自我清理。 Merge branch 'master' into branch ... 如果要将父分支合并到分支中并看到此提交,则合并错误。 键入git rebase master (或...

    starter-web:入门网站回购

    入门Web回购 这是我们正在用作演示项目的git项目 ... #Git Rebase文件已针对Git rebase讲座进行了修改我们已经在mybranch中创建了Rebase Github 这个文件修改了ib github ## git stash文件已修改为git stash

    最好用的Git工具【sourceTree1.4.0 中文 64位】

    SourceTree拥有一个精美简洁的界面,大大简化了开发者与代码库之间的Git操作方式,这对于那些不熟悉Git命令的开发者来说非常实用。 SourceTree拥有完整的Git功能: 通过一个简单的用户界面即可使用所有的Git命令 ...

    fti-git-sample:用于破解 Git 的示例项目

    学习 Git 这些是我们将在培训课程中介绍的git函数: 初级 git branch ... git fetch / git merge git remote git rerere git config 更先进 git别名 上游分支 子模块 大块头 采摘樱桃 引用日志

Global site tag (gtag.js) - Google Analytics