首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我如何解决"git拉“合并冲突到我之前的提交之一?

我如何解决"git拉“合并冲突到我之前的提交之一?
EN

Stack Overflow用户
提问于 2019-05-31 06:29:16
回答 1查看 29关注 0票数 2

这是我的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之后重新应用它们之外,还有什么需要恢复的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-31 06:48:30

您已经在替换所有提交

Commit C1表示它的父提交是C。您需要一个新的不同的提交-例如,您可以将其命名为E1 -这说明它的父对象是E

这个新的和不同的提交将有一个新的和不同的哈希ID,但是最终,你仍然会有四个提交-它们将只是通过E4E1。你的名字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还会比较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 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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56386412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档