zoukankan      html  css  js  c++  java
  • git合并历史提交

    背景

    以前一直觉得只要pull和push就够了,但合作中总会遇到各种非理想的情况。这时候才发现git其他命令的作用。

    现在的情况是,repo是一个远程team维护的,我们需要增加新feature,那么就是一个feature分支了。由于开发中各种修改,本feature分支多次commit。最后,交给远程team review的时候,人家看着乱七八糟的修改历史很蛋疼:很难看懂各种增量修改。其实,对人家来说,我们的改动应该就是增加或者删除。给他们看开发过程的增量反而太乱。于是,人家要求我们将feature分支的提交合并,这样看起来清爽。

    一些简单的命令准备

    合并分支的命令是rebase,除此之外,其他的一些命令也应该知晓。

    查看commit历史

    git log
    

    查看当前状态

    git status
    

    添加所有文件

    git add .
    

    提交修改

    git commit -m "本次提交添加了xxxx"
    

    vim的简单指令:

    参阅vim的简单使用

    准备一个测试repo

    git init test-rebase
    cd test-rebase
    

    提交一个文件多次:

    vim test.txt
    //输入第一次提交。   
    
    git add test.txt
    git commit -m "1"
    
    vim test.txt
    //输入第2次提交。   
    
    git add test.txt
    git commit -m "2"
    
    vim test.txt
    //输入第3次提交。   
    
    git add test.txt
    git commit -m "3"
    

    查看log:

    git log
    
    //////
    commit 0353373749d72e53a34c7bdda86d77d7bb3ca6fe
    Author: ryan <v-rmiao@expedia.com>
    Date:   Wed Jul 19 13:23:18 2017 +0800
    
        3
    
    commit acf6d24adc2097fda82d29064e8edfef6355d01d
    Author: ryan <v-rmiao@expedia.com>
    Date:   Wed Jul 19 13:20:37 2017 +0800
    
        2
    
    commit 2169bc5e20386951b19aff32143e74f2da683df2
    Author: ryan <v-rmiao@expedia.com>
    Date:   Wed Jul 19 13:19:42 2017 +0800
    
        1
    

    可以看到有三次提交了。现在我们想要把第2次和第3次提交的内容合并成一次提交。

    开始rebase

    1. 复制合并前的一次提交的hash

    这里就是第一次提交的hash。即2169bc5e2

    2. git rebase -i xxx

    git rebase -i 2169bc5e2
    

    进入历史提交的编辑页面,此时编辑方式为vim。

    pick acf6d24 2
    pick 0353373 3
    
    # Rebase 2169bc5..0353373 onto 2169bc5 (2 commands)
    #
    # Commands:
    # p, pick = use commit
    # r, reword = use commit, but edit the commit message
    # e, edit = use commit, but stop for amending
    # s, squash = use commit, but meld into previous commit
    # f, fixup = like "squash", but discard this commit's log message
    # x, exec = run command (the rest of the line) using shell
    # d, drop = remove commit
    #
    # These lines can be re-ordered; they are executed from top to bottom.
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    #
    # However, if you remove everything, the rebase will be aborted.
    #
    # Note that empty commits are commented out
    

    可以看到第2次和第3次的提交消息,并且是从old->new来排序的。我们需要把第3次提交合并到第2次上。使用squash.

    squash

    修改第三次提交为squash,意思是和前一次(第二次)提交合并。
    键盘按键j移动到第二行,然后按a开始编辑,删除pick,插入squash
    如下:

    pick acf6d24 2
    squash  0353373 3
    
    # Rebase 2169bc5..0353373 onto 2169bc5 (2 commands)
    #
    # Commands:
    # p, pick = use commit
    # r, reword = use commit, but edit the commit message
    # e, edit = use commit, but stop for amending
    # s, squash = use commit, but meld into previous commit
    # f, fixup = like "squash", but discard this commit's log message
    # x, exec = run command (the rest of the line) using shell
    # d, drop = remove commit
    #
    # These lines can be re-ordered; they are executed from top to bottom.
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    #
    # However, if you remove everything, the rebase will be aborted.
    #
    # Note that empty commits are commented out
    

    然后,按esc退出编辑,再按:,输入wq保存。
    这时候会进入第二个vim页面,这里让我们再次修改commit message的。就是合并后的message。

    # This is a combination of 2 commits.
    这是合并后的message,以下是之前合并的历史
    # This is the 1st commit message:
    
    2
    
    # This is the commit message #2:
    
    3
    
    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    #
    # Date:      Wed Jul 19 13:20:37 2017 +0800
    #
    # interactive rebase in progress; onto 2169bc5
    # Last commands done (2 commands done):
    #    pick acf6d24 2
    #    squash 0353373 3
    # No commands remaining.
    # You are currently editing a commit while rebasing branch 'master' on '2169bc5'.
    #
    # Changes to be committed:
    

    还是和刚才一样,按o插入下一行,输入这次合并的message。然后按esc,按:, 输入wq保存并退出。

    完事,再次查看log

    git log
    

    内容如下:

    commit 8f54e6b5643ff26ac967a9e6e6cded68a6c50906
    Author: ryan <v-rmiao@expedia.com>
    Date:   Wed Jul 19 13:20:37 2017 +0800
    
        这是合并后的message,以下是之前合并的历史
    
        2
    
        3
    
    commit 2169bc5e20386951b19aff32143e74f2da683df2
    Author: ryan <v-rmiao@expedia.com>
    Date:   Wed Jul 19 13:19:42 2017 +0800
    
        1
    

    参考
    https://git-scm.com/book/zh/v2/Git-工具-重写历史
    https://www.cnblogs.com/wt645631686/p/13550192.html

  • 相关阅读:
    .NET总结
    gzip压缩输出
    矩阵 快速幂
    Mock单元测试
    mysql乱码原因之一
    写个android下倒计时软件
    linux gcc下实现简单socket套接字小程序
    gcc下MD5破解
    #1045 Access denied for user 'root'@'localhost'
    转android四种动画
  • 原文地址:https://www.cnblogs.com/lixuejian/p/15269580.html
Copyright © 2011-2022 走看看