多人在同一个分支上协作时,很容易出现冲突。即使没有冲突,后push的童鞋不得不先pull,在本地合并,然后才能push成功。

每次合并再push后,分支变成了这样:

$ git log --graph --pretty=oneline --abbrev-commit
* d1be385 (HEAD -> master, origin/master) init hello
*   e5e69f1 Merge branch 'dev'
|\
| *   57c53ab (origin/dev, dev) fix env conflict
| |\
| | * 7a5e5dd add env
| * | 7bd91f1 add new env
| |/
* |   12a631b merged bug fix 101
|\ \
| * | 4c805e2 fix bug 101
|/ /
* |   e1e9c68 merge with no-ff
|\ \
| |/
| * f52c633 add merge
|/
*   cf810e4 conflict fixed

总之看上去很乱,有强迫症的童鞋会问:为什么Git的提交历史不能是一条干净的直线?

其实是可以做到的!

Git有一种称为rebase的操作,有人把它翻译成“变基”。

先不要随意展开想象。我们还是从实际问题出发,看看怎么把分叉的提交变成直线。

在和远程分支同步后,我们对hello.py这个文件做了两次提交。用git log命令看看:

$ git log --graph --pretty=oneline --abbrev-commit
* 582d922 (HEAD -> master) add author
* 8875536 add comment
* d1be385 (origin/master) init hello
*   e5e69f1 Merge branch 'dev'
|\
| *   57c53ab (origin/dev, dev) fix env conflict
| |\
| | * 7a5e5dd add env
| * | 7bd91f1 add new env
...

注意到Git用(HEAD -> master)(origin/master)标识出当前分支的HEAD和远程origin的位置分别是582d922 add authord1be385 init hello,本地分支比远程分支快两个提交。

现在我们尝试推送本地分支:

$ git push origin master
To github.com:michaelliao/learngit.git! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:michaelliao/learngit.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

很不幸,失败了,这说明有人先于我们推送了远程分支。按照经验,先pull一下:

$ git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:michaelliao/learngitd1be385..f005ed4  master     -> origin/master* [new tag]         v1.0       -> v1.0
Auto-merging hello.py
Merge made by the 'recursive' strategy.hello.py | 1 +1 file changed, 1 insertion(+)

再用git status看看状态:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 3 commits.(use "git push" to publish your local commits)nothing to commit, working tree clean

加上刚才合并的提交,现在我们本地分支比远程分支超前3个提交。

git log看看:

$ git log --graph --pretty=oneline --abbrev-commit
*   e0ea545 (HEAD -> master) Merge branch 'master' of github.com:michaelliao/learngit
|\
| * f005ed4 (origin/master) set exit=1
* | 582d922 add author
* | 8875536 add comment
|/
* d1be385 init hello
...

对强迫症童鞋来说,现在事情有点不对头,提交历史分叉了。如果现在把本地分支push到远程,有没有问题?

有!

什么问题?

不好看!

有没有解决方法?

有!

这个时候,rebase就派上了用场。我们输入命令git rebase试试:

$ git rebase
First, rewinding head to replay your work on top of it...
Applying: add comment
Using index info to reconstruct a base tree...
M   hello.py
Falling back to patching base and 3-way merge...
Auto-merging hello.py
Applying: add author
Using index info to reconstruct a base tree...
M   hello.py
Falling back to patching base and 3-way merge...
Auto-merging hello.py

输出了一大堆操作,到底是啥效果?再用git log看看:

$ git log --graph --pretty=oneline --abbrev-commit
* 7e61ed4 (HEAD -> master) add author
* 3611cfe add comment
* f005ed4 (origin/master) set exit=1
* d1be385 init hello
...

原本分叉的提交现在变成一条直线了!这种神奇的操作是怎么实现的?其实原理非常简单。我们注意观察,发现Git把我们本地的提交“挪动”了位置,放到了f005ed4 (origin/master) set exit=1之后,这样,整个提交历史就成了一条直线。rebase操作前后,最终的提交内容是一致的,但是,我们本地的commit修改内容已经变化了,它们的修改不再基于d1be385 init hello,而是基于f005ed4 (origin/master) set exit=1,但最后的提交7e61ed4内容是一致的。

这就是rebase操作的特点:把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了。

最后,通过push操作把本地分支推送到远程:

Mac:~/learngit michael$ git push origin master
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 576 bytes | 576.00 KiB/s, done.
Total 6 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 1 local object.
To github.com:michaelliao/learngit.gitf005ed4..7e61ed4  master -> master

再用git log看看效果:

$ git log --graph --pretty=oneline --abbrev-commit
* 7e61ed4 (HEAD -> master, origin/master) add author
* 3611cfe add comment
* f005ed4 set exit=1
* d1be385 init hello
...

远程分支的提交历史也是一条直线。

小结

  • rebase操作可以把本地未push的分叉提交历史整理成直线;

  • rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

关于git的使用(十五)------Rebase相关推荐

  1. Git命令集十五——拉取命令

    2019独角兽企业重金招聘Python工程师标准>>> Git命令集十五--拉取命令 pull命令用于从其他仓库或本地分支拉取更改到当前分支. 1.git pull 将远程仓库的更改 ...

  2. [系统安全] 四十五.APT系列(10)Metasploit后渗透技术信息收集、权限提权和功能模块详解

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  3. Java设计一个测桃花模块_20145209刘一阳《JAVA程序设计》第十五周补充测试

    第十五周补充测试 1.实验楼Linux中可以通过(ABC)查看用户登录情况. A .who B .who am i C .who mom likes D .who are you 2.在 Linux ...

  4. 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  5. 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备

    孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自学 ...

  6. 二十五个深度学习相关公开数据集

    转 [干货]二十五个深度学习相关公开数据集 2018年04月18日 13:42:53 阅读数:758 (选自Analytics Vidhya:作者:Pranav Dar:磐石编译) 目录 介绍 图像处 ...

  7. ppt_第十五章_元基模拟染色体新陈代谢催化编码

    第十五章_元基模拟染色体新陈代谢催化编码 定义:元基的 新陈代谢一般指 源码工程的函数文件 进行元基编码后的 内容逻辑 接口和类 索引优化方式,主要体现在 文件 的分类,剔除,继承,分配. 定义:元基 ...

  8. 青龙面板--快手极速版-周周十五万金币(内部助力)

    快手极速版-周周十五万金币(纯净版内部助力) 1.拉库 ql raw https://gitee.com/ajouter/shiyi.git/raw/shiyi/ksjsbzzz.js ql raw ...

  9. 量化交易 第十五课 单因子有效性分析之 Alphalens

    第十五课 单因子有效性分析之 Alphalens 概述 Alphalens 的数据结构 参数 factor 格式 price 格式 API 获取综合信息 因子 IC 分析 因子收益率系数分析 概述 A ...

最新文章

  1. python函数中参数前面的*和**的含义
  2. ASP.NET MVC Routing、Areas、URLs
  3. Integer类对象池与==问题:Integer a=34556,b=34556;但a==b为false
  4. 【Alpha阶段汇总】成果展示与体验总结
  5. 安装后jdk1.8 配置环境变量以后 版本显示还是1.7
  6. SQL数据库备份还原命令
  7. 关于 librecad 的中文支持
  8. 易接SDK流程记录以及AndroidManifest解析(无干货)
  9. html mint ui,移动端UI库对比 vant mint-ui
  10. ETL工作经验分享(1)
  11. Jenkins项目配置-Nodejs项目(Vue框架)-全面
  12. 人到中年,没事多休息,有空多赚钱!
  13. Go语言基本语法 (下)
  14. RandomAccess接口使用
  15. MT7628路由器工作原理,MT7628处理器相关参数介绍
  16. 怎么装python的keras库_Keras 教程: Python 深度学习终极入门指南
  17. 手机199开头的号码的正则验证
  18. IDE Eval Reset 插件安装使用
  19. Hacking 开心网(虚拟朋友) with Mechanize
  20. allegro的正片和负片概念

热门文章

  1. 2018 dota2 战队十杀分析
  2. i3 10110u和i5 10210u哪个好
  3. 如何从零开始搭建高性能直播平台?
  4. 贝叶斯个性化排序(BPR)
  5. 2.12-3.20上周的习惯坚持下来了✌️精诚所至金石为开,加油兄弟
  6. C 语言printf打印各种数据类型的方法(u8/s8/u16/s16.../u64/double/float)(全)
  7. java 元祖_JAVA里的元祖类
  8. 西游记中孙悟空有哪些技能?
  9. egg 调用html文件,egg怎么引入vue
  10. 计算机相关新闻 英语,常见的新闻英语短语有什么