Rebase Considered Harmful

Merge的两种方式

  1. 向上游提交“干净”的patch。不包含历史信息——日常提交、BUG fix、与上游的Merge记录等。就如同一系列针对当前HEAD的diff。
  2. 携带完整的历史,并永久保留。

git鼓励第1种方式——使用rebase。而有些系统则鼓励第2种,例如Darcs。

git rebase

git rebase的工作方式:

  1. 从目标仓库中移除所有本地patch;
  2. 升级到上游的最新版本;
  3. 重新向HEAD提交你的每个本地change——如果有冲突则中止,直到你fix掉。

而传统的Merge则与之相反:

  1. 将上游的新patch更新到你的本地分支上;
  2. 解掉冲突后提交为新的版本。

rebase的问题

git rebase的manpage上说:“当你rebase一个分支时,你是在更改它的历史。如果有人已经保存了这个分支的一份拷贝,当他尝试从你那获取更新时,就可能有问题。”

为什么会出现问题?因为pull和rebase完全不同,pull是从上游获取一系列commit历史,而rebase则移除了旧的历史。

结论

只能对private的分支使用rebase,千万不要对public的分支使用rebase,否则你就会明白为什么说rebase是有害的。

为什么Rebase是有害的的更多相关文章

  1. Git 进阶指南(git ssh keys / reset / rebase / alias / tag / submodule )

    在掌握了基础的 Git 使用 之后,可能会遇到一些常见的问题.以下是猫哥筛选总结的部分常见问题,分享给各位朋友,掌握了这些问题的中的要点之后,git 进阶也就完成了,它包含以下部分: 如何修改 ori ...

  2. 利用rebase来压缩多次提交

    我们可以用Git merge –squash来将分支中多次提交合并到master后,只保留一次提交历史.但是有些提交到github远程仓库中的commit信息如何合并呢? 历史记录 首先我们查看一下m ...

  3. git rebase

    git rebase -i HEAD~[number_of_commits] git rebase -i HEAD~2

  4. git 开发merge rebase 记录

    git status git lg git add src/ git commit -m "restful api and portal" //先commit到自己的本地branc ...

  5. 【翻译】jQuery是有害的

    原文:http://lea.verou.me/2015/04/jquery-considered-harmful/**(第一次翻译,望大家多批评指正) jQuery是有害的 嗨,我总想写一个“X”是有 ...

  6. git commit之后未submit,rebase之后找不到自己代码的处理方法

    今天使用sourceTree提交代码的时候,commit之后未submit,直接rebase主分支代码,完了发现自己本地做的修改都没了,且远程没有本地分支.google之后发现有一个简单方法可以恢复到 ...

  7. git rebase与 git合并(error: failed to push some refs to)解决方法

    1.遇到的问题 本地有一个git仓库,在github上新建了一个空的仓库,但是更新了REWADME.md的信息,即在github上多了一个提交. 关联远程仓库,操作顺序如下: git remote a ...

  8. 聊下git pull --rebase

    有一种场景是经常发生的. 大家都基于develop拉出分支进行并行开发,这里的分支可能是多到数十个.然后彼此在进行自己的逻辑编写,时间可能需要几天或者几周.在这期间你可能需要时不时的需要pull下远程 ...

  9. 聊下 git rebase -i

    在使用git作为源代码管理工具的时候,开发的时经常会面临一个常见的问题,多个commit 需要合并为一个完整的commit提交. 在一个基本的迭代周期里,你会有很多次commit,有跟配置文件相关的, ...

随机推荐

  1. web.xml中对post请求的乱码问题解决

    直接在web.xml中添加如下代码: <filter> <filter-name>encodingFilter</filter-name> <filter-c ...

  2. mysql 简单主从

    主服务器master [root@localhost ~]# vim /etc/my.cnf [mysqld] log-bin=mysql-bin #必须开启log-bin server-id=129 ...

  3. soapUI-Conditional Goto

    1.1.1  Conditional Goto 1.1.1.1 概述 - Conditional Goto Conditional Goto TestStep包含任意数量的XPath/JSONPath ...

  4. 机器学习理论基础学习13--- 隐马尔科夫模型 (HMM)

    隐含马尔可夫模型并不是俄罗斯数学家马尔可夫发明的,而是美国数学家鲍姆提出的,隐含马尔可夫模型的训练方法(鲍姆-韦尔奇算法)也是以他名字命名的.隐含马尔可夫模型一直被认为是解决大多数自然语言处理问题最为 ...

  5. 使用jmeter进行websocket协议压测

    第一步:添加websocket sampler组件 可以使用plugins manager进行添加,首先下载plugins manager组件: 下载路径:  https://jmeter-plugi ...

  6. java 字节流与字符流的区别详解

    字节流与字符流 先来看一下流的概念: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入 ...

  7. rabbitmq_坑

      一.None of the specified endpoints were reachable 这个异常在创建连接时抛出(CreateConnection()),原因一般是ConnectionF ...

  8. Redis缓存穿透问题及解决方案

    上周在工作中遇到了一个问题场景,即查询商品的配件信息时(商品:配件为1:N的关系),如若商品并未配置配件信息,则查数据库为空,且不会加入缓存,这就会导致,下次在查询同样商品的配件时,由于缓存未命中,则 ...

  9. 排序-----插入排序(python版)

    直接插入排序的算法思路: (1) 设置监视哨r[0],将待插入纪录的值赋值给r[0]: (2) 设置开始查找的位置j: (3) 在数组中进行搜索,搜索中将第j个纪录后移,直至r[0].key≥r[j] ...

  10. Python tricks(2) -- method默认参数和闭包closure

    Python的method可以设置默认参数, 默认参数如果是可变的类型, 比如list, map等, 将会影响所有的该方法调用. 下面是一个简单的例子 def f(a=None, l=[]): if ...