zoukankan      html  css  js  c++  java
  • 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分支,然后运行下面的命令,即可实现我们的要求:

    1
    git rebase test

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

    1. 先将test分支的代码checkout出来,作为工作目录
    2. 然后将master分支从test分支创建起的所有改变的补丁,依次打上。如果打补丁的过程没问题,rebase就搞定了
    3. 如果打补丁的时候出现了问题,就会提示你处理冲突。处理好了,可以运行git rebase –continue继续直到完成
    4. 如果你不想处理,你还是有两个选择,一个是放弃rebase过程(运行git rebase –abort),另一个是直接用test分支的取代当前分支的(git rebase –skip)。

    此外,rebase还能够让你修订以前提交,

     git rebase -i HEAD~3

           表示要修改当前版本的倒数第三次状态。

            这个命令出来之后,会出来三行东东:

            pick:*******

            pick:*******

            pick:*******

            如果你要修改哪个,就把那行的pick改成edit,然后退出。

            这时通过git log你可以发现,git的最后一次提交已经变成你选的那个了,这时再使用:

            git commit -amend

            来对commit进行修改。

            修改完了之后,要回来对不对?

            使用git rebase --continue

    git reset --soft 只会改变状态,不会改变工作区内容

    git reset --hard 既会改变状态也会改变工作区内容

  • 相关阅读:
    显示隐藏,页面搜索,操作DOM
    Jquery点击事件隐藏显示菜单
    《转》学习JQuery该掌握的内容
    跨域调用(mvc、webapi)
    cocos creator基础-(三十二)cc.Graphics组件和cc.Camera组件
    cocos creator基础-(三十一)超大数值计算
    cocos creator实战-(三)简单例子摇杆控制角色移动
    cocos creator基础-(三十)微信小游戏第三方资源部署
    cocos creator实战-(二)跳一跳
    cocos creator实战-(一)台球小游戏
  • 原文地址:https://www.cnblogs.com/yanglang/p/11803448.html
Copyright © 2011-2022 走看看