一,git merge 与 git rebase的区别

1,git merge

例如: master分支合并dev分支,git将两个分支dev和master上的所有commit ,

按照提交时间的先后顺序进行依次放到master分支上

2,  git rebase操作实际上是将当前执行rebase分支的所有基于原分支提交点之后的commit重新生成一个新的commit hash值,

再次基于原分支目前最新的commit点上进行提交,

不再根据两个分支上实际的每次提交的时间点排序,

rebase完成后,重新合并的代码的commit呈线性排列

说明:架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

对应的源码可以访问这里获取: https://github.com/liuhongdi/

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,准备一个例子:

我们准备一个文件,然后基于master分支创建dev分支,

在master分支上做三次修改,提交内容分别是:a b c

在与之相同的dev分支上做两次修改,提交内容分别是: d e

两个分支的提交顺序为: a d b e c

root@kubuntu:/data/git/clog# git status
位于分支 master
root@kubuntu:/data/git/clog# vi a.txt
root@kubuntu:/data/git/clog# git add -A
root@kubuntu:/data/git/clog# git commit -m "a";
[master cda2566] a
1 file changed, 1 insertion(+)
root@kubuntu:/data/git/clog# git checkout dev
切换到分支 'dev'
root@kubuntu:/data/git/clog# vi a.txt
root@kubuntu:/data/git/clog# git add -A
root@kubuntu:/data/git/clog# git commit -m "d";
[dev 972b5aa] d
1 file changed, 1 insertion(+)
root@kubuntu:/data/git/clog# git checkout master
切换到分支 'master'
root@kubuntu:/data/git/clog# vi a.txt
root@kubuntu:/data/git/clog# git add -A
root@kubuntu:/data/git/clog# git commit -m "b";
[master 31b4f31] b
1 file changed, 1 insertion(+)
root@kubuntu:/data/git/clog# git checkout dev
切换到分支 'dev'
root@kubuntu:/data/git/clog# vi a.txt
root@kubuntu:/data/git/clog# git add -A
root@kubuntu:/data/git/clog# git commit -m "e";
[dev 9a7debc] d
1 file changed, 1 insertion(+)
root@kubuntu:/data/git/clog# git checkout master
切换到分支 'master'
root@kubuntu:/data/git/clog# vi a.txt
root@kubuntu:/data/git/clog# git add -A
root@kubuntu:/data/git/clog# git commit -m "c";
[master c1d316f] c
1 file changed, 1 insertion(+)
root@kubuntu:/data/git/clog# git log
commit c1d316f17dcbe0c8ee42361ffaaa19fa7c8ff616 (HEAD -> master)
Author: liuhongdi <371125307@qq.com>
Date: Mon Feb 17 13:12:54 2020 +0800
c
commit 31b4f3173bd46947a671db7a174b4044aca617c1
Author: liuhongdi <371125307@qq.com>
Date: Mon Feb 17 13:11:18 2020 +0800
b
commit cda25664a84b8a27fedbaf436e302781e51fc0e9
Author: liuhongdi <371125307@qq.com>
Date: Mon Feb 17 13:09:22 2020 +0800
a
commit 7f5d3f71a244920c390b761921687adafcdf8b45
Author: liuhongdi <371125307@qq.com>
Date: Mon Feb 17 12:59:53 2020 +0800
初始化文件

三,看一下合并分支的例子:

root@kubuntu:/data/git/clog# git merge dev
自动合并 a.txt
冲突(内容):合并冲突于 a.txt
自动合并失败,修正冲突然后提交修正的结果。
root@kubuntu:/data/git/clog# vi a.txt
root@kubuntu:/data/git/clog# git add -A
root@kubuntu:/data/git/clog# git commit -m "解决冲突"
[master 475e007] 解决冲突

root@kubuntu:/data/git/clog# git log --pretty=oneline
475e007e0adf8ccc1ff36196e9d9525075d92b38 (HEAD -> master) 解决冲突
c1d316f17dcbe0c8ee42361ffaaa19fa7c8ff616 c
9a7debc8ba18f4dd07c93c8bb3e67101066d2463 (dev) e
31b4f3173bd46947a671db7a174b4044aca617c1 b
972b5aa0771fdf0cfd5602de1902f7909d04ad1e d
cda25664a84b8a27fedbaf436e302781e51fc0e9 a
7f5d3f71a244920c390b761921687adafcdf8b45 初始化文件

说明:可以看到 git merge 产生的commit顺序是: a d b e c

四,来看rebase的例子:

如果想让commit按照

a->b->c->d->e的顺序排列,

以方便reset到某个commit,就可以使用rebase

看例子:

root@kubuntu:/data/git/clog# git checkout dev
切换到分支 'dev'
root@kubuntu:/data/git/clog# git rebase master
首先,回退头指针以便在其上重放您的工作...
...
root@kubuntu:/data/git/clog# vi a.txt
root@kubuntu:/data/git/clog# git add -A
root@kubuntu:/data/git/clog# git rebase --continue

root@kubuntu:/data/git/clog# git log --pretty=oneline
6a1ea30d1f70c747d9f2bb6282b1f6b2e75ccf05 (HEAD -> dev) e
89a1b44dc8c491742382f0cb7d528a5652023ee9 d
c1d316f17dcbe0c8ee42361ffaaa19fa7c8ff616 (master) c
31b4f3173bd46947a671db7a174b4044aca617c1 b
cda25664a84b8a27fedbaf436e302781e51fc0e9 a
7f5d3f71a244920c390b761921687adafcdf8b45 初始化文件

说明:在dev分支上做 rebase master 之后

分支中各commit的顺序为:   a b c d e

五,git rebase后发生丢失本地commit记录的情况如何处理?

root@kubuntu:/data/git/clog# git reflog

从这些log中找出自己需要的commit

然后reset到自己需要的那个commit上

root@kubuntu:/data/git/clog# git reset --hard 9a7debc
HEAD 现在位于 9a7debc d

六,git rebase出现冲突时如何处理?

在 rebase 的过程中,也许会出现冲突 conflict 。

在这种情况, git 会停止 rebase 并会让你去解决冲突。在解决完冲突后,用 git add 命令去更新这些内容。

注意,你无需执行 git-commit,只要执行 continue

  git rebase --continue

这样 git 会继续应用余下的 patch 补丁文件。

root@kubuntu:/data/git/clog# git rebase master
冲突后手动处理,然后add到暂存区:
root@kubuntu:/data/git/clog# vi a.txt
root@kubuntu:/data/git/clog# git add -A
root@kubuntu:/data/git/clog# git rebase --continue

七,如何放弃当前正在进行的rebase?

在任何时候,我们都可以用 --abort 参数来终止 rebase 的行动,

并且分支会回到 rebase 开始前的状态。

 执行git rebase —abort命令即可

root@kubuntu:/data/git/clog# git rebase --abort

八,rebase在生产环境中的使用原则:

1, 个人在本地的分支之间合并代码时,可以merge,

       也可以rebase

2,    如果是要提交到线上主分支,则一定要rebase线上主分支

3,    线上主分支,例如: master,一定不要rebase其他分支

git merge 与 git rebase的区别?的更多相关文章

  1. Git merge 与 git rebase的区别

    Git merge的用法: git merge Dev // Dev表示某分支,表示在当前分支合并Dev分支 git merge -m  "Merge from Dev"  Dev ...

  2. git merge与 git rebase区别及实例

    接Git分支创建与合并,在分支合并时,有两种方式:git merge 和git rebase. git merge:将两个分支,合并提交为一个新提交,并且新提交有2个parent. git rebas ...

  3. git merge和git rebase的区别和异同

    1.git  merge和git rebase作用差不多,都是将远程代码和本地代码合并 2.git  merge和git rebase作用差不多,都是将远程代码和本地代码合并 3.git  merge ...

  4. git pull、git fetch、git merge、git rebase的区别

    一.git pull与git fetch区别 1.两者的区别       两者都是更新远程仓库代码到本地. git fetch相当于是从远程获取最新版本到本地,不会自动merge. 只是将远程仓库最新 ...

  5. git merge和git rebase的区别

    git merge是用来合并两个分支的.# 将b分支合并到当前分支git merge b git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作.例如,假设我 们有 ...

  6. git merge 及 git rebase的区别

    Git上合并代码有git merge 及 git rebase 两种方式. 前置知识点 Master分支:首先,代码库应该有一个.且仅有一个主分支.所有提供给用户使用的正式版本,都在这个主分支上发布. ...

  7. git第七节---git merge和git rebase

    # git merge和git rebase 都可以进行分支合并 #git merge 合并后保留记录两个分支的记录 #git rebase合并后会展示成一个分支的记录,另一个分支的提交实际生成了一个 ...

  8. 【译文】Git merge 和 Git rebase比较

    [译文]Git merge 和 Git rebase比较 原创: 胡江华 胡同学和朋友们的成长日记 2017-03-22 git rebase 这个命令经常被人认为是一种Git巫术,初学者应该避而远之 ...

  9. git merge和git rebase的区别(转)

      Description git rebase 和 git merge 一样都是用于从一个分支获取并且合并到当前分支,但是他们采取不同的工作方式,以下面的一个工作场景说明其区别 场景:  如图所示: ...

随机推荐

  1. Redis之命令详解

    Redis命令手册:http://doc.redisfans.com/

  2. 【吴恩达课程使用】anaconda (python 3.7) win10安装 tensorflow 1.8 cpu版

    [吴恩达课程使用]anaconda (python 3.7) win10安装 tensorflow 1.8 目前tensorflow是只支持到python3.6的,anaconda最新版本已经到pyt ...

  3. shell变量操作${}详细用法

    ${}基本功能 一般情况下$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围 [root@localhost ~]# A=Linux [root@localhost ~] ...

  4. 005.操作系统及Linux系统,虚拟机的作用和发展历史

    操作系统及其作用 操作系统发展史 Linux系统 虚拟机 操作系统 操作系统 操作系统的作用 不同领域的主流操作系统 操作系统(Operation System,OS) 操作系统作为接口的示意图 没有 ...

  5. Unity3D 一、游戏

    3D游戏编程第一次作业 作业要求 阅读 Tracy Fullerton, *GAME DESIGN WORKSHOP* 第2-4章(游戏结构.基本元素.戏剧元素).选择一款你喜欢的中等规模游戏如&qu ...

  6. 刷题[HFCTF2020]EasyLogin

    前置知识 node.js koa框架常用目录,文件 js弱类型语言,空数组与整数1比较时,返回turue jwt令牌 博客讲解: 关于jwt的讲解: http://www.ruanyifeng.com ...

  7. ASP.NET Core 基于声明的访问控制到底是什么鬼?

    从ASP.NET 4.x到ASP.NET Core,内置身份验证已从基于角色的访问控制(RBAC)转变为基于声明的访问控制(CBAC). 我们常用的HttpContext.User属性ASP.NET ...

  8. JavaScript的this到底代表谁?(this指向哪里?)

    在很多编程语言中都有this这个特殊关键字的存在,比如Java中的this,还有本文要说到的JavaScript中的this.那么,JavaScript中this究竟有什么特性和用法呢?它又是如何定义 ...

  9. const pointers

    1 指针 p对应的地址是常量,但是里面存放的data不是常量 2 地址里存放的data是常量,但是地址不是常量 3 地址和指针都是常量

  10. spark-3-macOS配置hadoop+spark+IDE

    [教程1]https://blog.csdn.net/shiyutianming/article/details/99946797  + [教程2]http://dblab.xmu.edu.cn/bl ...