我有两个分支。提交a是一个的头,而另一个有b, c, d, e和f在a的顶部。我想移动c, d, e和f到第一个分支,而不提交b。使用樱桃采摘很容易:签出第一个分支樱桃采摘一个接一个c到f,并重新建立第二个分支到第一个。但是有没有办法在一个命令中选择所有的c-f ?
下面是场景的可视化描述(感谢JJD):
我有两个分支。提交a是一个的头,而另一个有b, c, d, e和f在a的顶部。我想移动c, d, e和f到第一个分支,而不提交b。使用樱桃采摘很容易:签出第一个分支樱桃采摘一个接一个c到f,并重新建立第二个分支到第一个。但是有没有办法在一个命令中选择所有的c-f ?
下面是场景的可视化描述(感谢JJD):
当前回答
你可以使用git rebase和git分支的串行组合来将一组提交应用到另一个分支上。正如wolfc已经发布的,第一个命令实际上复制了提交。但是,在向组的最顶层提交添加分支名称之前,更改是不可见的。
请在新标签页打开图片…
以文本形式总结命令:
使用命令:gitk——all &将gitk作为一个独立的进程打开。 运行git rebase——to a bf。 在gitk中按F5。没有什么变化。但是没有HEAD标记。 运行git分支选择 在gitk中按F5。新的分支及其提交将出现。
这应该澄清一些事情:
Commit a是组的新根目的地。 提交b是组的第一个提交之前的提交(独占)。 提交f是组(包括)的最后一次提交。
然后,你可以使用git checkout功能&& git reset—hard b从功能分支中删除c到f的提交。
除了这个答案,我还写了一篇博客文章,描述了另一个场景中的命令,应该有助于一般使用它。
其他回答
Git 1.7.2引入了樱桃选择一系列提交的能力。发布说明如下:
Git学会了选择一个提交范围 (例如cherry-pick A..B和cherry-pick——stdin),所以git恢复;但是,这些不支持rebase [-i]拥有的更好的排序控件。
要从commit A挑选所有提交到commit B(其中A比B老),运行:
git cherry-pick A^..B
如果你想忽略A本身,运行:
git cherry-pick A..B
评论注释:
A应该比B老,或者A应该来自另一个分支。 在Windows上,它应该是A^^..B作为插入符需要转义,或者它应该是“A^..”B”(双引号)。 在zsh shell中,它应该是'A^..B'(单引号)作为插入符号是一个特殊字符。 有关说明,请参阅Gabriel Staples的回答。
(感谢damian、J. B. Rainsberger、sschaef、Neptilo、Pete和TMin在评论中。)
要从一个提交id中选取到分支的顶端,你可以使用:
git cherry-pick commit_id^..branch_name
选择多次提交:
签出到您想要选择提交的分支
使用以下命令:(通过部分哈希)
git cherry-pick 1e038f10 1e038f11 1e038f12 ...
我需要樱桃选择从一个分支到另一个优先级的提交,但这里的提交很难理解,希望下面的帮助与一个简单的:
步骤如下:
从“dev”分支获取1个带名字的提交(“移除姓氏字段”) 在"hotfix1"分支中提交
1。从“dev”分支获取提交细节
// Go to "dev" branch
git checkout dev
// Get the commit id (1e2e3e4e1 here)
git log --oneline
> ...
> ...
> 1e2e3e4e1 Remove Last Name field
> ...
> ...
2。推送提交到“hotfix1”分支
// Go to "hotfix1" branch
git checkout hotfix1
// Get the commit (1e2e3e4e1) from "dev" branch to "hotfix1" branch
git cherry-pick 1e2e3e4e1
// verify changes are correct
gitk
// push to "hotfix1" branch
git push
如果要一次做多个,只需要在上面修改一个,按顺序给出所有的提交id:
git cherry-pick 1e2e3e4e1 1e2e3e4e2 1e2e3e4e3
你可以使用git rebase和git分支的串行组合来将一组提交应用到另一个分支上。正如wolfc已经发布的,第一个命令实际上复制了提交。但是,在向组的最顶层提交添加分支名称之前,更改是不可见的。
请在新标签页打开图片…
以文本形式总结命令:
使用命令:gitk——all &将gitk作为一个独立的进程打开。 运行git rebase——to a bf。 在gitk中按F5。没有什么变化。但是没有HEAD标记。 运行git分支选择 在gitk中按F5。新的分支及其提交将出现。
这应该澄清一些事情:
Commit a是组的新根目的地。 提交b是组的第一个提交之前的提交(独占)。 提交f是组(包括)的最后一次提交。
然后,你可以使用git checkout功能&& git reset—hard b从功能分支中删除c到f的提交。
除了这个答案,我还写了一篇博客文章,描述了另一个场景中的命令,应该有助于一般使用它。