git merge 与 git rebase的区别?
一,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的区别?的更多相关文章
- Git merge 与 git rebase的区别
Git merge的用法: git merge Dev // Dev表示某分支,表示在当前分支合并Dev分支 git merge -m "Merge from Dev" Dev ...
- git merge与 git rebase区别及实例
接Git分支创建与合并,在分支合并时,有两种方式:git merge 和git rebase. git merge:将两个分支,合并提交为一个新提交,并且新提交有2个parent. git rebas ...
- git merge和git rebase的区别和异同
1.git merge和git rebase作用差不多,都是将远程代码和本地代码合并 2.git merge和git rebase作用差不多,都是将远程代码和本地代码合并 3.git merge ...
- git pull、git fetch、git merge、git rebase的区别
一.git pull与git fetch区别 1.两者的区别 两者都是更新远程仓库代码到本地. git fetch相当于是从远程获取最新版本到本地,不会自动merge. 只是将远程仓库最新 ...
- git merge和git rebase的区别
git merge是用来合并两个分支的.# 将b分支合并到当前分支git merge b git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作.例如,假设我 们有 ...
- git merge 及 git rebase的区别
Git上合并代码有git merge 及 git rebase 两种方式. 前置知识点 Master分支:首先,代码库应该有一个.且仅有一个主分支.所有提供给用户使用的正式版本,都在这个主分支上发布. ...
- git第七节---git merge和git rebase
# git merge和git rebase 都可以进行分支合并 #git merge 合并后保留记录两个分支的记录 #git rebase合并后会展示成一个分支的记录,另一个分支的提交实际生成了一个 ...
- 【译文】Git merge 和 Git rebase比较
[译文]Git merge 和 Git rebase比较 原创: 胡江华 胡同学和朋友们的成长日记 2017-03-22 git rebase 这个命令经常被人认为是一种Git巫术,初学者应该避而远之 ...
- git merge和git rebase的区别(转)
Description git rebase 和 git merge 一样都是用于从一个分支获取并且合并到当前分支,但是他们采取不同的工作方式,以下面的一个工作场景说明其区别 场景: 如图所示: ...
随机推荐
- Django循环创造div后,对各个div操作后触发事件,传递数据(Django九)
前面我用for循环创建了div,每个div中有各自的数据以及同样的布局 效果图如下:部分代码如下: 现在,我希望在点击每个div里的发表按钮时,能在js里获取{{problem.pro_id}}以及{ ...
- css常用属性之display属性
1.dispaly属性之一:块级标签转行内便签display: inline(内容有多大,就展示多大(用F12看区别)) 2.display属性之二:行内便签转块级标签:diaplay: block ...
- CentOS7下mysql忘记root密码的处理方法
1. vi /etc/my.cnf,在[mysqld]中添加 skip-grant-tables 例如: [mysqld] skip-grant-tables datadir=/var/lib/my ...
- IOC 原理
SpringIOC实现原理 1. 依赖倒置 假设我们设计一辆汽车:先设计轮子,然后根据轮子大小设计底盘,接着根据底盘设计车身,最后根据车身设计好整个汽车.这里就出现了一个“依赖”关系:汽车依赖车身,车 ...
- java学习从“菜鸟”到“放弃”
今天学到java的对象和类中, 由于刚考完c++面向对象与程序设计这门课,对于c++中的类掌握自认为不错,就开始过渡到java. 今天面对的问题,在书写一个类的时候,发现了许多与c++不同的地方. 比 ...
- 这10道springboot常见面试题你需要了解下
1.什么是Spring Boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的 ...
- 【MySQL】面试官:如何添加新数据库到MySQL主从复制环境?
写在前面 今天,一名读者反馈说:自己出去面试,被面试官一顿虐啊!为什么呢?因为这名读者面试的是某大厂的研发工程师,偏技术型的.所以,在面试过程中,面试官比较偏向于问技术型的问题.不过,技术终归还是要服 ...
- Spring Boot 第一弹,问候一下世界!!!
持续原创输出,点击上方蓝字关注我吧 目录 前言 什么是Spring Boot? 如何搭建一个Spring Boot项目? 第一个程序 Hello World 依赖解读 什么是配置文件? 什么是启动类? ...
- Android Handler 分析学习
一.Handler简介 Handler 是 Android 中用于线程间交互的机制.与其相关的概念有 Thread.Looper.Runnable.Message.MessageQueue 等. Go ...
- CUP的MESI协议
MESI协议中的状态 CPU中每个缓存行(caceh line)使用4种状态进行标记(使用额外的两位(bit)表示): M: 被修改(Modified) 该缓存行只被缓存在该CPU的缓存中,并且是被修 ...