Rebase/copy 当前分支之上的一个分支中所有缺失的提交

Rebase/copy all missing commits from one branch on top of current branch

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

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 --reverse-order temp_branch HEAD

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

简单的方法:

$ 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-point ). sed 命令删除右侧的提交。您可能还需要一个显式的 --no-merges,尽管在图示的情况下不需要这样做。)

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

git reset --hard temp_branch && git rebase ORIG_HEAD

自动跳过冗余提交。

感谢我的同事 Michael Adam,他提出了这个想法。