【发布时间】:2011-09-16 08:30:32
【问题描述】:
我有 BranchA,比 BranchB 早 113 次提交。
但我只想将来自 BranchA 的最后 10 个左右的提交合并到 BranchB。
有没有办法做到这一点?
【问题讨论】:
我有 BranchA,比 BranchB 早 113 次提交。
但我只想将来自 BranchA 的最后 10 个左右的提交合并到 BranchB。
有没有办法做到这一点?
【问题讨论】:
git cherry-pick <commit> 命令允许您进行一次提交(从任何分支),并且本质上是在您的工作分支中重新设置它。
Chapter 5 of the Pro Git book explains it better than I can,附有图表等。 (The chapter on Rebasing 也不错。)
最后,还有一些good comments on the cherry-picking vs merging vs rebasing in another SO question。
【讨论】:
A 是从 master 分支出来的,你在它上面做了一些工作,创建子提交 B 到 E。假设E 仅从D 添加了 1 行。如果您将git cherry-pick E 应用到master,它是否将所有从A 到E 的更改应用到master 分支,还是仅 应用从D 到E 的变化,即它只将那1 行添加到master?如果是前者,我该如何实现后者? (除了手动复制和粘贴)
来源: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 值,因为应用的日期不同。现在你的历史看起来像这样:
现在您可以删除您的主题分支并删除您不想拉入的提交。
【讨论】:
如果没有将 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]
【讨论】: