我的提交树描述如下:
--(+A)--(+B)-+-(-B)--(+E)--(master: AE)
\
+--(+C)--(+D)--(branch: ABCD)
master中的一些更改已恢复。我们需要将分支中的更改合并到主恢复恢复提交。
是否存在一步法?或者在合并分支之前只有一种方法是cherry-pick (B) 来掌握?
PS最终大师必须看起来像:(ABCDE) - 顺序并不重要
我的提交树描述如下:
--(+A)--(+B)-+-(-B)--(+E)--(master: AE)
\
+--(+C)--(+D)--(branch: ABCD)
master中的一些更改已恢复。我们需要将分支中的更改合并到主恢复恢复提交。
是否存在一步法?或者在合并分支之前只有一种方法是cherry-pick (B) 来掌握?
PS最终大师必须看起来像:(ABCDE) - 顺序并不重要
我会这样做:
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 的其余部分。
如果您绝对必须将 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 历史记录很好,但并不总是必须拥有。在日志中恢复提交并不是一件坏事。
我遇到了一个非常接近的问题,但我既不能从 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 或用于进一步开发。
一些想法:
根据提供的答案,没有一步可以达到目标。我认为处理上述情况的更好方法是遵循分支场景:
--(+A)--(+B)--(-B)-+-(+E)--(master: AE)
\
+--(+B)--(+C)--(+D)--(branch: ABCD)
--(+A)--(+B)-+-(-B)--(+E)--(master: AE)
\
+--(+C)--(+D)--(branch: ABCD)
如果您的网络树在上面,并且您想要合并后的 ABCDE。您可以在 (-B) 处创建一个像“revert -B”这样的新分支,然后执行git revert HEAD
,因此您将拥有与 (+B) 相同的所有内容,此时,您可以安全地将分支“ABCD”合并到当前分支,而无需任何冲突。最后结帐以掌握并合并您的分支“revert -B”,完成。