1

我有两个分支developmaster。假设master落后大约 20 次提交。我只想将其中一个提交(07f5722)从develop合并到master。我怎样才能做到这一点?

如何在 git 中合并特定提交以及如何在 Git 中将特定提交从一个分支合并到另一个分支?两者都说要使用git cherry-pick,而没有过多解释您应该如何使用它。我也没有真正遵循手册页中的示例。

我尝试执行以下操作:

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

但收到有关樱桃采摘为空的消息:

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
4

2 回答 2

4

我认为您的错误是您merge-07f5722develop. 然后,当您尝试进行樱桃挑选时,您的更改已经在该分支上,因为您已经有了提交。所以它会导致一个空的提交。创建您的合并分支,master而不是develop应该为您成功挑选樱桃。

于 2015-02-18T17:53:21.993 回答
0

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

尽管在您的示例中使用 master 和 develop 意味着这些是公开发布的分支,除非您准备告诉曾经克隆过它们的每个人,您对 @schleis 的樱桃挑选答案的重新定位是正确的。

为了完整起见,我只为那些想通过樱桃挑选重新定位的人添加这个:

$ git checkout develop
$ git rebase -i master

编辑器将弹出提交列表(在您的示例中为 20 个左右)将相关提交的行移动到文件顶部并保存/退出)

$ 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)
于 2015-02-18T18:03:24.343 回答