美文网首页
Git使用之追加提交和合并提交

Git使用之追加提交和合并提交

作者: SnowZhang | 来源:发表于2018-07-12 10:13 被阅读0次

    在上一篇Git使用教程之版本回退我们已经学会如何使用git进行版本管理,并尝试提交和版本回退。接下来我们将继续学习,有关提交的高级用法。例如我们想把多次提交合并成一次提交,把漏提交的内容追加到上次提交。本节我们将使用两个重要的命令git commit --amendgit rebase命令。

    git commit --amend追加提交

    首先我们设想下面一种情况,在开发过程中,你为了完成某一项工作,修改了很多个文件,最后当工作完成的时候,我们需要将这次完成的功能提交到代码库。提交的时候你可能会这么注释“finish xxx work”完成了某某某工作。这个工作完成之后,你可能要进行下一个工作。在进行下个工作之前,你突然发现刚才的提交漏了两个文件,这个时候如果你再次提交一次,显然是不合适的。因为那样会产生两次提交不利于以后的版本维护。那么这个时候就需要用到git commit --amend了。千说不如一练。看下面的demo。
    首先新建一个文件1.txt和新建一个2.txt,然后将1.txt添加到暂存区,并提交到版本库,log为commit 1.txt。然后将2.txt添加到暂存区,然后提交的时候使用--amend
    会出现如下的界面

      1 commit 1.txt
      2
      3 # Please enter the commit message for your changes. Lines starting
      4 # with '#' will be ignored, and an empty message aborts the commit.
      5 #
      6 # Date:      Wed Jul 11 15:19:00 2018 +0800
      7 #
      8 # On branch master
      9 # Changes to be committed:
     10 #       new file:   1.txt
     11 #       new file:   2.txt
     12 #
    

    这个时候我们看到了第一次提交的内容和log。提交完成之后我们查看当前git状态和提交历史。我们发现虽然我们提交了两次,但是log中只出现了一次提交。因为我们使用--amend将第二次提交追加到第一次提交上了。这样会使我们的提交历史变得整洁清晰。

    commit ce42e88895cc87c43458c284df911b500b7e94fd (HEAD -> master)
    Author: snowzhang <xxxx@aliyun.com>
    Date:   Wed Jul 11 15:19:00 2018 +0800
    
        commit 1.txt and commit 2.txt
    

    git rebase 合并多次提交

    rebasegit中是一个非常有魅力的命令,使用得当会极大提高自己的工作效率;相反,如果乱用,会给团队中其他人带来麻烦。它的作用简要概括为:可以对某一段线性提交历史进行编辑、删除、复制、粘贴;因此,合理使用rebase命令可以使我们的提交历史干净、简洁!
    前提:不要通过rebase对任何已经提交到公共仓库中的commit进行修改(你自己一个人玩的分支除外)
    当我们在本地仓库中提交了多次,在我们把本地提交push到公共仓库中之前,为了让提交记录更简洁明了,我们希望把如下分支B、C、D三个提交记录合并为一个完整的提交,然后再push到公共仓库。

    git rebase commit.png 下面开始实践rebase命令
    • 首先创建三次次提交BCD
    snowzhang@snowdeMBP-2:~/gitLearn$     git log
    commit 9a931be7950033df6905b8b77dc590cdfc37367c (HEAD -> master)
    Author: snowzhang <snxxxxxxx@aliyun.com>
    Date:   Wed Jul 11 15:50:55 2018 +0800
    
        commit D
    
    commit 68b8f4ce42e0201fb731085790ffeb190d9747b5
    Author: snowzhang <snxxxxxxx@aliyun.com>
    Date:   Wed Jul 11 15:50:06 2018 +0800
    
        commit C
    
    commit d9bebec678b202ac388518ed0aed3a2fb7bc85b3
    Author: snowzhang <snxxxxxxx@aliyun.com>
    Date:   Wed Jul 11 15:49:27 2018 +0800
    
        commit B
    

    这里我们使用命令:

    git rebase -i  [startpoint]  [endpoint]
    

    其中-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。
    在查看到了log日志后,我们运行以下命令:

    git rebase -i ce42e8889
    
    rebase vim .png

    上面显示未注释区域为我们的编辑区域,下面注释区的Commands为命令,具体命令解释如下:

    • pick:保留该commit(缩写:p)
    • reword:保留该commit,但我需要修改该commit的注释(缩写:r)
    • edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
    • squash:将该commit和前一个commit合并(缩写:s)
    • fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
    • exec:执行shell命令(缩写:x)
    • drop:我要丢弃该commit(缩写:d)

    我们将按照上面的命令提示,修改pick成下面这样

    pick d9bebec commit B
    s 68b8f4c commit C
    s 9a931be commit D
    

    最终查看git log会给出这样的提示

    commit 3ab108fd7e0fb3a7477763f2ef8032251105e69f (HEAD -> master)
    Author: snowzhang <snxxxx@aliyun.com>
    Date:   Wed Jul 11 15:49:27 2018 +0800
    
        commit B
    
        commit C
    
        commit D
    

    证明我们已经将BCD三次提交合并成一次提交了。
    至此,关于两种合并方式已经演示完毕。写的不好,还请多多包涵。
    下一节,讲讲什么是工作区,暂存区,和git库,以及他们之间的关系。

    相关文章

      网友评论

          本文标题:Git使用之追加提交和合并提交

          本文链接:https://www.haomeiwen.com/subject/pnyhpftx.html