git reword显示在重新设置期间发生合并冲突,但是选择正确

时间:2019-05-22 19:52:02

标签: git

我正在尝试用很少的提交将一个分支改成另一个分支。 尽管提交包括合并提交,但我仍可以使用以下命令git rebase -i -r -m <base_branch>

成功地对其进行基础调整

但是,当我尝试使用'reword'修改某些提交消息时,会看到合并冲突。

我尝试了git rebase -i -r -m <base_branch>命令,并将很少的提交更改为改写而不是选择改写,此后出现了合并冲突。

使用的命令:
git rebase -i -r -m <base_branch>

我希望成功进行基准调整,但是会有冲突。

1 个答案:

答案 0 :(得分:1)

这可能是因为原始合并也存在冲突。 (如果没有访问存储库及其提交的信息,我无法证明是这种情况。)

您看到的是以下事实的副作用:有时git rebase可以避免某些或所有副本,并在可以并且确实避免全部复制,它最终什么也不做。不执行任何操作意味着没有合并提交,但是“复制”之前具有合并冲突的合并意味着您再次看到相同合并冲突。

您可以使用git rerere(和rerere-train脚本,也许:请参阅Smarter rebase avoiding redundant work?)来解决此问题。

请记住,git rebase通过复制提交起作用。一个简单的交互性基础是从列出所有要复制的提交开始,对于每个这样的提交使用pick命令。不过,这种简单的变基 discards 合并了。添加--rebase-merges(或-r)可以说明:保留合并以及原始的提交安排。但是,整个概念存在一个缺陷:尽管可以复制非合并提交,不可能复制复制提交。

git rebase -r(及其更老,更穷的git rebase -p表弟)所做的是,因为它们不能复制合并,所以需要重新执行在必要时合并。也就是说,将一定数量的旧提交复制到具有新的和不同的哈希ID的新提交之后,它们到了“复制”合并的时候了,而是直接运行git merge

例如,给定:

                    C--D
                   /    \
               A--B      G--H   <-- source (HEAD)
              /    \    /
             /      E--F
            /
...--o--o--*--o--o   <-- target

,命令行请求git rebase -r target将生成一系列picklabelresetmerge命令以复制{{1} },ABCDE;然后合并F D the copies of F and G ; then copy H`,以获得:

and

其中提交 C--D / \ A--B G--H <-- [abandoned] / \ / / E--F / ...--o--o--*--o--o <-- target \ \ C'-D' \ / \ A'-B' G'-H' <-- source (HEAD) \ / E'-F' A'的副本,AB'的副本,依此类推。

但是,无论是否使用B选项,请考虑以以下内容开头的变基操作:

-r

您现在通过...--I--J <-- target \ K--L <-- source (HEAD) 要求Git将提交git rebase复制到与K完全相同的新改进的K上,只是它在{之后{1}},而不是紧随K之后。然后,您告诉Git复制J,这样它就不会出现在J的新副本之后,而不会出现在L之后。

Git意识到K之后的K现有副本已经在K之后。因此,它需要制作的“副本”已经存在:J只是直接重复使用 J。现在,它必须复制git rebase才能放在K之后,但要注意:L已经在K之后,所以Git只是重用 { {1}}直接。结果是什么都没有改变。 (如果出于某些原因(出于某些原因)您真的想要 Git仍然要复制L,则可以使用KL或{{ 1}},所有这些都做同样的事情。)

如果您运行相同的rebase,请确保使用交互模式,并且K上使用--force-rebase,现在Git确实已经--no-ff复制到新的-f,类似于reword,但具有不同的提交消息。结果,Git现在确实确实必须复制K,以便它在新消息K之后出现。结果是:

K'

对于像这样的简单线性情况,重新设置总是很顺利,但是当您向混合中添加K时,如果Git强制“复制”(即重新执行)合并,则原始合并有冲突,新合并也会有冲突。