好的,这看起来很简单,但我找不到简单的解决方案。假设有两个分支:
a - b - c - d - e - f <current_branch>
\
g - h - i <temp_branch>
我只想要 <temp_branch>
中所有缺失的提交在<current_branch>
之上不碰<temp_branch>
并且没有 merge 提交:
a - b - c - d - e - f - g' - h' - i' <current_branch>
\
g - h - i <temp_branch>
什么没用:
-
git rebase
: 我可以先 rebase<temp_branch>
在<current_branch>
之上并 merge 快进。但这不是我想要的,而且太复杂了。 -
git cherry-pick
: 如果没有自动方式,则需要手动查找提交范围
一个简单的单线会很棒,比如
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-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
,尽管在图示的情况下不需要这样做。)
关于git - 将一个分支中的所有缺失提交 rebase /复制到当前分支之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38464546/