这是我的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之后重新应用它们之外,什么都没有?
答案 0 :(得分:2)
提交C1
表示其父提交为C
。您需要一个新的不同的提交(例如,您可以将其称为E1
),即其父级为E
。
此新的和不同的提交将具有新的和不同的哈希ID。但是,最后,您仍然会有四次提交-它们只是E1
至E4
。您的名字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还将E
与C
进行比较,以确定如何应用E
与C
。
在这种情况下,比较和复制进行得很顺利,Git成功构建了提交C1
。然后,Git继续尝试通过将E1
与E2
进行比较来构建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
。