在合并期间忽略还原的更改
Posted
技术标签:
【中文标题】在合并期间忽略还原的更改【英文标题】:Ignore reverted changes during merge 【发布时间】:2013-12-01 19:06:13 【问题描述】:我的提交树描述如下:
--(+A)--(+B)-+-(-B)--(+E)--(master: AE)
\
+--(+C)--(+D)--(branch: ABCD)
master 中的一些更改已恢复。我们需要合并从 branch 到 master 的更改以恢复已恢复的提交。
是否存在一步法?或者只有一种方法是 cherry-pick (B) 在合并 分支 之前 master?
附:最终 master 必须如下所示: (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”,完成。
【讨论】:
以上是关于在合并期间忽略还原的更改的主要内容,如果未能解决你的问题,请参考以下文章