樱桃采摘与重新定位

时间:2010-06-11 11:46:10

标签: git rebase git-rebase cherry-pick

以下是我通常面临的情况:

您在masterdesign上有一组提交,我希望将其置于production分支之上。

我倾向于创建一个新的分支,其基数为production,然后选择这些提交并将其合并到production

然后当我将master合并到生产中时,我面临合并冲突,因为即使更改是相同的,但由于樱桃选择而被注册为不同的提交。

我找到了一些解决方法,所有这些都是费力的,可以称之为“黑客”。

Altho'我没有做太多的变基,我相信这也会创建一个新的提交哈希。

我应该在我喜欢的地方使用变基。与此相比还有什么其他优势。

1 个答案:

答案 0 :(得分:4)

您应该在生产之上设置rebase --interactive您的设计分支,其中:

  • 您可以从生产中需要的那些开始重新排序您的提交
  • 然后,您可以将生产合并到您想要合并的设计的最后一次提交(快进)
    -x--x--x1--x--x2 (design)
      \
       p--p (production)

x1和x2需要包含在生产中:

git checkout design
git rebase --interactive production

-x
  \
   p--p (production)
       \ 
        x1'-x2'--x'--x' (design)

然后:

git checkout production
git merge x2'
-x
  \
   p--p--x1'--x2' (production)
                \
                 x'--x' (design)

允许你:

  • 验证当前设计提交对生产提交(durung rebase)
  • 重新设计设计提交
  • 包括生产中的第一批
  • 允许从设计到生产的后续合并是快进的。

Lakshman Prasad补充道:

  

我在大部分时间结束时推动更改。所以并没有真正帮助那么多。对于推送的主分支,您的答案将如何变化

我会这样做,但是只为操作创建了一个私有分支:

git checkout master
git checkout -b master-private
    -x--x--x1--x--x2 (master, master-private)
      \
       p--p (production)

,然后是rebase,这次是私人分支(即你不会推动的分支)。

git rebase --interactive production

-x--x--x1--x--x2 (master)
  \
   p--p (production)
       \ 
        x1'-x2'--x'--x' (master-private)

然后:

git checkout production
git merge x2'

-x--x--x1--x--x2 (master)
  \
   p--p--x1'--x2' (production)
                \
                 x'--x' (master-private)

master不会从提交重新排序中获益(使用更合理的顺序),但至少可以随时推送master

production仍然可以包含它所需要的内容 如果master的后续提交具有相同的问题(某些问题需要包含在production中,其他问题将在稍后进行),我会:

  • 删除master-private(我们并不关心那些x',来自master的x提交副本)
  • 在主
  • 之上创建master-private分支
  • 使用粗略的冲突解决策略重新执行rebase --interactive(除了master-private分支的第一次提交,因为那些需要集成在production分支中)
    -x--x--x1--x--x2--x--x3--x (master)
      \
       p--p--x1'--x2'--x3' (production)
                   |     \
                   |      x''--x'' (master-private)
                    \
                     x'..x' (old x' from the first master-private)