Skip to main content

Command Palette

Search for a command to run...

git rebase 用法

Published
2 min read
git rebase 用法

git rabase(变基)常用三个功能:

  • 分支合并
  • 合并commit
  • 更改commit信息
  1. 合并分支

    原理是将当前分支与要rebase的分支进行比较,找到两条分支的共同节点,然后将当前分支变基到master上,并创建一个临时文件c4,然后切换到master分支上,并进行一次merge,此时master和experiment分支都指向了c4,此时可以删除experiment分支。

    $ git checkout experiment
    $ git rebase master
    $ git checkout master
    $ git merge experiment
    

basic-rebase-1.png

basic-rebase-3.png

basic-rebase-4.png

​ 与merge的区别是,merge会创建一个新的merge节点同时指向c3,c4。所以merge会保留c4的commit信息,而rebase在c4'会重新提交包含c3和c4的commit信息。merge更能保存信息,rebase更简洁,保证分支的提交是线性的。

​ merge后分支情况如下:

basic-rebase-2.png

  1. 合并commit

    当前git log如下

    $ git log --graph --oneline
    * 853b82d (HEAD -> test) commit3
    * 3802571 commit2
    * d231bc8 commit1
    

    使用git rebase -i 来指定需要合并节点的父节点,如果要合并commit2和commit3,指定commit1的log id,然后自动弹出vim来修改commit(注意这里的commit的顺序与git log的顺序是相反的!)。将pick修改为s表示此commit会被上一个commit合并,即新提交的commit合并到旧的commit上。

    $ git rebase -i d231bc8
    
    pick 3802571 commit2
    pick 853b82d commit3
    
    # Rebase d231bc8..853b82d onto d231bc8 (2 commands)
    #
    # Commands:
    # p, pick <commit> = use commit
    
    pick 3802571 commit2
    s 853b82d commit3
    
    # Rebase d231bc8..853b82d onto d231bc8 (2 commands)
    #
    # Commands:
    # p, pick <commit> = use commit
    

    将pick修改为s后可以修改commit message:

    # This is a combination of 2 commits.
    # This is the 1st commit message:
    
    commit2
    
    # This is the commit message #2:
    
    commit3
    
    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    #
    # Date:      Sat Jun 11 13:59:58 2022 +0800
    

    此时commit3已合并到commit2中

    $ git log --oneline --graph
    * dc30c78 (HEAD -> test) commit2
    * d231bc8 commit1
    

    commit2的message如下:

    commit dc30c78c979b4974ba29c2e17eb2c1787a8bd6f3 (HEAD -> test)
    Author: 
    Date:   Sat Jun 11 13:59:58 2022 +0800
    
        commit2
    
        commit3
    
  1. 更改commit信息

    commit信息如下,要修改commit2的message,需要使用git rebase -i指定父节点的log ID,在这即commit1的ID

    $ git log --oneline --graph
    * dc30c78 (HEAD -> test) commit2
    * d231bc8 commit1
    

    commit2的message如下:

    commit dc30c78c979b4974ba29c2e17eb2c1787a8bd6f3 (HEAD -> test)
    Author: 
    Date:   Sat Jun 11 13:59:58 2022 +0800
    
        commit2
    
        commit3
    
    $ git rebase -i d231bc8
    

    vim将pick修改为r修改提交信息

    pick dc30c78 commit2
    
    # Rebase d231bc8..dc30c78 onto d231bc8 (1 command)
    #
    
    s dc30c78 commit2
    
    # Rebase d231bc8..dc30c78 onto d231bc8 (1 command)
    #
    

    将commit2和commit3修改到一行上

    commit2 commit3
    
    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    #
    # Date:      Sat Jun 11 13:59:58 2022 +0800
    

    git log 查看commit2的message

    commit c6e822ac8d84d17da4668b530667573c345dccf7 (HEAD -> test)
    Author: 
    Date:   Sat Jun 11 13:59:58 2022 +0800
    
        commit2 commit3
    

其中 pick , s , r 参数的含义如下:

5f5a79a5d2bde029d4de9d98026ef3f2.png

More from this blog

根据前、中、后序数组构造二叉树

根据两个遍历数组生成二叉树,主要是固定住一个根节点,然后去另一个数组查找下标,划分数组做左右子树,再递归执行左子树和右子树。 这里主要讨论的是使用切片的过程中如何确定切片的起始点,即切片的区间,利用的是左子树的长度。 前序和中序构造二叉树 105. 从前序与中序遍历序列构造二叉树 递归加切片, python 中可以使用 index 函数直接获取值的下标。 注意:切片是左闭右开区间,最后一个值取不到 切片的下标如何思考:利用左子树的长度来辅助思考。idx 是中序数组中的当前节点下标,所以左子...

Apr 3, 20242 min read
根据前、中、后序数组构造二叉树

二叉树的遍历

掌握两种方法进行二叉树的遍历,这里重点看迭代法是怎么写,迭代法使用栈来模拟递归中的栈,也可以使用一种通用方式进行前、中、后序遍历。 递归法 def dfs(root) { // 前序遍历 dfs(root.left) // 中序遍历 dfs(root.right) // 后序遍历 } 迭代法:迭代法是用 stack 栈来模拟递归栈 下面这种写法可以统一前序、中序、后序遍历方式的写法,只需要改变入栈顺序 前序遍历:中,左,右中序遍历:左,中,右后序遍历:左...

Apr 3, 20242 min read
二叉树的遍历

函数式编程在 Java 和 Go 中的应用

函数式编程是一种 "编程范式"(programming paradigm),就是如何编写程序的方法论。 函数式编程特点: 函数是"第一等公民" 只用"表达式",不用"语句" "表达式"(expression)是一个单纯的运算过程,总是有返回值;"语句"(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。 没有"副作用" 所谓"副作用"(side effect),指的是函数内部与外部互动(最典型的情况,就...

Jun 26, 20237 min read
函数式编程在 Java 和 Go 中的应用

Untitled Publication

13 posts