Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 从当前分支顶部的一个分支重新基化/复制所有缺少的提交_Git_Git Rebase_Git Cherry Pick - Fatal编程技术网

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