Git 从分支 A 到 B 的 cherry pick 提交

Git cherry pick commit from branch A to B

我有两个分支 developmaster。假设 master 落后于 develop ~20 次提交。我只想将 develop 中的一个提交 (07f5722) 合并到 master 中。我该怎么做?

How to merge a specific commit in git and How do I merge a specific commit from one branch into another in Git? both say to use git cherry-pick 没有太多关于如何使用它的解释。我也没有真正遵循手册页中的示例。

我尝试执行以下操作:

git checkout -b merge-07f5722 develop
git cherry-pick 07f5722

但是收到关于 cherry-pick 为空的消息:

On branch merge-07f5722
You are currently cherry-picking commit 07f5722.

nothing to commit, working directory clean
The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:

    git commit --allow-empty

If you wish to skip this commit, use:

    git reset

Then "git cherry-pick --continue" will resume cherry-picking
the remaining commits.

git cherry-pick not working 的答案表明,这意味着 cherry-pick 是一个空操作,没有实际更改。 好的,那么我如何获得更改?

注意:我的问题与 git cherry-pick not working 几乎相同。但是,我想知道如何完成我打算做的事情,而不是为什么我尝试的命令特别失败。


我必须使用的命令顺序是:

git checkout -b merge-07f5722 master
git cherry-pick 07f5722 # commit from develop
git checkout master
git merge merge-07f5722

我认为您的错误在于您创建了 developmerge-07f5722 分支。然后,当您尝试进行 cherry-pick 时,您的更改已经在该分支上,因为您已经提交了。所以它会导致空提交。从 master 而不是 develop 创建您的合并分支应该会为您成功挑选。

另一种解决方案是(假设您的所有提交都是相对原子的)仅变基 develop 并将有问题的提交移至堆栈底部。然后只合并你需要的几个。这将使合并快进合并。

尽管在您的示例中使用 master 和 develop 意味着这些是公开发布的分支,除非您准备好告诉所有曾经克隆过它们的人您对 @schleis 的 cherry-pick 答案的变基是正确的。

为了完整起见,我将只为那些想对 cherry-pick 进行 rebase 的人添加这个:

$ git checkout develop
$ git rebase -i master

编辑器将弹出提交列表(在您的示例中为 20 左右),将相关提交的行移至文件顶部,然后 save/exit)

$ git checkout master
$ git merge 07f5722 # The last commit you wanted

这看起来像:

A--B (master)
    \
     C--D--E (develop)

After git rebase -i master and moving D to the beginning:

A--B (master)
    \
     D'--C'--E' (develop)

After git merge D from master:

A--B--D' (master)
       \
        C'--E' (develop)