git rebase vs git cherry-pick of detached branch

时间:2014-04-26 11:37:36

标签: git git-rebase git-cherry-pick

我有两个分支:

  1. TMP
  2. 分离

    tmp分支 我需要将tmp分支置于master之上,解决优先级为tmp

    的冲突

    当我这样做时

    git checkout tmp
    git rebase --strategy=recursive -X theirs master
    

    我收到了错误 首先,倒头重温你的工作......

    fatal: Could not parse object '0a722ac51071ecb4d00b1ef45384aac227b942a0^'  
    Unknown exit code (128) from command: git-merge-recursive 0a722ac51071ecb4d00b1ef45384aac227b942a0^ -- HEAD 0a722ac51071ecb4d00b1ef45384aac227b942a0  
    

    当我这样做时

    git checkout tmp
    git cherry-pick --strategy=recursive -X theirs 0a722ac..384144a 
    

    工作正常

    有什么不同或如何使用rebase做同样的事情?

2 个答案:

答案 0 :(得分:7)

您收到rebase错误,因为您没有明确告诉它哪个提交开始,并且因为您明确告诉它调用合并,所以它去寻找合并基础 1 。要告诉它不要打扰,只需要取整个分支,指定--root

git checkout tmp
git rebase --strategy=recursive -X theirs --root master

您的cherry-pick没有按照您的想法行事。 ..构造意味着"不是左边的提交或者它可以从中获得的任何东西......",特别是在这种情况下,它意味着"不是0a722ac"。它没有挑选整个分支。由于cherry-pick构建为期望单次提交,因此您必须明确指定范围,这里的方法是将排除集默认为HEAD(因为HEAD没有任何共同点使用tmp,不会排除任何内容):

git checkout master
git cherry-pick --strategy=recursive -X theirs  ..tmp

范围规范中的不对称性只是两个命令的结果。最常见的用法:rebase适用于整个当前分支,而cherry-pick通常用于一个或多个单一提交。


1 不是非常聪明,但是使用他们自己复杂的合并历史批发(线性全分支rebase工作得很好)的rebasing分支将会发痒所以很少有人怀疑你会成为能鼓起很多帮助划伤它的愿望。

答案 1 :(得分:2)

通过在某个提交之后移动所有提交来完成rebase:此处位于0a722ac的父级之后。

A cherry-pick获取提交列表并复制它们:0a722ac..384144a

由于0a722ac^无法访问(例如,对于孤立分支,其中0a722ac将是第一次提交),rebase将失败,挑选(不需要)访问0a722ac的父级将成功。

点击“How to cherry pick a range of commits and merge into another branch”了解更多信息。