Git 从当前分支顶部的一个分支重新基化/复制所有缺少的提交
好的,这看起来很简单,但我找不到一个简单的解决方案。假设有两个分支:Git 从当前分支顶部的一个分支重新基化/复制所有缺少的提交,git,git-rebase,git-cherry-pick,Git,Git Rebase,Git Cherry Pick,好的,这看起来很简单,但我找不到一个简单的解决方案。假设有两个分支: a - b - c - d - e - f <current_branch> \ g - h - i <temp_branch> 或者其他我不知道的命令?简单的方法: $ git status # just to make sure you're on the current branch :-) 现在您已经确定您在当前的分支上: $ git cherry-p
a - b - c - d - e - f <current_branch>
\
g - h - i <temp_branch>
或者其他我不知道的命令?简单的方法:
$ git status # just to make sure you're on the 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)
或者与-仅左和临时分支…头相同(这些应该完全相同)
(我没有测试任何一个,但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\u选项
是--无合并--樱桃选择
,$revisions
是$上游…$orig\u head
,这些是明显的,$restrict\u revision
是通过--分叉点
(如果指定))。sed
命令删除右侧提交。您可能需要一个明确的——不合并,尽管图示案例不需要这样做。)您可以通过这种方式使用rebase(签出当前分支
):
它会自动跳过冗余提交
归功于我的同事,他提出了这个想法。通过“缺少提交”,你的意思是你真的想像git-rebase
那样跳过其他相同的提交吗?这很好,但不是必需的。我知道提交不完全相同。git cherry pick..temp_branch
!这就是我要找的。我不知道您不仅可以为log
指定提交差异,还可以为cherry pick
指定提交差异(可能在其他任何地方)。谢谢
$ git cherry-pick $(git rev-list --reverse --topo-order \
--right-only --cherry-pick HEAD...temp_branch)
git rev-list $merges_option --format="%m%H ${format:-%s}" \
--reverse --left-right --topo-order \
$revisions ${restrict_revision+^$restrict_revision} | \
sed -n "s/^>//p" | ...
git reset --hard temp_branch && git rebase ORIG_HEAD