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

236

我有一个名为 BranchA 的分支,它比 BranchB 多了 113 个提交。

但是我只想将 BranchA 中最后大约10个提交合并到 BranchB 中。

有没有方法可以做到这一点?


6
可能是如何在Git中合并特定的提交记录的重复问题。 - chharvey
3个回答

349
git cherry-pick <commit> 命令允许您获取一个单独的提交(来自任何分支),并在工作分支中“重新定位”它。详见《Pro Git》第五章,其中包括图表等更好的解释。(有关变基的章节也是不错的阅读材料) 最后,另一个SO问题的评论中对挑选、合并和变基进行了很好的讨论。

4
问题:假设从master分支创建了提交A,并在其上进行了一些工作,创建了子提交BE。假设E只添加了1行代码。如果您将git cherry-pick E应用到master中,它会将AE的所有更改应用到master分支中,还是仅将DE的更改应用到master分支中,即仅将那1行代码添加到master中?如果是前者,我该如何实现后者?(除了手动复制和粘贴) - chharvey
11
git cherry-pick -n <commit> 如果您不想让cherry pick自动提交。 - Ben Flynn
2
小提示:您可以在 GitHub 桌面上手动执行此操作(右键单击特定提交以挑选)-然后它就很直观了 :) - jjrr

15

来源: https://git-scm.com/book/zh/v2/Git-分布式-Git-项目管理#集成他人的工作

将引入的工作从一个分支移动到另一个分支的另一种方法是 cherry-pick。在 Git 中,cherry-pick 就像单个提交的 rebase 一样。它获取引入的补丁并尝试将其重新应用于当前所在的分支。如果您在一个主题分支上有多个提交,并且只想集成其中一个,则此方法很有用;或者如果您在一个主题分支上只有一个提交,并且您更喜欢 cherry-pick 而不是运行 rebase,则此方法也很有用。例如,假设您有一个项目如下:

enter image description here

如果你想将提交记录 e43a6 拉入你的主分支,可以运行以下命令:

$ 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 值。现在您的历史记录如下所示:

enter image description here

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

10

如果 BranchA 还没有被推送到远程,则可以使用 rebase 重新排序提交,然后简单地使用 merge。尽可能使用 merge 而不是 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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接