Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.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_Cherry Pick - Fatal编程技术网

Git 如何选择多个提交

Git 如何选择多个提交,git,git-rebase,cherry-pick,Git,Git Rebase,Cherry Pick,我有两个分支。提交a是其中一个的头,而另一个在a之上有b、c、d、e和f。我想将c、d、e和f移动到第一个分支而不提交b。使用cherry pick很容易:将第一个分支cherry pick逐个签出c到f,然后将第二个分支重新设置到第一个分支上。但是有没有办法在一个命令中选择所有c-f 以下是场景的视觉描述(谢谢): 最简单的方法是使用on选项来rebase。假设当前在a处结束的分支称为mybranch,这就是您要将c-f移动到的分支 # checkout mybranch git checko

我有两个分支。提交
a
是其中一个的头,而另一个在
a
之上有
b
c
d
e
f
。我想将
c
d
e
f
移动到第一个分支而不提交
b
。使用cherry pick很容易:将第一个分支cherry pick逐个签出
c
f
,然后将第二个分支重新设置到第一个分支上。但是有没有办法在一个命令中选择所有
c
-
f

以下是场景的视觉描述(谢谢):


最简单的方法是使用
on
选项来
rebase
。假设当前在
a
处结束的分支称为mybranch,这就是您要将
c
-
f
移动到的分支

# checkout mybranch
git checkout mybranch

# reset it to f (currently includes a)
git reset --hard f

# rebase every commit after b and transplant it onto a
git rebase --onto a b

Git1.7.2引入了樱桃选择一系列提交的功能。从:

git cherry pick
学会了选择一系列提交 (例如,
cherry pick A..B
cherry pick--stdin
),git revert也一样;但是,它们不支持更好的排序控制
rebase[-i]
has

要从提交
A
中选择所有提交以提交
B
(其中
A
早于
B
),请运行:

如果要忽略A本身,请运行:

git cherry-pick A..B

(在评论中归功于damian、J.B.Rainsberger和sschaef)

或要求的一艘班轮:

git rebase --onto a b f

您可以使用
git-rebase
git-branch
的串行组合,将一组提交应用到另一个分支上。因为第一个命令实际上已经复制了提交。但是,在将分支名称添加到组的最顶端提交之前,更改不可见

请在新选项卡中打开图片

要以文本形式总结命令,请执行以下操作:

  • 使用以下命令将gitk作为独立进程打开:
    gitk--all&
  • 运行
    git-rebase--a b f
  • 在gitk中按F5。没有什么变化。但是没有标记
    头部
  • 运行
    git分支选择
  • 在gitk中按F5。此时将显示新分支及其提交
  • 这应该澄清一些事情:

    • 提交
      a
      是组的新根目标
    • 提交
      b
      是组第一次提交之前的提交(独占)
    • 提交
      f
      是组(包括)的最后一次提交
    之后,您可以使用
    git checkout功能和&git reset--hard b
    feature
    分支中删除提交
    c
    直到
    f


    除了这个答案,我还写了一篇文章,描述了另一个场景中的命令,这应该有助于一般使用它。

    应用J.B.Rainsberger和sschaef的评论来具体回答这个问题。。。要在此示例中使用樱桃拾取范围,请执行以下操作:

    git checkout a
    git cherry-pick b..f
    


    实际上,最简单的方法是:

  • 记录两个分支之间的合并基数:
    merge\u base=$(git merge base branch-a branch-b)
  • 快进或将旧分支重新设置到新分支上
  • 从步骤1的合并基础开始,将生成的分支重设为自身,并手动删除不需要的提交:

    git rebase ${SAVED_MERGE_BASE} -i
    
    或者,如果只有几个新提交,则跳过步骤1,只需使用

    git rebase HEAD^^^^^^^ -i
    
    在第一步中,使用足够的
    ^
    移动到合并基

  • 您将在交互式重基中看到类似的内容:

    pick 3139276 commit a
    pick c1b421d commit b
    pick 7204ee5 commit c
    pick 6ae9419 commit d
    pick 0152077 commit e
    pick 2656623 commit f
    

    然后删除行b(以及您想要的任何其他行)

    如果您有选择性的修订要合并,例如A、b、C、D、E、F、G、H、I、J提交中的A、C、F、J,只需使用以下命令:

    git cherry挑选一个C F J


    下面是一个脚本,它允许您通过告诉脚本cherry选择的源和目标分支以及提交的数量,在一行中选择多个提交:

    要从分支中挑选到主分支(使用当前分支作为源):

    要从您的6.19.x分支中挑选最新的5个提交到master:

    ./gcpl.sh -c 5 -s 6.19.x -t master
    

    要从提交id一直拾取到分支尖端,可以使用:


    git cherry pick commit\u id^..branch\u name

    另一个值得一提的变体是,如果希望从分支提交最后一次
    n
    提交,则
    ~
    语法可能很有用:

    git cherry-pick some-branch~4..some-branch
    

    在这种情况下,上面的命令将从名为
    some branch
    的分支中选取最后4个提交(尽管您也可以使用提交散列代替分支名称)

    谢谢!您还可以为完整答案添加
    git checkout secondbranch&&git rebase mybranch
    。这个答案帮助我了解了这个场景中的提交是什么。并且:您也可以使用
    的重设基础
    的交互模式。谢谢你,查尔斯!这种方法的美妙之处在于,您可以使用
    --interactive
    从序列中删除一些提交,或者在“cherry pick”之前对它们重新排序+1这是一个亲切的命令,有点让人费解,但效果非常好。你必须做出承诺,但你不想将其重新设定为参数之一(
    b
    ,在本例中),但这对我来说是有效的。在“cherry pick a..b”表单中,A应该比B早。如果顺序错误,命令将自动失败。如果您有git 1.7.1或更早版本,并且无法更新,您可以通过运行
    git cherry pick f~3
    然后
    git cherry pick f~2
    等快速按顺序选择它们。直到
    git cherry pick f
    (按向上箭头可以获得上一个命令,这样我可以快速更改数字并运行它,在大多数控制台中应该是类似的)。知道这种语法也适用于分支名称可能会很好。
    git cherry pi
    
    git rebase HEAD^^^^^^^ -i
    
    pick 3139276 commit a
    pick c1b421d commit b
    pick 7204ee5 commit c
    pick 6ae9419 commit d
    pick 0152077 commit e
    pick 2656623 commit f
    
    ./gcpl.sh -m
    
    ./gcpl.sh -c 5 -s 6.19.x -t master
    
    git cherry-pick some-branch~4..some-branch