如何樱桃选择一系列的提交并合并到另一个分支

我有以下存储库布局:

  • 主分公司(生产)
  • 积分
  • 加工
  • 我想要实现的是樱桃从工作分支中选择一系列提交并将其合并到集成分支中。 我对git非常陌生,我无法弄清楚如何正确地做到这一点(在一个操作中樱桃选择提交范围而不是合并),而不会将存储库搞乱。 任何指针或想法呢? 谢谢!


    当涉及到一系列提交时,樱桃采摘是不实际的。

    正如Keith Kim在下面提到的那样,Git 1.7.2+引入了挑选一系列提交的能力(但是您仍然需要知道未来合并的樱桃采摘的后果)

    git cherry-pick“学会选择一系列的提交
    (例如“ cherry-pick A..B ”和“ cherry-pick --stdin ”),“ git revert ”也是如此。 尽管如此,这些并不支持更好的测序控制“ rebase [-i] ”。

    达米安评论并警告我们:

    在“ cherry-pick A..B ”形式中, A应该比B更老
    如果它们的顺序错误,那么命令将自动失败

    如果你想选择范围BD (含) ,那将是B^..D
    请参阅“从以前的提交范围Git创建分支?” 作为例证。

    正如Jubobs在评论中提到的那样:

    这假定B不是根提交; 否则会出现“ unknown revision ”错误。

    注意:从Git 2.9.x / 2.10(2016年第3季度)开始,您可以直接在孤立分支上挑选一系列提交(空头):请参阅“如何使现有分支成为git中的孤儿”。


    原文答案(2010年1月)

    如Charles Bailey在这里描述的那样, rebase --onto会更好,您可以在整合分支之上重播给定的提交范围。
    (同样,在git rebase手册页中查找“这里是如何将基于一个分支的主题分支移植到另一个分支”,以查看git rebase --onto的实际示例 - git rebase --onto

    如果您当前的分支是整合:

    # Checkout a new temporary branch at the current location
    git checkout -b tmp
    
    # Move the integration branch to the head of the new patchset
    git branch -f integration last_SHA-1_of_working_branch_range
    
    # Rebase the patchset onto tmp, the old location of integration
    git rebase --onto tmp first_SHA-1_of_working_branch_range~1 integration
    

    这将重播之间的一切:

  • first_SHA-1_of_working_branch_range (因此~1 )的父first_SHA-1_of_working_branch_range之后:您想要重放的第一个提交
  • 直到“ integration ”(指向您想要重放的最后一次提交,来自working分支)
  • 到“ tmp ”(它指向之前integration指向的地方)

    如果其中一个提交重放时发生冲突:

  • 要么解决它并运行“ git rebase --continue ”。
  • 或者跳过这个补丁,然后运行“ git rebase --skip
  • 或者用“ git rebase --abort ”取消所有的事情(并且把tmp分支上的integration分支放回去)
  • 在这个rebase --onto - integration将返回到集成分支的最后一次提交(即“ tmp ”分支+所有重新提交的提交)

    rebase --onto樱桃采摘或rebase --onto ,不要忘记它会对后续合并造成影响,如此处所述。


    这里讨论一个纯粹的“ cherry-pick ”解决方案,其中涉及如下内容:

    如果你想使用补丁方法,那么你可以选择“git format-patch | git am”和“git cherry”。
    目前, git cherry-pick只接受一次提交,但是如果你想从D中选择范围B ,那么在git lingo中就是B^..D

    git rev-list --reverse --topo-order B^..D | while read rev 
    do 
      git cherry-pick $rev || break 
    done 
    

    但无论如何,当你需要“重放”一系列提交时,“重放”这个词应该会促使你使用Git的“ rebase ”特性。


    从git v1.7.2开始,cherry pick可以接受一系列的提交:

    git cherry-pick学会了选择一系列的提交(例如cherry-pick A..Bcherry-pick --stdin ), git revert ; 尽管如此,这些不支持更好的测序控制rebase [-i]


    你确定你不想实际合并分支吗? 如果工作分支有一些你不想要的提交,你可以在你想要的位置创建一个带有HEAD的新分支。

    现在,如果您确实想挑选一系列提交,无论出于何种原因,一个优雅的方法是只需提取一个补丁集并将其应用到您的新集成分支中:

    git format-patch A..B
    git checkout integration
    git am *.patch
    

    这基本上就是git-rebase正在做的事情,但不需要玩游戏。 如果你需要合并,你可以添加--3waygit-am 。 请确保在您执行此操作的目录中已经没有其他* .patch文件,如果您逐字按照说明操作...

    链接地址: http://www.djcxy.com/p/25257.html

    上一篇: How to cherry pick a range of commits and merge into another branch

    下一篇: How to suspress the position: relative when using translate