【问题标题】:Ignore reverted changes during merge在合并期间忽略还原的更改
【发布时间】:2013-12-01 19:06:13
【问题描述】:

我的提交树描述如下:

--(+A)--(+B)-+-(-B)--(+E)--(master: AE)
              \
               +--(+C)--(+D)--(branch: ABCD)

ma​​ster 中的一些更改已恢复。我们需要合并从 branchma​​ster 的更改以恢复已恢复的提交。

是否存在一步法?或者只有一种方法是 cherry-pick (B) 在合并 分支 之前 ma​​ster

附:最终 ma​​ster 必须如下所示: (ABCDE) - 顺序不重要

【问题讨论】:

  • Final master must look like: (ABCDE) 这是不可能的。至少不是这个顺序。它看起来像AEBCD
  • @poke:是的。刚刚解决了问题
  • 其实是可以的,但是很hacky...(我的第二个解决方案)
  • 请注意,您可以使用 Git 2.23(2019 年第三季度)skip a commit during a cherry-pick

标签: git git-merge git-revert


【解决方案1】:

我会这样做:

git checkout branch
git merge $minusB^    # only if -B is not right after the fork point
git merge -s ours $minusB
git merge master

即在B反转之前合并所有内容,然后合并B的反转,但忽略它引入的更改,最后合并master的其余部分。

【讨论】:

  • “-S”应该是“-s”
  • 不知道为什么没有其他人对这样的问题有这个答案。简单明了,谢谢!
【解决方案2】:

如果您绝对必须将 ABCDE 作为提交的顺序,那么您将需要 cherry-pick C 和 D。这将以 (A) - (+B) - (-B) - (E) - 结尾(C) - (D)。然后你可以git rebase,你可以去掉(-B)并将C和D重新排序到E之前。

如果你这样做,那么你不想合并你的分支。 git cherry-pick 创建一个具有相同更改的新提交。所以当你合并它时可能会导致一些问题。

http://git-scm.com/book/en/Git-Branching-Rebasing#The-Perils-of-Rebasing

如果您正在处理远程分支,并且所有这些提交都被推送。你不应该这样做。您正在远程更改历史记录,这可能会导致其他人获取更改时出现问题。只需 merge 分支到 master,正确解决任何冲突,您最终将得到您正在寻找的状态的代码。拥有一个不错的线性 git 历史记录很好,但并不总是必须拥有。在日志中恢复提交并不是一件坏事。

【讨论】:

    【解决方案3】:

    我遇到了一个很严重的问题,但我既不能从 master 中删除提交,也不能在 master 中重新排序它们。而且我需要重新设置分支 ABCD 以获得正确的提交历史记录。我也想避免再次申请B。我就是这样解决这种情况的。

    --(+A)--(+B)--(-B)-+-(+E)--(master: AE)
                |\
                | +-(+C)--(+D)--(branch: ABCD)
                |
                 \+ cherrypick (-B) + revert(-B) + merge ABCD (+C') -(+D') + rebase AE (+E)  -- (branch: AB-BE--BC'D')
    

    获得的分支 AB-B--BEC'D' 可以轻松合并到 master 或用于进一步开发。

    【讨论】:

      【解决方案4】:

      一些想法:

      • 你可以 rebase master 并跳过 -B
      • 您可以删除整个母版并将母版 HEAD 设置为 D 和cherrypick E。
      • 但也许最简单的方法是您提到的再次挑选 B 来掌握。

      【讨论】:

        【解决方案5】:

        根据提供的答案,没有一步法可以达到目标。 我认为处理上述情况的更好方法是遵循分支场景:

        --(+A)--(+B)--(-B)-+-(+E)--(master: AE)
                            \
                             +--(+B)--(+C)--(+D)--(branch: ABCD)
        

        【讨论】:

          【解决方案6】:
          --(+A)--(+B)-+-(-B)--(+E)--(master: AE)
                        \
                         +--(+C)--(+D)--(branch: ABCD)
          

          如果您的网络树在上面,并且您想要合并后的 ABCDE。您可以在 (-B) 处创建一个新的分支,如“revert -B”,然后执行git revert HEAD,因此您将拥有与 (+B) 相同的所有内容,此时,您可以安全地将分支“ABCD”合并到当前分支没有任何冲突。最后结帐以掌握并合并您的分支“revert -B”,完成。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-26
            • 2012-01-09
            • 1970-01-01
            • 2013-02-20
            • 2016-01-12
            • 2021-07-29
            • 1970-01-01
            相关资源
            最近更新 更多