rebase整个分支在master上是否与cherry从挑选的分支中挑选每个提交一样?

时间:2017-12-11 13:22:36

标签: git

那么它不应该是平等的吗?如果我有功能和主分支,并且我想在主服务器上移动功能分支,那就像从每个提交功能分支到主服务器的樱桃一样?

我的想法是它应该是真的,但由于某些原因,对主人的重新定位失败了一些冲突,而樱桃挑选每一次提交都运行得很好。

2 个答案:

答案 0 :(得分:2)

代码明智的樱桃采摘分支(或你在顶层变基础)如果你选择正确的顺序

的差异:

  1. 您将离开原来想要重新定位的分支
  2. 你在树上的两个地方有两个相似的副本(可能是相同的提交)(不包括消息)。
  3. 在樱桃采摘中,您可以按任何顺序进行!如果你从头部到分支机构挑选,你可能会遇到麻烦(rebase将免费申请正确的订单)
  4. 无法压缩提交
  5. 我猜你是在奇怪的顺序中挑选樱桃。例如:

    A->B->C
       \
         D->E
    

    在C上重新制作E就像是从CD中挑选樱桃,然后是E.发布你的树,并且在重新建立时会发生冲突,以及你挑选的顺序 - 看到任何“问题”。< / p>

答案 1 :(得分:2)

大多数情况下,是的,但不完全正确。

首先,有三种方法可以实现git rebase。交互式的一个和-m的一个字面上运行git cherry-pick。非交互式非合并版本默认情况下会在内部使用git format-patch | git am,这有时会产生与运行git cherry-pick不同的结果。

其次,并非每个提交都被选中。特别是,git rebase通常会消除:

  • 提交合并;
  • 提交“空”(没有差异的提交);和
  • 承诺Git决定已经挑选。 1

字面上的合并无法复制,所以除了使用-p(毕竟不复制它们,而是重新执行合并)时,它不会打扰。无法通过git format-patch复制Empty-diff提交,并且通常不需要正确性,因此默认设置是丢弃它们。添加-k(保持为空)甚至使非交互式rebase使用git cherry-pick可以复制empty-diff提交。

最后,根据选项,rebase的所有变体都可以使用“fork point”代码来丢弃要复制的提交集中的一些前导提交。使用--no-fork-point会禁用此选项,默认情况下会为某些 rebase禁用此选项,但默认情况下会为其他 rebase启用。详细信息在the git rebase documentation中详细说明。

除非您正在运行git rebase -mgit rebase -i,否则您看到的差异很可能是由于使用git format-patch | git am。如果您能够识别git amgit apply -3上运行git cherry-pick时采用的具体提交,与git rev-list运行时相比,这将非常有用,因为提交这种情况的提交有点罕见(我没有时间构建一个人工示例,而真实的示例可能更有价值。)

1 为了做出这个决定,Git使用git patch-id,您可以手动运行;或者您可以使用git cherrygit rev-list让Git自动为您运行它。 rebase代码使用git format-patch(有时通过将这些参数或等效参数传递给--reverse --topo-order,有时使用git rev-list --cherry-pick --right-only --no-merges upstream...HEAD ):

1.000,39-
1.000,39
39,9
45,4-
22.323.222,49
40
58-
333.294
33.292,00%
33.292,00 %
39 %
22%
-22,29
-4.343,1

(注意三个点,它们调用对称差异选择器)。