4

我的提交树描述如下:

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

master中的一些更改已恢复。我们需要将分支中的更改合并到恢复恢复提交。

是否存在一步法?或者在合并分支之前只有一种方法是cherry-pick (B) 来掌握

PS最终大师必须看起来像:(ABCDE) - 顺序并不重要

4

6 回答 6

4

我会这样做:

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

于 2016-12-06T11:55:39.090 回答
1

如果您绝对必须将 ABCDE 作为提交的顺序,那么您将需要cherry-pickC 和 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 历史记录很好,但并不总是必须拥有。在日志中恢复提交并不是一件坏事。

于 2013-11-18T15:35:33.750 回答
1

我遇到了一个非常接近的问题,但我既不能从 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 或用于进一步开发。

于 2016-12-06T10:45:00.320 回答
0

一些想法:

  • 你可以 rebase master 并跳过 -B
  • 您可以放下整个主人并将主人 HEAD 设置为 D 和cherrypick E。
  • 但也许最简单的一个是你提到的樱桃挑选 B 再次掌握。
于 2013-11-18T15:12:26.850 回答
0

根据提供的答案,没有一步可以达到目标。我认为处理上述情况的更好方法是遵循分支场景:

--(+A)--(+B)--(-B)-+-(+E)--(master: AE)
                    \
                     +--(+B)--(+C)--(+D)--(branch: ABCD)
于 2013-11-19T21:45:34.187 回答
0
--(+A)--(+B)-+-(-B)--(+E)--(master: AE)
              \
               +--(+C)--(+D)--(branch: ABCD)

如果您的网络树在上面,并且您想要合并后的 ABCDE。您可以在 (-B) 处创建一个像“revert -B”这样的新分支,然后执行git revert HEAD,因此您将拥有与 (+B) 相同的所有内容,此时,您可以安全地将分支“ABCD”合并到当前分支,而无需任何冲突。最后结帐以掌握并合并您的分支“revert -B”,完成。

于 2019-08-29T07:18:05.387 回答