git rebase(变基)

认识 git rebase

假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。

$ git checkout -b mywork origin

现在我们在 mywork 分支做一些修改,生成两个提交(C5和C6).

但是与此同时,有些人也在"origin"分支上做了一些修改并且做了提交了。

你可以用"fetch"命令把"origin"分支上的修改拉下来(但是不合并); 正如下图,"origin"和"mywork"这两个分支“分道扬镳”了。

你可以用"merge"命令把"origin"分支合并到你的分支,这会生成一个合并提交(C7)。

但是,如果你不喜欢分叉与合并,你想让"mywork"分支的历史看起来像一条直线,那你可以用 rebase命令

$ git checkout mywork
$ git rebase origin

这会把分叉之后的"mywork"分支(C5,C6)“嫁接”到“origin”分支的顶端。如下图:

当“mywork”分支更新之后,它会指向最后一个新创建的提交(C6’). 而那些老的提交(C5,C6)会被Git 的垃圾收集机制丢弃,如下图:

我们可以看一下用 merge 和用 rebase 所产生的历史的区别:

理解 git rebase

之前我们说过git cherry-pick命令(可以参考我的博文git cherry-pick 详解).

其实“git rebase”就是一系列的“cherry-pick”,只是这一系列的动作用一条命令(git rebase)给完成了。你完全可以通过多次手动“cherry-pick”来复制其行为(不过不太方便,更容易出现人为错误)。

假设你要把 topic 分支 rebase 到 master 分支上

D <-- topic(*)
|
| C <-- master
B |
|/
|
A

你会运行命令:

git checkout topic
git rebase master

在上面的上下文中,“git rebase master”这条命令的潜台词是:

  1. git checkout master # 切换到master分支

  2. git checkout -b topic_rebased # 基于master分支创建并切换一个新分支,比如叫 topic_rebased

  3. for each commit C in master…topic # 对于在topic分支且不在master分支的每个提交 C

    ​ git cherry-pick C # 拣选 C 到 topic_rebased 分支

  4. 忘记"topic" 的过去, 把 topic_rebased 改名为"topic"

过程如下图:

D <-- topic(*)
|
| C <-- master
B |
|/
|
A
D <-- topic
|
| C <-- master, <--topic_rebased(*)
B |
|/
|
A
   B' <-- topic_rebased(*)
D  |
|  |
|  C <-- master
B /
|/
|
A
   D' <-- topic_rebased(*)|B'
D  |
|  |
|  C <-- master
B /
|/
|
A
D' <-- topic(*)
|
B'
|
C <-- master
|
A

在 rebase 的过程中,也许会出现冲突 (conflict)。如果遇到冲突,Git 会停止 rebase,并让你去解决冲突;在解决完冲突后,可以用"git-add"命令去标记此冲突已经解决。 然后,你无需执行 git commit,只要执行:

$ git rebase --continue

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

如果你rebase到一半,突然后悔了,你可以用--abort参数来终止 rebase,并且"mywork" 分支会回到 rebase 开始前的状态。

$ git rebase --abort

----请各位砖家斧正----

【完】

参考资料

【1】https://stackoverflow.com/questions/10058068/in-a-git-cherry-pick-or-rebase-merge-conflict-how-are-base-aka-the-ancestor

【2】http://gitbook.liuhui998.com/4_2.html

【3】https://codeday.me/bug/20180228/136734.html

git rebase(变基)—— Git 学习笔记 19相关推荐

  1. git rebase(变基)操作演示

    1.rebase(变基)操作 注意事项:rebase 改变分支的根源,绝对不要在与其他人共享的分支上进行操作rebase黄金法则:绝不要在公共的分支上使用它! 1.1git merge 与 git r ...

  2. git rebase 变基命令——移花接木

    git rebase 变基命令--移花接木 语法 描述 git rebase <since> [<till>]​ git rebase --onto <newbase&g ...

  3. git Rebase 变基 教程

    在上一节我们看到了,多人在同一个分支上协作时,很容易出现冲突.即使没有冲突,后push的童鞋不得不先pull,在本地合并,然后才能push成功. 每次合并再push后,分支变成了这样: $ git l ...

  4. git rebase 变基

    概念 变基(Rebase)也是合代码的一种手段. 变基与合并(Merge)不同的是,他可以修改历史,使用rebase来代替merge合代码的话,得到的历史记录是一条直线提交历史,无分叉,很漂亮. 然而 ...

  5. Git 分支 - rebase 变基

    变基 在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase. 在本节中我们将学习什么是"变基",怎样使用"变基",并将展示该操作的 ...

  6. 3.6 Git 分支 - 变基

    变基 在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase. 在本节中我们将学习什么是"变基",怎样使用"变基",并将展示该操作的 ...

  7. Git 分支 - 变基

    2019独角兽企业重金招聘Python工程师标准>>> 变基 在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase. 在本节中我们将学习什么是" ...

  8. 6 Git 分支 - 变基

    变基 在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase.在本节中我们将学习什么是"变基",怎样使用"变基",并将展示该操作的惊 ...

  9. Git 分支 - 变基示例操作

    目录 变基 变基的基本操作 更有趣的变基例子 变基的风险 用变基解决变基 变基 vs. 合并 变基 在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase. 在本节中我们将 ...

最新文章

  1. xshell 图形化连接ubuntu
  2. URAL 1635 Mnemonics and Palindromes
  3. 7个重要内排序算法的实现以及实验比较
  4. 只在当前页面生效的css样式,修改页面中的一个样式 仅在当前页面生效
  5. 小试ImageMagik——使用篇
  6. 企业应用网站性能优化实例分析
  7. python深度学习机器学习必备的学习网站集合!
  8. 车机没有carlife可以自己下载吗_安卓车机CarPlay模块初体验
  9. 徒步50公里,35岁的联想可以,你也可以
  10. 【文献阅读】基于深层语言模型的古汉语知识表示及自动断句研究
  11. vue简单实现吸顶效果pc
  12. 总计超5万星!GitHub上10个超级好玩的项目
  13. 信息技术社团活动点名表
  14. 【078期】java.util.* 并发包下 LongAdder 和 AtomicLong 哪个性能更好,为什么?
  15. 计算机专业四大名校排名,美国CS专业四大名校!总有一款适合你!
  16. 第三届“传智杯(练习赛)--E.儒略历
  17. OKCC呼叫中心系统的CRM介绍
  18. 网红品牌打造流程是什么?爆款打造流程分享
  19. Retrofit框架简单学习使用(举例:酷狗搜索和歌曲详情接口)
  20. swagger2注解详细说明

热门文章

  1. 迷宫收集星星 并查集解答
  2. 做中间件的这两年总结(201704-201905)
  3. 部署Django到云服务器(centos+nginx+mysql+uwsgi+python3)【操作篇(1)】
  4. XCode调试器LLDB
  5. 日期控件的点击事件,在js中添加callback属性,不在html中直接添加
  6. 面向对象三大特性,六个原则
  7. 客户关系管理系统-CRM源码
  8. MongoDB 进阶-关联查询
  9. webstorm+nodejs+JetBrains IDE Support+chrome打造前端开发神器
  10. 换64位Win7了,感觉还行