Git &引用;修订;2合并提交

Git &引用;修订;2合并提交,git,merge,Git,Merge,假设我需要将两个分支合并到当前分支中。我首先合并了第一个分支,因此创建了一个带有2个头的合并提交。我现在已经合并了第二个分支,但还没有创建合并提交 是否有可能修改之前的合并提交,使其得到3个父级 o [HEAD] Merge2 |\ o Modified Merge1 o \ Merge1 | \ |\ \ |\ \ | o | A | o | A | | | | | |

假设我需要将两个分支合并到当前分支中。我首先合并了第一个分支,因此创建了一个带有2个头的合并提交。我现在已经合并了第二个分支,但还没有创建合并提交

是否有可能修改之前的合并提交,使其得到3个父级

o [HEAD] Merge2
|\                 o Modified Merge1
o \ Merge1         | \
|\ \               |\ \
| o | A            | o | A
| | |              | | |
| | o B            | | o B
. . .              . . .
. . .     ==>      . . .
. . .              . . .
|/  |              |/  |
o  /               o  /
| /                | /
o                  o/
.                  .
.                  .
.                  .

一个有两个以上父母的承诺(章鱼合并)很可能是一个更令人头疼的问题。但从这里到那里还是有办法的

因为你在本地的合并工作中,我假设你还没有推动第一个合并。这意味着重写历史,抹去它可能不是一个大问题。所以你有一些选择

如果两个合并都不冲突,那么默认的八达通合并策略可能会起作用。在这种情况下,您可以返回到起始状态。因为听起来你好像处于一种合并状态

git merge --abort 
然后撤消上一次合并

git reset --hard HEAD^
那么章鱼合并吗

git merge A B
这种方法的问题在于,八达通合并策略甚至不会试图处理冲突。在这种情况下,您将分两步进行合并—正如您所做的—然后您可以手动创建最终合并提交,用它替换两个“正常”合并提交

但在这一点上,我要再次说,你确定你会想要吗?特别是在有冲突解决方案的情况下,看起来你会把信息扔掉

好吧,如果你选择继续做下去,有几种方法。这未必是“最简单的”,但它避免了管道命令:

继续并提交第二次合并。然后可能创建一个临时标记。(如果您对reflog感到满意,您可能不需要这个标签。)然后返回到预合并状态

git tag merge_goal
git reset --hard HEAD~2
接下来启动一个三父合并,但是(1)使用“我们的”策略避免冲突,(2)不要提交,因为“我们的”策略不会产生您想要的合并结果

git merge --no-commit -s ours A B
这将设置您为新提交创建所需的父列表,但您仍然需要正确获取内容

git rm -r .
git checkout merge_goal -- .
git commit

现在,如果你创建了一个临时标记,你就可以删除它。

一个有两个以上父母的提交(一个八达通合并)可能是一个非常头疼的问题。但从这里到那里还是有办法的

因为你在本地的合并工作中,我假设你还没有推动第一个合并。这意味着重写历史,抹去它可能不是一个大问题。所以你有一些选择

如果两个合并都不冲突,那么默认的八达通合并策略可能会起作用。在这种情况下,您可以返回到起始状态。因为听起来你好像处于一种合并状态

git merge --abort 
然后撤消上一次合并

git reset --hard HEAD^
那么章鱼合并吗

git merge A B
这种方法的问题在于,八达通合并策略甚至不会试图处理冲突。在这种情况下,您将分两步进行合并—正如您所做的—然后您可以手动创建最终合并提交,用它替换两个“正常”合并提交

但在这一点上,我要再次说,你确定你会想要吗?特别是在有冲突解决方案的情况下,看起来你会把信息扔掉

好吧,如果你选择继续做下去,有几种方法。这未必是“最简单的”,但它避免了管道命令:

继续并提交第二次合并。然后可能创建一个临时标记。(如果您对reflog感到满意,您可能不需要这个标签。)然后返回到预合并状态

git tag merge_goal
git reset --hard HEAD~2
接下来启动一个三父合并,但是(1)使用“我们的”策略避免冲突,(2)不要提交,因为“我们的”策略不会产生您想要的合并结果

git merge --no-commit -s ours A B
这将设置您为新提交创建所需的父列表,但您仍然需要正确获取内容

git rm -r .
git checkout merge_goal -- .
git commit

现在,如果你创建了一个临时标记,你就可以删除它。

你为什么要这样做?最后,你确实意识到提交是不可变的,当你编辑它们时,你只是在用不同的历史记录进行新的提交?@MadPhysical:在很多方面都是错误的。但是问为什么这样做是可取的是正确的。是的,我知道我实际上不能编辑提交,但它们将被并行地重新创建。我想知道这种分步合并是否可行,因为我看到过一个存储库,其中一个合并提交有>2个父提交。无论如何,为什么要发生这种情况?最后,您确实意识到提交是不可变的,当您编辑它们时,你只是在用不同的历史做出新的承诺?@MadPhysicast:在很多方面都是错误的。但是问为什么这样做是可取的是正确的。是的,我知道我实际上不能编辑提交,但它们将被并行地重新创建。我想知道这种分步合并是否可行,因为我见过一个存储库,其中一个合并提交的父级提交超过2次。谢谢您的回答。所以章鱼合并不能分几步完成,但需要事先知道如果您的意思是,是否有git命令来获取现有合并和另一个分支,在该分支中合并,并替换现有合并(使用具有附加父级的新合并),而不是生成新合并?不需要。这样做的过程是手动的,这是我上面描述的第二个过程。可能是一个命令,它将两个相邻的合并提交(每两个父级)统一为一个合并提交(每三个父级)?@ThomasS.:再一次,对于您的请求,没有内置的支持。上面的第二个步骤是一种更简单的方法(即瓷法),包括将两个相邻的双亲合并合并为三亲合并的步骤。谢谢您的回答。所以章鱼合并不能分几步完成,但需要事先知道如果你是说,有git命令吗