【发布时间】:2016-07-07 17:36:09
【问题描述】:
我经常变基。有时rebase 特别成问题(很多合并冲突),我在这种情况下的解决方案是cherry-pick 个人提交到主分支。我这样做是因为几乎每次我这样做时,冲突的数量都会大大减少。
我的问题是为什么会这样。
为什么我cherry-pick 时的合并冲突比我rebase 时少?
在我的心智模型中,rebase 和 cherry-pick 正在做同样的事情。
变基示例
A-B-C (master)
\
D-E (next)
git checkout next
git rebase master
产生
A-B-C (master)
\
D`-E` (next)
然后
git checkout master
git merge next
产生
A-B-C-D`-E` (master)
樱桃采摘示例
A-B-C (master)
\
D-E (next)
git checkout master
git cherry-pick D E
产生
A-B-C-D`-E` (master)
据我了解,最终结果是相同的。 (D 和 E 现在在 master 上,具有干净(直线)的提交历史。)
为什么后者(樱桃采摘)比前者(变基)产生的合并冲突更少?
更新更新更新
我终于能够重现这个问题,现在我意识到我可能过于简化了上面的示例。以下是我能够重现的方式...
假设我有以下(注意额外的分支)
A-B-C (master)
\
D-E (next)
\
F-G (other-next)
然后我执行以下操作
git checkout next
git rebase master
git checkout master
git merge next
我最终得到以下结果
A-B-C-D`-E` (master)
\ \
\ D`-E` (next)
\
D-E
\
F-G (other-next)
从这里开始,我要么变基要么选择樱桃
变基示例
git checkout other-next
git rebase master
产生
A-B-C-D`-E`-F`-G` (master)
樱桃采摘示例
git checkout master
git cherry-pick F G
产生相同的结果
A-B-C-D`-E`-F`-G` (master)
但与变基策略相比,合并冲突要少得多。
终于重现了一个类似的例子,我想我明白为什么与挑选樱桃相比,变基的合并冲突更多,但我会把它留给其他人(他们可能会做得更好(更准确)比我愿意)回答。
【问题讨论】:
-
这个问题可能问得太多了,但是你能提供一个MVCE吗?
-
是的,重现案例有助于理解,因为
git-rebase在后台使用git-cherry-pick。 (无论是显式地还是作为补丁应用程序失败时的后备。) -
尽管如此,我认为在准备好 MVCE 后,您很有可能已经找到了自己问题的答案,并且能够与我们分享关于 rebase 与cherry-picking 的有用指南不同的场景。
-
@EdwardThomson - 非常有趣......这就是我一直在思考 rebase 与 cherry-pick 的方式......
-
@EdwardThomson:你的 cmets(连同@Leon's)让我怀疑我的问题的有效性......我会尝试创建一个 mvce(虽然这可能需要一段时间)......
标签: git git-rebase git-cherry-pick