从当前分支顶部的一个分支重新/复制所有缺少的提交

时间:2016-07-19 17:07:26

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

好吧,这看起来很简单,但我找不到简单的解决方案。让我们说有两个分支:

a - b - c - d - e - f <current_branch>
         \
          g - h - i <temp_branch>

我只是希望<temp_branch>中所有丢失的提交都在<current_branch>之上而不触及<temp_branch>且没有合并提交:

a - b - c - d - e - f - g' - h' - i' <current_branch>
         \
          g - h - i <temp_branch>

什么行不通:

  • git rebase:我可以先在<temp_branch>之上重新<current_branch>并快速合并。但那不是我想要的,而且太复杂了。
  • git cherry-pick:如果没有自动方式,则需要手动查找提交范围

一个简单的单行会很棒,比如

git rebase --reverse-order temp_branch HEAD

或者其他一些我不知道的命令?

2 个答案:

答案 0 :(得分:3)

简单方法:

$ git status  # just to make sure you're on the current branch :-)

现在你确定知道你在current_branch上了:

$ git cherry-pick HEAD..temp_branch

依赖cherry-pick的内部排序以正确的顺序执行它们,但不会跳过补丁等效的提交。

跳过补丁相同提交的稍微困难的方法:

$ git cherry-pick $(git rev-list --reverse --topo-order \
    --right-only --cherry-pick HEAD...temp_branch)

或与--left-onlytemp_branch...HEAD相同(这些应该完全相同)。

(我没有测试任何一个,但git rebase --interactive使用:

git rev-list $merges_option --format="%m%H ${format:-%s}" \
    --reverse --left-right --topo-order \
    $revisions ${restrict_revision+^$restrict_revision} | \
    sed -n "s/^>//p" | ...

其中$merges_option--no-merges --cherry-pick$revisions$upstream...$orig_head,其中显而易见,$restrict_revision如果已指定则--fork-pointsed命令删除右侧提交。您可能也想要一个明确的--no-merges,尽管图示的情况不需要这样做。)

答案 1 :(得分:0)

您可以通过这种方式使用rebase(已签出current_branch):

git reset --hard temp_branch && git rebase ORIG_HEAD

它会自动跳过多余的提交。

信用归我的同事Michael Adam提出,他就是这个想法。