如何解决“ git pull”合并冲突到我以前的提交之一?

时间:2019-05-30 22:29:16

标签: git github

这是我的git树的样子:

A   B   C   D   E
o---o---o---o---o master
         \
          o---o---o---o my_branch
          C1  C2  C3  C4

我试图用master重新建立my_branch的基础,但是最终我的树看起来像这样,但是我有合并冲突,我希望将其作为我的提交C2(或更早的提交)的一部分来解决,而不是头顶(C4)。

A   B   C   D   E
o---o---o---o---o master
                 \
                  o---o---o---o my_branch
                  C1  C2* C3  C4
                       |
                      includes merge conflict resolution with master 

已尝试:Git调整基准并解决冲突+提交 git pull --rebase master这会导致合并冲突。

我可以解决冲突并执行git commit,但是,我不希望创建新的提交C5。我希望将冲突更改作为旧提交(例如C2)的一部分进行。

或者,我尝试将git rebase设置为C2,然后进行git pull git rebase -i C1将C2标记为“编辑”。我希望对此做git pull --rebase master,并解决冲突+ commit + git rebase --continue,以便解决冲突成为C2的一部分,但这没有用。

您能建议我一种方法吗?除了恢复我的更改并在git rebase之后重新应用它们之外,什么都没有?

1 个答案:

答案 0 :(得分:2)

您已经替换了所有提交

提交C1表示其父提交为C。您需要一个新的不同的提交(例如,您可以将其称为E1),即其父级为E

此新的和不同的提交将具有新的和不同的哈希ID。但是,最后,您仍然会有四次提交-它们只是E1E4。您的名字my_branch将标识新的提交E4;提交C4将被忘记,并且最终会消失,除非有人或其他东西拥有它并且不会放手:

                  E1  E2  E3  E4
                  o---o---o---o   <-- my_branch
A   B   C   D   E/
o---o---o---o---o   <-- master
         \
          o---o---o---o   [abandoned]
          C1  C2  C3  C4

git rebase发生冲突时,它会停在基准站的中间

Rebase的工作方式是一次复制每个提交,将C1中的快照转换为针对提交C(其父级)的更改集,并将该更改集应用于提交{{ 1}}。 Git使用Git的内部合并引擎完成此操作,即Git还将EC进行比较,以确定如何应用EC

在这种情况下,比较和复制进行得很顺利,Git成功构建了提交C1。然后,Git继续尝试通过将E1E2进行比较来构建C2,将其变成一个变更集,然后将其与从C1到{ {1}}。这是发生冲突的地方。因此,到此为止,您已经:

C1

提交E1正在进行中,但尚不存在。您必须解决冲突, E1 o <-- HEAD A B C D E/ o---o---o---o---o <-- master \ o---o---o---o <-- my_branch C1 C2 C3 C4 个已解决的文件,然后运行E2以使Git进行新的提交git add

git rebase --continue

这时,Git将能够尝试复制E2。如果一切顺利,Git将自行制作 E1 E2 o---o <-- HEAD A B C D E/ o---o---o---o---o <-- master \ o---o---o---o <-- my_branch C1 C2 C3 C4 。否则,它将停止再次获得您的帮助,并且您执行相同的过程,并最终使用C3使Git继续将E3复制到git rebase --continue

成功制作C4后,就没有副本可以执行了,E4会做最后一个技巧:它将名称E4移到{{1} },而不是git rebase,而是将特殊名称my_branch附加到名称E4