这是我的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 rebase & resolve conflict + commit git pull --rebase master
这会导致合并冲突。
我可以解决冲突并执行git提交,但是,我不希望创建新的提交,C5。我更希望冲突更改作为旧的提交的一部分,比如C2。
或者,我尝试了git rebase to C2,然后git pull git rebase -i C1
将C2标记为“编辑”。我希望在这方面做git pull --rebase master
,并解决冲突+提交+ git rebase --continue
,这样冲突解决就成为C2的一部分,但这不起作用。
你能建议我做这件事的方法吗?除了恢复我的更改并在git rebase之后重新应用它们之外,还有什么需要恢复的吗?
发布于 2019-05-31 06:48:30
您已经在替换所有提交
Commit C1
表示它的父提交是C
。您需要一个新的不同的提交-例如,您可以将其命名为E1
-这说明它的父对象是E
。
这个新的和不同的提交将有一个新的和不同的哈希ID,但是最终,你仍然会有四个提交-它们将只是通过E4
被E1
。你的名字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中途停止
Rebase的工作原理是复制每个提交,一次一个,将C1
中的快照转换为更改集(针对commit C
-its parent设置),并将该更改集应用于提交E
。Git使用Git的内部合并引擎来实现这一点,也就是说,Git还会比较C
和E
,以确定如何应用C
和C1
。
在这种情况下,比较和复制进行得很好,且Git成功地构建了提交E1
。然后,Git继续尝试通过比较C2
和C1
来构建E2
,将其转换为更改集,然后将其与从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 rebase --continue
来创建新的git add
E2
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
在这一点上,Git将能够尝试复制C3
。如果进展顺利,Git将会自己开发E3
。否则,它会停下来再次向你寻求帮助,你也会经历同样的过程,最终使用git rebase --continue
让Git继续将C4
复制到E4
。
一旦成功创建了E4
,就没有需要执行的副本了,git rebase
完成了它的最后一步:移动名称my_branch
,使其指向E4
而不是C4
,并将特殊名称HEAD
重新附加到名称my_branch
。
https://stackoverflow.com/questions/56386412
复制相似问题