【问题标题】:How can two branches be combined into a single branch based on the date of each commit?如何根据每次提交的日期将两个分支合并为一个分支?
【发布时间】:2011-07-21 14:39:52
【问题描述】:

假设我有一个如下所示的 git 存储库:

merge-base---A1--A2------A3------A4 (branchA)
          \
           ----------B1------B2 (branchB)

为了简单起见,假设branchA上的提交是对fileA的严格修改,branchB上的提交是对fileB的严格修改。

我想将这些分支合并到第三个分支 branchAB 中,其中的提交将按日期排序:

merge-base---A1--A2------A3------A4 (branchA)
          \
           ----------B1------B2 (branchB)
            \
             A1--A2--B1--A3--B2--A4 (branchAB)

有没有办法通过单个 git 命令自动执行此操作,还是我坚持使用手动方法(例如樱桃采摘或 rebase -i)?

顺便说一句,merge-base 是一个标签。

【问题讨论】:

    标签: git date merge rebase cherry-pick


    【解决方案1】:

    这是一个基于adymitruk's original answer的解决方案:

    git checkout -b branchAB merge-base
    git merge branchA
    git merge branchB
    git rebase --onto merge-base merge-base branchAB
    

    【讨论】:

    • 我知道第一次合并只是快进。那么为什么不直接在其他分支之一之上创建 ab 分支作为起点呢?
    • @adymitruk:这不会重新排序提交,以便您获得一个分支的所有提交,然后是另一个分支的所有提交吗?保留订单(基于日期)非常重要。
    • @adymitruk:再想一想,是的,在 branchA 的尖端启动 branchAB 应该没问题,然后合并到 branchB。重要的是做一个rebase --onto 删除branchAB 上的合并历史,按日期重新排序提交。
    • 如果在此合并步骤之后分支 A 和分支 B 上的工作继续进行,此过程是否还会继续工作?还是 rebase 搞砸了?
    【解决方案2】:

    应该这样做:

    git branch branchAB branchA
    git checkout branchB
    git merge branchA
    git rebase --onto A1^ B1^ branchAB
    

    rebase 将“吃掉”合并提交,因为未指定 --preserve-merges。

    希望对你有帮助

    【讨论】:

    • 关闭,但您的解决方案存在两个问题。首先,它修改了 branchB,而不是创建第三个分支 branchAB。其次,最后一个命令从组合分支 (branchB) 中删除 A4。除了这两件事,它完全符合我的要求。谢谢!如果您能解决我提到的两个问题,我会将您的答案标记为已接受;)
    • 完成。无需进行快进合并,只需在其他分支之上创建 AB 分支。
    • 我刚刚尝试了您编辑的解决方案(将A1^B1^ 替换为merge-base)。不幸的是,它甚至还没有接近工作。 branchAB 最终与 branchA 相同,branchB 被更改为指向 将分支“branchA”合并到分​​支 B
    • 为了澄清,“您编辑的解决方案”是指您的答案的修订版 3。修订版 1 更接近。
    • git rebase --onto branchB branchA branchAB
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2021-12-29
    • 2016-03-23
    • 2011-11-02
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多