【问题标题】:Git cherry pick a feature consisted of discrete commitsGit cherry 选择一个由离散提交组成的功能
【发布时间】:2026-02-16 09:15:02
【问题描述】:

我对 Git 很陌生,因此感谢任何过于详细的解释:)

假设,我有一个在两个国家/地区发布的游戏应用程序。实际上,我有两个用于此应用程序的代码存储库,它们具有相同的架构,但在实现级别上或多或少有所不同。现在我们有时会希望两个仓库交换代码,比如把一个特性的代码移到另一个仓库,我有两个问题:

  1. 将功能的所有提交分组的最佳实践是什么(我们在 Atlassian Jira 上管理任务,假设我们始终可以正确地标记功能的所有任务)?我正在考虑标记提交并通过 Jira 问题 ID 过滤它们,但具体如何?
  2. 一旦我获得了我需要的所有提交的列表,我如何将它们应用到另一个存储库,如果它们有很多并且它们是离散的提交。

谢谢!

【问题讨论】:

    标签: git cherry-pick


    【解决方案1】:

    对一个特性的提交进行分组的最佳实践是简单地使用一个特性分支:一个特性的所有提交都只是在同一个分支中。当您在没有快进的情况下合并它时,您可以在提交历史记录中识别它们,并在合并提交中获得最终的增量。
    这样,您将获得这样的历史记录:

    3     next commit
    2     merge of feature #1
    |\
    | C   last commit of feature #1
    | B   2nd commit of feature #1
    | A   1st commit of feature #1
    |/
    1     commit before starting feature branch
    

    您可以通过以下方式识别功能 #1 的提交:

    # Get all the commits in second parent of merge that are not in first parent of merge
    git log 2^2...2^1
    # To get only the commit hash (to use as parameter for cherry-pick):
    git rev-list 2^2...2^1
    

    另一种方法是在提交消息中使用唯一标识符(例如票证参考)标记它们,然后您可以使用git log的过滤器列出它们:

    git log --grep 'feature #1'
    # To get only commit hash:
    git log --format='%H' --grep 'feature #1'
    

    要将提交从一个存储库应用到另一个存储库,您至少有以下两种解决方案:

    1. 将第一个存储库添加为第二个存储库,然后您可以简单地cherry-pick 提交(您可能需要修复潜在的冲突):

      # In second repository
      git remote add other_country ULR_TO_FIRST_REPO
      git fetch other_country
      # Go on the right branch
      git cherry-pick COMMIT1 COMMIT2 COMMIT3...
      # If you have conflict: solve them (like for a merge) and then `git cherry-pick --continue`
      
    2. 在第一个存储库中,使用git format-patch 导出提交(如果它们不在同一范围内,则多次)并使用git am 在第二个存储库中应用它们

    【讨论】:

    • 感谢您的快速回复!
    • 感谢您的快速回复!我了解使用非快进的部分,但我如何在提交历史中准确识别它们?我知道我可以在每次提交时添加评论(git commit -m "Feature-ID-2231")。你指的是这个吗?对不起,我不明白这两种方式之间的区别。好的谢谢!我会看一些 git GUI,看看是否有一种快速的方法可以列出所有用于挑选樱桃的离散提交:)
    • 经过一番研究,我了解了您的第一个解决方案。在我的情况下,第二种解决方案对我来说可能更可行,因为当我谈论一个特性时,我想象它沿着主分支进行许多离散的提交。所以我必须特别注意分支命名约定:) 另外,这在 GUI 上下文中似乎更容易。谢谢!