我有两个分支 develop 和 master 。通过~20次提交说 master 落后于 develop 。我想只将其中一个提交( 07f5722 )从 develop 合并到 master 中。我怎么能这样做?
How to merge a specific commit in git和How do I merge a specific commit from one branch into another in 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的答案表明,这意味着挑选是无操作,没有实际变化。 好的,我该如何获得更改?
注意:我的问题几乎与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
答案 0 :(得分:4)
我认为您的错误是您从merge-07f5722
创建了develop
分支。然后当你尝试做樱桃选择时,你的更改已经在那个分支上,因为你已经有了提交。所以它会导致空提交。从master
而不是develop
创建合并分支应该会为您带来成功的挑选。
答案 1 :(得分: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)