你的短语(“rebase [对主人的一个小改变]成功能”)对我来说似乎有点不可思议,因为通常你会将feature
重定为master
。 (“into”一词并不适用。)除此之外,我认为绘制提交图总是有帮助的。您可以使用gitk
或类似的查看器绘制它,或者使用git log --graph
,也可以使用--oneline
绘制垂直方向的图。但是在这里我会画一个水平的,用单个大写字母表示特别有趣的提交,并且小写字母代表更无聊的提交。
就我们的目的而言,我将忽略任何配置的上游(origin/master
和/或origin/feature
)。如果它们确实存在,则可能需要将它们添加到您自己的图形中,然后请注意,当git rebase
提交提交副本时,它不会将任何其他标签(包括这些远程跟踪分支)指向现有提交:它只移动一个标签,即当前分支的标签。
... - A - o - o - o - F <-- master
\ \
B - C - D - E - G <-- HEAD -> feature
运气好的话,这是相当接近的衍合预先设定,准确地反映了你的git merge
的结果。合并之前和之后,提交A
是feature
与master
分离的原始基础;承诺B
到E
分别在feature
;各种不太有趣的o
提交是在master
;并承诺F
是主人的提示。您在分支feature
(以便HEAD
命名分支feature
和git status
表示“在分支功能”),并且您运行git merge master
并做了合并并提交。
该合并创建了feature
的提示最多提交,这是提交G
,这是一个合并提交。
之后,你签出分支master
(使HEAD
点到名字master
),并提出了新的提交感动的master
尖端,所以我们认为添加到我们的图形那么远:
... - A - o - o - o - F - H <-- HEAD -> master
\ \
B - C - D - E - G <-- feature
最后,你想变基上(新尖)feature
master
所以你做了git checkout feature
:
... - A - o - o - o - F - H <-- master
\ \
B - C - D - E - G <-- HEAD -> feature
,现在你运行该命令git rebase master
。
rebase
做的是拷贝提交。
首先,它必须找到其承诺进行复制。它应该复制的提交是那些从当前分支 - 即到达,从名字feature
- 但不是从它的名字会作为上游的分支,即master
。
这里我们遇到了相当大的问题。看看这个(相当密集)段从recent git rebase
documentation:
通过提交当前分支的所有更改,但不在 <上游>被保存到一个临时区域。这与git log <upstream>..HEAD
将显示的那组提交相同;或通过git log 'fork_point'..HEAD
,如果--fork-point
是活动的(见下文--fork-point
的描述);或者通过git log HEAD
,如果指定了--root
选项。
叉点的东西本身有点复杂,但我们现在可以忽略它,因为使用命令git rebase master
表示它已关闭。因此,您可以看到要用git log master..HEAD
重新设置的提交。这是提交B
,C
,D
,E
,并G
(除了底垫通常扔出合并)。
您可能奇怪为什么B
通过E
包括在这里,考虑到合并基础的master
和feature
是提交G
。问题是,虽然合并提交G
点回到提交F
(可达来自主),提交F
不会(也不能)“控球前锋”来G
。所以,当我们从master
尖端开始(新提交H
)和向后工作,我们得到H
,F
,所有的无聊o
S,A
,一切A
前:这些都是排除的提交。当我们从feature
尖端开始(提交G
)和向后工作,我们得到了G
,E
,D
,C
和B
之前,我们碰到的第一个排除(A
)。因此这些是重新分配的候选人。
如果允许底垫中进行,并解决所有的冲突,你会拥有:
B' - C' - D' - E' <-- HEAD -> feature
/
... - A - o - o - o - F - H <-- master
\ \
B - C - D - E - G [abandoned]
(假设所有的将要复制的提交有实际的变化进行复制;犯不需要复制G
,因为这次不会提供任何内容)。
真的吗?在没有多少冲突和重组的情况下,没有合理的方式来使用合并。对于每一个简单的合并,我从这里开始做一个额外的提交看起来很糟糕。有没有其他的方式来处理这个问题?我愿意改变工作流程的建议。 – Eli
是的 - 问题是Git不知道你的合并冲突提交时,因为它从你的提交历史的开始开始。说实话,我认为你现在最好重新配置,摆脱之前的合并冲突解决方案提交。 –
如果重新出现冲突是一个常见问题,'git rerere'命令可能会有所帮助。 – hlovdal