美文网首页
git cherry-pick与rebase

git cherry-pick与rebase

作者: binecy | 来源:发表于2019-03-19 11:18 被阅读0次

    cherry-pick

    假如现在有两个分支v1.0,v1.1。
    v1.0有如下commit:

    commit 4d3b38f3e6b9f49776f6e2d2861f0425e10df8d6 (HEAD -> v1.0)
    Author: bin <bininhere@163.com>
    Date:   Tue Mar 19 10:33:43 2019 +0800
    
        feature5
    
    commit 65ad383c977acd6c7e7bed486bbf3631851a9eda
    Author: bin <bininhere@163.com>
    Date:   Tue Mar 19 10:30:44 2019 +0800
    
        feature4
    
    commit a2a438f2652166f13a6a2aa36f447968fff3b15d
    Author: bin <bininhere@163.com>
    Date:   Tue Mar 19 10:30:09 2019 +0800
    
        feature3
    

    现在v1.1需要合并feature4的功能,但不能合并feature3,feature5,怎么办?
    把代码复制过来吗?不!用cherry-pick

    git cherry-pick  65ad383c977acd6c7e
    

    如果文件有冲突,cherry-pick 会中断,
    你解决冲突后,使用git add添加冲突文件,使用git cherry-pick --continue完成cherry-pick操作。
    或者使用git cherry-pick --abort中断操作。

    如果你cherry-pick的是别人分支的commit,可能会遇到错误fatal: bad object ...,那是因为git cherry-pick是本地特性,本地要有这个commit才可以被git cherry-pick。如果没有这个commit id,就会出现这个错误。

    git rebase

    之前都不太在意 git rebase的使用,直到看了这篇文章
    彻底搞懂 git rebase,规范项目的commit

    想想也是的,如果git log充斥着大量如下commit:

    fixbug
    fixbug
    fixbug
    add log
    add log
    add log
    add log
    

    除了文章中提到的
    1.不利于代码 review
    2.不利于代码回滚
    也不利于自己回顾跟踪代码。

    所以可以使用rebase合并commit。
    我把上面v1.0所有commit合并为一个

    git rebase -i    a2a438f2652   4d3b38f3e
    

    其中-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作。
    这时会弹出编辑页面

    r a2a438f feature3
    
    
    # Rebase 1822165..46c1e55 onto 1822165 (3 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.
    

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

    根据我们需要编辑指令后保存,就可以完成commit的合并了。

    git rebase合并其他分支与git cherry-pick异曲同工,这里不再复述了。

    上面文章中也说到,git rebase会修改commit 记录,属于危险操作,需小心操作。

    参考:
    rebase 用法小结

    相关文章

      网友评论

          本文标题:git cherry-pick与rebase

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