我正在尝试用很少的提交将一个分支改成另一个分支。
尽管提交包括合并提交,但我仍可以使用以下命令git rebase -i -r -m <base_branch>
但是,当我尝试使用'reword
'修改某些提交消息时,会看到合并冲突。
我尝试了git rebase -i -r -m <base_branch>
命令,并将很少的提交更改为改写而不是选择改写,此后出现了合并冲突。
使用的命令:
git rebase -i -r -m <base_branch>
我希望成功进行基准调整,但是会有冲突。
答案 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
将生成一系列pick
,label
,reset
和merge
命令以复制{{1} },A
,B
,C
,D
和E
;然后合并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'
的副本,A
是B'
的副本,依此类推。
但是,无论是否使用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
,则可以使用K
或L
或{{ 1}},所有这些都做同样的事情。)
如果您运行相同的rebase,请确保使用交互模式,并且和在K
上使用--force-rebase
,现在Git确实已经将--no-ff
复制到新的-f
,类似于reword
,但具有不同的提交消息。结果,Git现在确实确实必须复制K
,以便它在新消息K
之后出现。结果是:
K'
对于像这样的简单线性情况,重新设置总是很顺利,但是当您向混合中添加K
时,如果Git强制“复制”(即重新执行)合并,则原始合并有冲突,新合并也会有冲突。