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

Git 在合并期间忽略还原的更改,git,git-merge,git-revert,Git,Git Merge,Git Revert,我的提交树描述如下: --(+A)--(+B)-+-(-B)--(+E)--(master: AE) \ +--(+C)--(+D)--(branch: ABCD) 在主控中恢复了一些更改。我们需要合并从分支到主分支的更改,以还原已还原的提交 一步法存在吗?或者只有一种方法是在合并分支之前将cherry pick(B)选到master p.S.期末硕士必须看起来像:(ABCDE)-顺序并不重要一些想法: 您可以重新设置master和s

我的提交树描述如下:

--(+A)--(+B)-+-(-B)--(+E)--(master: AE)
              \
               +--(+C)--(+D)--(branch: ABCD)
主控中恢复了一些更改。我们需要合并从分支主分支的更改,以还原已还原的提交

一步法存在吗?或者只有一种方法是在合并分支之前将cherry pick(B)选到master

p.S.期末硕士必须看起来像:(ABCDE)-顺序并不重要

一些想法:

  • 您可以重新设置master和skip-B的基址
  • 您可以删除整个主控形状,并将主控形状设置为D和cherrypick E
  • 但也许最简单的一个是你对cherry pick B再次向master提到的

如果您绝对必须将A-B-C-D-E作为提交的顺序,那么您将需要
选择
C和D。这将以(A)-(B)-(B)-(E)-(C)-(D)结束。然后您可以
git-rebase
,您可以删除(-B)并将C和D重新排序到E之前

如果这样做,则不希望合并分支
git cherry pick
创建具有相同更改的新提交。因此,当您合并时,它可能会导致一些问题


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

根据提供的答案,实现目标没有一步之遥。 我认为处理上述情况的更好方法是以下分支场景:

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

我面临着一个非常棘手的问题,但我既不能从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或用于进一步开发

我会这样做:

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的其余部分

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

如果您的网络树在上面,并且合并后需要ABCDE。您可以在(-B)处创建一个像“revert-B”这样的新分支,然后执行git revert HEAD
,这样您就可以对(+B)进行所有操作,此时,您可以安全地将分支“ABCD”合并到当前分支,而不会发生任何冲突。最后签出主控并合并分支“revert-B”,完成。

最终主控必须看起来像:(ABCDE)
这是不可能的。至少不是那样。它看起来像
AEBCD
@poke:yeh。刚刚解决了这个问题实际上这是可能的,但是hacky。。。(我的第二个解决方案)请注意,您可以使用Git2.23(2019年第三季度)。“-S”应该是“-S”不确定为什么在这样的问题上没有其他人有这样的答案。简单明了,切中要害,谢谢!