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
或者其他一些我不知道的命令?
答案 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-only
和temp_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
,尽管图示的情况不需要这样做。)
答案 1 :(得分:0)
您可以通过这种方式使用rebase(已签出current_branch
):
git reset --hard temp_branch && git rebase ORIG_HEAD
它会自动跳过多余的提交。
信用归我的同事Michael Adam提出,他就是这个想法。