zoukankan      html  css  js  c++  java
  • git rebase 使用

    Git Community Book 中文版书上。摘录例如以下:
     
    一、基本
    git rebase用于把一个分支的改动合并到当前分支。

    如果你如今基于远程分支"origin",创建一个叫"mywork"的分支。
    $ git checkout -b mywork origin
    如果远程分支"origin"已经有了2个提交。如图
    如今我们在这个分支做一些改动,然后生成两个提交(commit).
    $ vi file.txt
    $ git commit
    $ vi otherfile.txt
    $ git commit
    ...
    可是与此同一时候,有些人也在"origin"分支上做了一些改动而且做了提交了. 这就意味着"origin"和"mywork"这两个分支各自"前进"了。它们之间"分叉"了。

    在这里,你能够用"pull"命令把"origin"分支上的改动拉下来而且和你的改动合并; 结果看起来就像一个新的"合并的提交"(merge commit):

     
    可是。假设你想让"mywork"分支历史看起来像没有经过不论什么合并一样,你或许能够用 git rebase:
    $ git checkout mywork
    $ git rebase origin
    这些命令会把你的"mywork"分支里的每一个提交(commit)取消掉。而且把它们暂时 保存为补丁(patch)(这些补丁放到".git/rebase"文件夹中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。
     
    当'mywork'分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 假设执行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除. (请查看 git gc)
     
    二、解决冲突
    rebase的过程中,或许会出现冲突(conflict). 在这样的情况,Git会停止rebase并会让你去解决 冲突;在解决完冲突后,用"git-add"命令去更新这些内容的索引(index), 然后,你无需运行 git-commit,仅仅要运行:
    git rebase --continue
    这样git会继续应用(apply)余下的补丁。
    在不论什么时候,你能够用--abort參数来终止rebase的行动,而且"mywork" 分支会回到rebase開始前的状态。

    git rebase --abort
    三、git rebasegit merge的差别
    如今我们能够看一下用合并(merge)和用rebase所产生的历史的差别:
    当我们使用Git log来參看commit时,其commit的顺序也有所不同。

    如果C3提交于9:00AM,C5提交于10:00AM,C4提交于11:00AM,C6提交于12:00AM,
    对于使用git merge来合并所示commit的顺序(从新到旧)是:C7 ,C6,C4,C5,C3,C2,C1
    对于使用git rebase来合并所示commit的顺序(从新到旧)是:C7 ,C6‘,C5',C4,C3,C2,C1
     由于C6'提交仅仅是C6提交的克隆,C5'提交仅仅是C5提交的克隆。
    从用户的角度看使用git rebase来合并后所示commit的顺序(从新到旧)是:C7 ,C6,C5,C4,C3,C2,C1
     
     
    git rebase小计(转)

    git rebase。顾名思义,就是又一次定义(re)起点(base)的作用,即又一次定义分支的版本号库状态。

    要搞清楚这个东西,要先看看版本号库状态切换的两种情况:

    1. 我们知道,在某个分支上。我们能够通过git reset。实现将当前分支切换到本分支曾经的不论什么一个版本号状态,即所谓的“回溯”。

      即实现了本分支的“懊悔药”。也即版本号控制系统的初衷。

    2. 还有还有一种情况,当我们的项目有多个分支的时候。

      我们除了在本地开发的时候可能会“回溯”外,也经常会将和自己并行开发的别人的分支改动加入到自 己本地来。这样的情况下非经常见。作为项目管理员,肯定会不断的合并各个子项目的补丁,并将最新版本号推送到公共版本号库,而作为开发者之中的一个。提交自己的补丁之 后,往往须要将自己的工作更新到最新的版本号库,也就是说把别的分支的工作包括进来。

    举个样例来说吧。如果我们的项目初期仅仅有一个master分支。然后分支上作过两次提交。这个时候系统仅仅有一个master分支,他的分支历史例如以下:

    master0(初始化后的版本号)
    ||
    v
    master1(第一次提交后的版本号)
    ||
    v
    master2(第二次提交后的版本号)

    这个时候,我们能够通过git reset将master分支(工作文件夹、工作缓存或者是版本号库)切换到master1或者master0版本号。这就是前面所说的第一种情况。
    如果我们这里把master分支通过git reset回溯到了master1状态。那么这个时候系统仍然仅仅有一个master分支,分支的历史例如以下:

    master0(初始化后的版本号)
    ||
    v
    master1(第一次提交后的版本号)

    然后,我们在这里以master1为起点,创建了还有一个分支test。那么对于test分支来说,他的第一个版本号test0就和master1是同一个版本号。此时项目的分支历史例如以下:

    master0(初始化后的版本号)
    ||
    v
    master1(第一次提交后的版本号)===test0(test分支,初始化自master分支master1状态)

    这个时候,我们分别对master分支、test分支作两次提交,此时版本号库应该成了这个样子:

    master0(初始化后的版本号)
    ||
    v
    master1===test0==>test1===>test2
    ||
    v
    master2===>master3

    1. 这个时候,通过第一种git reset的方式,能够将master分支的当前状态(master3)回溯到master分支的master0、master1、master2状态。 也可已将test分支当前状态(test2)回溯到test分支的test0、test1状态。以及test分支的父分支master的master0、 master1状态。
    2. 那么。假设我要让test分支从test0到test2之间全部的改变都加入到master分支来,使得master分支包括test分支的全部改动。

      这个时候就要用到git rebase了。

    首先,我们切换到master分支。然后执行以下的命令,就可以实现我们的要求:


                         git rebase test

    这个时候。git做了些什么呢?

    1. 先将test分支的代码checkout出来。作为工作文件夹
    2. 然后将master分支从test分支创建起的全部改变的补丁。依次打上。假设打补丁的过程没问题,rebase就搞定了
    3. 假设打补丁的时候出现了问题,就会提示你处理冲突。

      处理好了,能够执行git rebase –continue继续直到完毕

    4. 假设你不想处理,你还是有两个选择,一个是放弃rebase过程(执行git rebase –abort),还有一个是直接用test分支的代替当前分支的(git rebase –skip)。
  • 相关阅读:
    (转) tcp的注册端口
    [转] Android中C&C++源码库的初步研究
    (转)vim7.3中文乱码解决方法
    {转} Eclipse 高亮显示选中的相同变量
    libcurl 一个实现了client请求http,ftp的库
    c#操作文件夹
    OutputCache祥解
    非静态的字段、方法或属性“System.Web.UI.Page.ClientScript.get”要求对象引用
    IXMLDOMDocument 成員
    关于中日文和UNICODE之间编码的转换(2008725 15:05:00)
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6781755.html
Copyright © 2011-2022 走看看