Git 从分支 A 到 B 的 cherry pick 提交
Git cherry pick commit from branch A to B
我有两个分支 develop 和 master。假设 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
我认为您的错误在于您创建了 develop
的 merge-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)
我有两个分支 develop 和 master。假设 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
我认为您的错误在于您创建了 develop
的 merge-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)