在合并期间忽略还原的更改

Posted

技术标签:

【中文标题】在合并期间忽略还原的更改【英文标题】: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。 【参考方案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”,完成。

【讨论】:

以上是关于在合并期间忽略还原的更改的主要内容,如果未能解决你的问题,请参考以下文章

还原合并的拉取请求

如何正确地将多个合并还原为远程主控

数据库的备份与还原1

4-04数据库的备份与还原

还原特定修订并提交新修订

如何在Git还原后返回本地存储库中的代码