不积跬步,无以至千里
博客
Python
Python
Flask
Django
FastAPI
设计模式(Python语言)
数据结构与算法(Python语言)
爬虫
数据分析
Java
Java
SpringBoot
SprintCloud
CC++
C语言
C++语言
Go
Go
设计模式(Go)
数据结构与算法(Go)
云计算
云计算理论
Linux
Shell
云原生
云原生理论
Docker
Kubernetes
Kubersphere
DevOps
Git
Gitlab
Jenkins
Nexus
Harbor
SonarQube
Grafana
OpenQA
建木
禅道
Compass-CI
前端
HTML
CSS
JavaScript
BootStrap
Vue
React
Markdown
数据库
MySql
Redis
MongoDB
H2 Database
Liquibase
ElasticStack
中间件
MQ
Kafka
Nginx
cpolar
阿里云
测试
测试理论
安全测试
压力测试
Pytest
UnitTest
考试
软考中级(软件设计师考试)
软考高级(系统架构设计师考试)
登录
注册
git merge 和 git rebase 命令的区别
收藏本文
作者:redrose2100 类别:Git 日期:2022-05-08 02:31:29 阅读:205 次 消耗积分:0 分
[【原文链接】git merge 和 git rebase 命令的区别](http://devops-dev.com/article/113) [TOC] # 一、git merge 的流程 如下,首先在一个目录中初始化仓库,然后在master分支创建master_1和master_2两个文件,并两次提交,此时拉出dev分支,然后在master分支继续创建master_3和master_4,然后在dev分支创建dev_5和dev_6,每个文件分别提交,此时在dev分支中使用git merge master,把master分支的代码合入到dev分支,整个过程如下,最后可以看出使用merge合并分支,会在merge的时候,将master分支再在此期间的提交合并到当前分支的默认,然后再默认在增加一次merge的提交,在日常工作中,通常此时会继续将dev的分支merge到master分支,从而完成一次向主分支的提交,此时master分支合dev分支的提交顺序是完全一样了 ```shell hitre@iscas-redrose2100 MINGW64 /d/src/git_demo $ git init Initialized empty Git repository in D:/src/git_demo/.git/ hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ touch master_1 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git add . hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git commit -m "add master_1" [master (root-commit) 9b881da] add master_1 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 master_1 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ touch master_2 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git add . hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git commit -m "add master_2" [master aeacaa2] add master_2 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 master_2 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git checkout -b dev Switched to a new branch 'dev' hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git checkout master Switched to branch 'master' hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ touch master_3 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git add . hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git commit -m "add master_3" [master 11ec7c0] add master_3 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 master_3 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ touch master_4 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git add . hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git commit -m "add master_4" [master 62f1f81] add master_4 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 master_4 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git checkout dev Switched to branch 'dev' hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ touch dev_5 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git add . hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git commit -m "add dev_5" [dev 5610f83] add dev_5 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dev_5 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ touch dev_6 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git add . hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git commit -m "add dev_6" [dev d961705] add dev_6 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dev_6 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git log --graph --pretty=oneline --abbrev-commit * d961705 (HEAD -> dev) add dev_6 * 5610f83 add dev_5 * aeacaa2 add master_2 * 9b881da add master_1 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git merge master Merge made by the 'ort' strategy. master_3 | 0 master_4 | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 master_3 create mode 100644 master_4 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git log --graph --pretty=oneline --abbrev-commit * 282d544 (HEAD -> dev) Merge branch 'master' into dev |\ | * 62f1f81 (master) add master_4 | * 11ec7c0 add master_3 * | d961705 add dev_6 * | 5610f83 add dev_5 |/ * aeacaa2 add master_2 * 9b881da add master_1 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git checkout master Switched to branch 'master' hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git log --graph --pretty=oneline --abbrev-commit * 62f1f81 (HEAD -> master) add master_4 * 11ec7c0 add master_3 * aeacaa2 add master_2 * 9b881da add master_1 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git merge dev Updating 62f1f81..282d544 Fast-forward dev_5 | 0 dev_6 | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 dev_5 create mode 100644 dev_6 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git log --graph --pretty=oneline --abbrev-commit * 282d544 (HEAD -> master, dev) Merge branch 'master' into dev |\ | * 62f1f81 add master_4 | * 11ec7c0 add master_3 * | d961705 add dev_6 * | 5610f83 add dev_5 |/ * aeacaa2 add master_2 * 9b881da add master_1 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ ``` # 二、git rebase的流程 可以使用git reset 先将上述回退到merge之前,比如在master分支 ```shell $ git log --graph --pretty=oneline --abbrev-commit * 282d544 (HEAD -> master, dev) Merge branch 'master' into dev |\ | * 62f1f81 add master_4 | * 11ec7c0 add master_3 * | d961705 add dev_6 * | 5610f83 add dev_5 |/ * aeacaa2 add master_2 * 9b881da add master_1 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git reset --hard 62f1f81 HEAD is now at 62f1f81 add master_4 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git log --graph --pretty=oneline --abbrev-commit * 62f1f81 (HEAD -> master) add master_4 * 11ec7c0 add master_3 * aeacaa2 add master_2 * 9b881da add master_1 ``` 在dev分支 ```shell $ git checkout dev Switched to branch 'dev' hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git log --graph --pretty=oneline --abbrev-commit * 282d544 (HEAD -> dev) Merge branch 'master' into dev |\ | * 62f1f81 (master) add master_4 | * 11ec7c0 add master_3 * | d961705 add dev_6 * | 5610f83 add dev_5 |/ * aeacaa2 add master_2 * 9b881da add master_1 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git reset d961705 --hard HEAD is now at d961705 add dev_6 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git log --graph --pretty=oneline --abbrev-commit * d961705 (HEAD -> dev) add dev_6 * 5610f83 add dev_5 * aeacaa2 add master_2 * 9b881da add master_1 ``` 此时在dev分支执行rebase命令,git rebase 是首先将master分支的合并进来,然后将本分支加到master分支提交记录的后面,此外可以看到此时提交记录就简洁的多了,则就是rebase和merge的主要优势 ```shell $ git rebase master Successfully rebased and updated refs/heads/dev. hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git log --graph --pretty=oneline --abbrev-commit * 3e4ae24 (HEAD -> dev) add dev_6 * 9ac0d04 add dev_5 * 62f1f81 (master) add master_4 * 11ec7c0 add master_3 * aeacaa2 add master_2 * 9b881da add master_1 ``` 此时切回到master分支需要使用merge ```shell hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (dev) $ git checkout master Switched to branch 'master' hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git merge dev Updating 62f1f81..3e4ae24 Fast-forward dev_5 | 0 dev_6 | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 dev_5 create mode 100644 dev_6 hitre@iscas-redrose2100 MINGW64 /d/src/git_demo (master) $ git log --graph --pretty=oneline --abbrev-commit * 3e4ae24 (HEAD -> master, dev) add dev_6 * 9ac0d04 add dev_5 * 62f1f81 add master_4 * 11ec7c0 add master_3 * aeacaa2 add master_2 * 9b881da add master_1 ``` # 三、git rebase 和 git merge区别总结 (1)git meerge 是将当前分支的提交放在merge分支的前面,而git rebase是将当前分支的提交放到reabse分支的后面 (2)git merge 会在最后增加一个merge的提交记录,而git rebase 不会额外增加提交记录 (3)git merge 合并之后提交记录是非常复杂的,而使用git rebase合并之后提交记录是线性的 (4)使用git merge 合并之后就不能再回退自己的提交代码了,如果回退则会降merge的内容一同回退了,而git rebase在合并之后可以继续回退自己的提交,而从rebase合进来的代码不受影响 (4)很明显,dev开发分支适合使用git rebase,而master主分支则非常适合git merge (5)master主分支如果使用git rebase的后果是改变了提交历史,比如多人合作时后使用rebase的必须将前面使用过rebase的代码合到自己的前面,导致跟拉出来分支的时候提交历史不一样了,从而会带来各种比较痛苦的提交体验
始终坚持开源开放共享精神,同时感谢您的充电鼓励和支持!
版权所有,转载本站文章请注明出处:redrose2100, http://blog.redrose2100.com/article/113
上一篇:
git rebase 命令的使用方法
下一篇:
git远端仓库地址管理命令的使用方法
你的昵称:
你的评论:
提示:登录后添加有效评论可享受积分哦!
点此登录
搜索
个人成就
DevOps技术交流微信群
加微信邀请进群
常用网站链接
开源软件洞察
云原生技术栈全景图
Python语言官方文档
Go语言官方文档
Docker官方文档
Jenkins中文用户手册
Markdown语法官方教程
Harbor官方文档
openQA官方文档
云原生开源社区
开源中国
Kubernetes中文文档
Kubernetes中文社区
Kubersphere官方文档
BootStrap中文网站
JavaScript中文网
NumPy官方文档
Pandas官方文档
GitLink确实开源网站
数据库排名网站
编程语言排名网站
SEO综合查询网站
数学加减法练习自动生成网站
Kickstart Generator
文章分类
最新文章
最多阅读
特别推荐
×
Close
登录
注册
找回密码
登录邮箱:
登录密码:
图片验证码:
注册邮箱:
注册密码:
邮箱验证码:
发送邮件
注册邮箱:
新的密码:
邮箱验证码:
发送邮件