`
Josh_Persistence
  • 浏览: 1649905 次
  • 性别: 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 rebase_ git merge.docx

    git rebase 和 git merge 的理解与区别 Git 是一个版本控制系统,广泛应用于软件开发过程中。其中,git rebase 和 git merge 是两个常用的命令,都是用于合并分支,但是它们的实现机制和应用场景却有所不同。 git...

    详解git merge 与 git rebase的区别

    与 `git merge` 不同,`git rebase` 是一种“重放”或“平滑”分支历史的方法。在执行 `git rebase` 时,Git 将从共同祖先开始,将一个分支(在这个例子中是 `master`)上的所有更改应用到另一个分支(`develop`)上...

    Sungq1990#blog#git rebase操作1

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

    Git实战IDEA操作

    3. 合并分支:"VCS" -&gt; "Git" -&gt; "Merge",选择要合并的分支,IDEA会自动解决冲突。 六、解决冲突 1. 当多人修改同一文件时,可能会出现冲突。IDEA会在冲突文件中用特殊标记显示冲突部分。 2. 解决冲突后,需要...

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

    本文将深入探讨Git的两个关键功能——`merge`和`rebase`,以及它们在日常开发中的应用。 1. **Git的版本控制**:Git的核心功能是版本控制,它能够记录文件的每一次修改,包括修改的内容、作者和时间。这使得开发者...

    git rebase -i合并多次提交的实现

    Git 是一个分布式版本控制系统,广泛应用于软件开发领域。在日常的开发工作中,为了保持代码库的整洁...因此,一般建议在自己的本地分支上进行 `rebase` 操作,然后再通过 `merge` 或 `rebase --onto` 合并到共享分支。

    git分支操作.txt

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

    11. 高级 1: 不喜欢 merge 的分叉? 用 rebase 吧1

    Git 高级使用指南 - merge 和 rebase 的区别 在 Git 中,我们经常会遇到分叉的情况,特别是在多人协作时。当我们执行 `git merge` 命令时,commit 历史就会出现分叉,这种分叉再汇合的结构会让一些人觉得混乱而难以...

    git批量拉取项目的脚本,简便快捷

    如果子目录是Git仓库(即包含`.git`目录),它会切换到该目录,执行`git fetch`获取远程更新,然后用`git merge`或`git rebase`将远程的`main`分支(或你习惯的分支名)合并到本地。 在实际使用中,你可能需要根据...

    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 tools

    `git merge` 的基本用法是将一个分支(通常是我们当前所在的分支)的最新变化与另一个分支的最新状态合并。这在团队协作中尤其有用,因为每个成员可能在不同的分支上工作,然后需要将他们的改动整合到主分支,如 `...

    ZhongJinHacker#notes#git_merge和git_rebase总结1

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

    配合Git flow 流程使用的git 操作命令指南

    这可以通过`git fetch`、`git rebase`和`git push`来实现。 8. **版本控制** 使用Git flow,你可以更好地管理版本,通过release和hotfix分支确保线上版本的稳定。每次合并到master分支都会创建一个对应的tag,便于...

    Git-2.37.3-64-bit_3Git-2.37.3-64-bit_3Git-2.37.3-64-bit_3Git-2.3

    对于团队项目,可以使用`git clone`下载远程仓库,`git pull`同步远程更新,`git push`推送本地更改,以及`git fetch`和`git merge`或`git rebase`来整合远程分支。 总之,Git-2.37.3-64-bit_3.exe是Git的64位...

    Git学习1

    - **git rebase**:与`merge`不同,`git rebase`会将你的分支的变更移动到目标分支的最新提交之上,使得你的提交历史看起来像是直接在主线分支上完成的。这有助于保持一个清晰的提交历史,但可能会导致冲突,需要...

    高频使用的Git命令.docx

    * `git rebase -i`:交互式变基,用于合并提交记录。 * `git rebase --continue`:继续变基操作。 * `git rebase --skip`:跳过当前提交记录。 * `git rebase --abort`:取消变基操作。 Git Merge 命令 Git ...

    git常见操作指令速记卡《git-cheatsheet》

    首先,Git初始化与分支操作是日常开发中不可或缺的步骤。使用`git clone`可以克隆远程仓库到本地。当需要检出特定分支时,可以使用`git checkout`,如果要创建一个新的分支,基于当前分支状态,则可以使用`git ...

    gitpractise_ex:用于Git Rebase和合并的仓库

    通过这样的练习,你不仅可以熟悉Git的基本操作,还能深入理解Rebase和合并的区别以及它们在实际项目中的适用场景。 记住,掌握Git的这些高级特性对提升团队协作效率和代码管理能力至关重要。不断地实践和探索,你将...

Global site tag (gtag.js) - Google Analytics