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



这是我的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。 不过,最终您仍然会有四个提交 - 它们只会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(其父级)的更改集,并将该更改集应用于提交E。 Git 使用 Git 的内部合并引擎来做到这一点,即 Git 还会比较CE,以确定如何应用CC1

在这种情况下,比较和复制进展顺利,Git 成功构建了提交E1。 然后 Git 继续尝试通过将C2C1进行比较来构建E2,将其转换为更改集,然后将其与从C1E1的更改合并。 这就是冲突发生的地方。 因此,在这一点上,您有:

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

相关内容

  • 没有找到相关文章

最新更新