git rebase——分支变基

  • git rebase——分支变基
  • 变基的风险

git rebase——分支变基

整合分支最容易的方法是 merge 命令。 它会把两个分支的最新快照(C3 和 C4)以及二者最近的共同祖先(C2)进行三方合并,合并的结果是生成一个新的快照(并提交)。



其实,还有一种方法:你可以提取在 C4 中引入的补丁和修改,然后在 C3 的基础上应用一次。 在 Git 中,这种操作就叫做 变基(rebase)。 你可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。

在这个例子中,你可以检出 experiment 分支,然后将它变基到 master 分支上:

$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command

它的原理是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master) 的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件, 然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。 (译注:写明了 commit id,以便理解,下同)

现在回到 master 分支,进行一次快进合并。

$ git checkout master
$ git merge experiment


此时,C4’ 指向的快照就和 the merge example 中 C5 指向的快照一模一样了。 这两种整合方法的最终结果没有任何区别,但是变基使得提交历史更加整洁。 你在查看一个经过变基的分支的历史记录时会发现,尽管实际的开发工作是并行的, 但它们看上去就像是串行的一样,提交历史是一条直线没有分叉。

一般我们这样做的目的是为了确保在向远程分支推送时能保持提交历史的整洁——例如向某个其他人维护的项目贡献代码时。 在这种情况下,你首先在自己的分支里进行开发,当开发完成时你需要先将你的代码变基到 origin/master 上,然后再向主项目提交修改。 这样的话,该项目的维护者就不再需要进行整合工作,只需要快进合并便可。

请注意,无论是通过变基,还是通过三方合并,整合的最终结果所指向的快照始终是一样的,只不过提交历史不同罢了。 变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。

变基的风险

如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

如果你遵循这条金科玉律,就不会出差错。 否则,人民群众会仇恨你,你的朋友和家人也会嘲笑你,唾弃你。

变基操作的实质是丢弃一些现有的提交,然后相应地新建一些内容一样但实际上不同的提交。 如果你已经将提交推送至某个仓库,而其他人也已经从该仓库拉取提交并进行了后续工作,此时,如果你用 git rebase 命令重新整理了提交并再次推送,你的同伴因此将不得不再次将他们手头的工作与你的提交进行整合,如果接下来你还要拉取并整合他们修改过的提交,事情就会变得一团糟。

让我们来看一个在公开的仓库上执行变基操作所带来的问题。 假设你从一个中央服务器克隆然后在它的基础上进行了一些开发。 你的提交历史如图所示:克隆一个仓库,然后在它的基础上进行了一些开发

然后,某人又向中央服务器提交了一些修改,其中还包括一次合并。 你抓取了这些在远程分支上的修改,并将其合并到你本地的开发分支,然后你的提交历史就会变成这样:

接下来,这个人又决定把合并操作回滚,改用变基;继而又用 git push --force 命令覆盖了服务器上的提交历史。 之后你从服务器抓取更新,会发现多出来一些新的提交。有人推送了经过变基的提交,并丢弃了你的本地开发所基于的一些提交


结果就是你们两人的处境都十分尴尬。 如果你执行 git pull 命令,你将合并来自两条提交历史的内容,生成一个新的合并提交,最终仓库会如图所示:


你将相同的内容又合并了一次,生成了一个新的提交
此时如果你执行 git log 命令,你会发现有两个提交的作者、日期、日志居然是一样的,这会令人感到混乱。 此外,如果你将这一堆又推送到服务器上,你实际上是将那些已经被变基抛弃的提交又找了回来,这会令人感到更加混乱。 很明显对方并不想在提交历史中看到 C4 和 C6,因为之前就是他把这两个提交通过变基丢弃的。

git rebase——分支变基及变基的风险相关推荐

  1. git rebase 两个交叉branch换基

    1 向下游移动base 下游移动base,根节点是两个分支的交叉点 1.初始化数据 * c54f8b7 (HEAD -> b) version3 b | * f9fc6be (a) versio ...

  2. git rebase 变基

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

  3. 变基的风险以及如何用变基解决变基

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/50724116 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  4. git命令及git合并分支进行多人协作

    git命令及git合并分支进行多人协作 git命令大全 git的工作区.暂存区.本地仓库和远程仓库 git常用命令 git revert 和 git reset的区别 修改默认分支 合并分支 Git分 ...

  5. Git rebase 命令行操作

    Git rebase 命令行操作 1.创建新分支(在需要进行rebase的分支上开辟新分支) git checkout -b rebase 2.进行rebase操作(master作为变基的节点,也可以 ...

  6. git Rebase 变基 教程

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

  7. git rebase(变基)—— Git 学习笔记 19

    git rebase(变基) 认识 git rebase 假设你现在基于远程分支"origin",创建一个叫"mywork"的分支. $ git checkou ...

  8. Git rebase(变基)操作详解

    目录 简单变基操作 复现 变基 更复杂的变基 复现 变基 变基操作建议 简单变基操作 复现 先复现一个变基操作的现场,具体做法如下: (1)创建一个testrebase目录,在该目录下执行git in ...

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

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

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

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

最新文章

  1. 光辉岁月:人工智能的那些人和事(1)
  2. ubuntu mysql配置教程视频_ubuntu16.04安装配置mysql数据库,分割视频为帧图像
  3. c语言线性表的逆转,数据结构(C语言)设有一个线性表E,将线性表逆置,要求逆线性表占? 爱问知识人...
  4. 现实世界的Windows Azure:采访Dot Net Solutions的首席执行官Dan Scarfe
  5. h5 video 手机 显示第一帧_解决h5嵌入app后video标签poster不能显示视频第一帧(表现为空白)...
  6. 循环内部异步函数处理相关问题解析
  7. pycharm显示全部数据_PyCharm第一次安装及使用教程
  8. 用ACL 对Dos***进行分类的示例
  9. centos 安装jdk_新Jenkins实践-第2章 JENKINS SERVER的安装部署方式
  10. Linux 之CentOS7使用firewalld打开关闭防火墙与端口
  11. 给new comer程序员的建议
  12. Ngnix服务器详解(Windows版本)(非原创)
  13. Android打开系统设置界面
  14. 龙架构(LoongArch)赋能众享链网,相关产品已完成适配
  15. Percona-toolkit的安装和配置-杨建荣的学习笔记
  16. CTeX:中英文混排无法正常换行+字体调整+行距调整
  17. 全面梳理关系型数据库和NoSQL的使用情景
  18. 怎么用计算机来玩反恐精英,你第一次去网吧是为了玩什么游戏?网友:反恐精英一直到英雄联盟...
  19. lms算法的matlab实现,LMS算法的MATLAB实现
  20. [强文]有几个还活着?十年应用软件之路

热门文章

  1. JS 应用篇(一):Underfined与Null的区别
  2. Unity Shader 实现PS图层混合效果
  3. android反编译脱壳,Android脱壳圣战之---如何脱掉爱加密家的保护壳
  4. 帆软报表 异常汇总及方案.
  5. html 获取页面高度css,css怎么获得屏幕的高度?
  6. Pre-trained Adversarial Perturbations-对抗机器学习论文
  7. 关于计算机网考教学研讨,【计算机教学论文】计算机教学质量的研讨2篇(共4479字)...
  8. 【ESP32之旅】ESP32C3 Arduino库使用方法
  9. 个人QQ号码推广代码
  10. 云集网上各种解决win10锁屏壁纸不能播放幻灯片的方法