如何在Git中将特定提交从一个分支合并到另一个分支?


Answers:


233

git cherry-pick <commit>命令允许您(从任何分支)进行一次提交,并且实质上是在工作分支中重新建立它。

Pro Git书籍的第5章比我能更好地解释它,并附有图表等。(“重新定级”一章也很不错。)

最后,在另一个SO问题中,关于“摘樱桃”,“合并”和“变基”的评论不错


1
问题:说提交A是分支的master,您可以对此做一些工作,B通过创建子提交E。说E仅从添加了1行D。如果你git cherry-pick E进入master,它适用于所有的变化,从A通过Emaster分支,或者它只是从应用更改DE,即,它增加了只有1行master?如果是前者,我该如何实现后者?(除了手动复制和粘贴外)
chharvey 2014年

7
git cherry-pick -n <commit>如果您不希望自动选择Cherry Pick。
本·弗林

6

如果BranchA尚未推送到远程,则可以使用rebase,然后再简单地对提交进行重新排序merge。最好在可能的情况下使用mergeover rebase,因为它不会创建重复的提交。

git checkout BranchA
git rebase -i HEAD~113
... reorder the commits so the 10 you want are first ...
git checkout BranchB
git merge [the 10th commit]

2

消息来源:https : //git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project#Integrating-Contributed-Work

将引入的工作从一个分支转移到另一个分支的另一种方法是挑选它。在Git中挑选樱桃就像是一次提交的基础。它采用在提交中引入的补丁,并尝试在您当前所在的分支上重新应用该补丁。如果您在一个主题分支上有多个提交,并且只想集成其中的一个提交,或者如果您在一个主题分支上只有一个提交,并且您更喜欢选择它而不是运行rebase,则这很有用。例如,假设您有一个如下所示的项目:

在此处输入图片说明

如果要将提交e43a6拉入master分支,则可以运行

$ git cherry-pick e43a6
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index fails."
 3 files changed, 17 insertions(+), 3 deletions(-)

这带来了与e43a6中引入的相同的更改,但是您获得了一个新的提交SHA-1值,因为应用的日期不同。现在您的历史记录如下:

在此处输入图片说明

现在,您可以删除主题分支并删除您不想插入的提交。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.