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提到的
选择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”不确定为什么在这样的问题上没有其他人有这样的答案。简单明了,切中要害,谢谢!