这是我的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 提交,但是,我不希望创建新的提交 C5。我宁愿将冲突更改作为较旧提交(例如 C2)的一部分进行。
或者,我尝试将 git 变基为 C2,然后将 git 拉git rebase -i C1
标记为 C2作为"编辑"。我希望对此做git pull --rebase master
,解决冲突 + 提交 +git rebase --continue
,以便冲突解决成为 C2 的一部分,但这不起作用。
你能建议我这样做的方法吗?除了恢复我的更改并在 git 变基后重新应用它们之外,还有什么吗?
你已经在替换所有提交
提交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
(其父级)的更改集,并将该更改集应用于提交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 add
已解决的文件,并运行git rebase --continue
以使 Git 进行新的提交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
。