【问题标题】:Git merge only fixes, no merge from other branchesGit 合并只修复,不合并其他分支
【发布时间】:2012-07-04 09:37:45
【问题描述】:

我们的处境很复杂。我们有这个存储库之王:

        C1      C4              C5
devel   *---*---*---*-----------*---------
              \_____
                    \    C2    C3      
fix-ie  *--*---------*----*----*-------*---
                     M1                 \___
                                            \
testing *----*-------------------------------*---
                                             M2

如您所见,devel 被合并到 fix-ie 分支中。

问题是“测试”分支不应该有“开发”提交(我们不想要 C1),但我们需要在“测试”中合并修复即只有 C2 和 C3 提交

如果我这样做:

git checkout testing
git merge fix-ie

我将在我的测试分支中进行 M1 合并...所以在我们的测试分支中可以找到 C1 提交。这不是我们想要的。

如何避免这种情况?

请记住,我简化了示例,在我们的 fix-ie 和 devel 分支中有很多合并和提交。

谢谢:)

【问题讨论】:

    标签: git merge branch


    【解决方案1】:

    一种方法是创建一个单独的fix-ie 分支,从您的devel 分支中排除合并提交。然后,您可以将该分支合并到您的 testing 分支。

    您可以使用 git reflog show -all 搜索您的 reflog,以从您想要忽略的 devel 分支中查找合并提交。

    【讨论】:

    • 但问题是 fix-ie 和 testing 是 "devel" 的分支... devel 是主要分支, testing 是 devel 的分支,其中包含一些针对测试环境的修复。 devel 是为下一个版本制作的。 fix-ie中有很多合并(来自devel)
    【解决方案2】:

    看来我找到了解决办法。

    获取第一个合并 SHA,例如名为“123abc”。我能做到:

    git rev-list --no-merges --reverse --topo-order debug-ie ^123abc
    

    然后每一行都是一个提交,但列表中没有合并。

    所以我能做的就是:

    for SHA in $(git rev-list --no-merges --reverse --topo-order debug-ie ^123abc); do
        git cherry-pick $SHA
    done
    

    如果我错了,请告诉我……但这似乎是个好主意。

    【讨论】:

    • 你实际上是在复制所有的提交,这并不总是最好的主意
    猜你喜欢
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2012-08-04
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多