【问题标题】:How do I merge a specific commit from one branch into another in Git?如何在 Git 中将特定提交从一个分支合并到另一个分支?
【发布时间】:2011-09-16 08:30:32
【问题描述】:

我有 BranchA,比 BranchB 早 113 次提交。

但我只想将来自 BranchA 的最后 10 个左右的提交合并到 BranchB

有没有办法做到这一点?

【问题讨论】:

标签: git github


【解决方案1】:

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 分支出来的,你在它上面做了一些工作,创建子提交 BE。假设E 仅从D 添加了 1 行。如果您将git cherry-pick E 应用到master,它是否将所有AE 的更改应用到master 分支,还是 应用从DE 的变化,即它只将那1 行添加到master?如果是前者,我该如何实现后者? (除了手动复制和粘贴)
  • git cherry-pick -n 如果你不想自动提交樱桃选择。
  • 小旁注:您可以在 github 桌面上手动执行此操作(右键单击特定提交到 cherry pick)——然后它很直观 :)
【解决方案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 值,因为应用的日期不同。现在你的历史看起来像这样:

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

【讨论】:

    【解决方案3】:

    如果没有将 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]
    

    【讨论】:

      猜你喜欢
      • 2016-03-23
      • 2012-11-22
      • 2021-04-10
      • 1970-01-01
      • 2011-11-02
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多