一,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. JAVA热部署,通过agent进行代码增量热替换!!!

    在前说明:好久没有更新博客了,这一年在公司做了好多事情,包括代码分析和热部署替换等黑科技,一直没有时间来进行落地写出一些一文章来,甚是可惜,趁着中午睡觉的时间补一篇介绍性的文章吧. 首先热部署的场景是 ...

  2. django.db.utils.InternalError: (1091, "Can't DROP 'cre_time'; check that column/key exists")

    在执行命令python manage.py migrate时报错:django.db.utils.InternalError: (1091, “Can’t DROP ‘cre_time’; check ...

  3. 串(string)

    题目描述 给定一个由小写字母组成的字符串s,每次你可以删去它的一个非回文子串, 求删成空串的最小次数. 输入输出格式 输入格式: 第一行一个整数 t 表示数据组数. 每组数据第一行一个整数 n表示字符 ...

  4. JavaGuide易错点总结

    基础知识易错点 1. object.equals("str") 容易报空指针异常,应使用"str".equals(object); 还可以使用JDK7引入的工具 ...

  5. 必应API接口nodejs版

    近期,在研究百度.必应.API等的url提交API时,发现有用Go语言做工具的大佬的分享 利用 API 自动向搜索引擎提交网址(Go语言版) - pyList. 其中提到bing API提交方法,并给 ...

  6. command三国杀开发日记20200915

    一句话进展 完善了程序结构,分离.c和.h 搭建了6个阶段函数 实现了玩家摸牌 封装实现了日志打印函数 日志打印 想要区分日志等级,包括DEBUG.INFO.WARN.ERRRO.PANIC,提供统一 ...

  7. js监听事件的绑定与移除

    监听事件的绑定与移除主要是addEventListener和removeEventListener的运用. addEventListener语法 element.addEventListener(ty ...

  8. 出行即服务(MAAS)框架

    转自 出行即服务(MAAS)框架 一.概况 在共享交通模式和智能信息技术的基础之上,城市出现了全新的交通理念——“出行即服务(Mobility-as-a-Service,简称MaaS)”.MaaS将各 ...

  9. win10 系统出现“你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。”

    公司无法访问共享 \192.168.7.101.win+R 输入gpedit.msc2.计算机配置-管理模板–网络-lanman 工作站-找到"启用不安全的来宾登录"选择 已启用. ...

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

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