Git cherry-pick语法和合并分支

时间:2012-09-27 17:16:13

标签: git cherry-pick git-cherry-pick

所以我以前做了无数的樱桃选择,似乎我现在必须在生活中失败,我想尝试从一个分支到另一个分支,这应该是容易的,我怎么会得到一个关于它的错误合并但没有给出-m?

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0
error: Commit a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 is a merge but no -m option was given.
fatal: cherry-pick failed

看起来不对.......它应该是:

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0

从什么时候开始提供-m功能?

6 个答案:

答案 0 :(得分:69)

如果提交是合并提交,则必须提供-m,即具有多个父提交的提交。

通常,git cherry-pick REV的作用可以描述为:

  1. rev 及其父级之间进行更改。

  2. 将这些更改应用于当前HEAD,并使用 rev 的提交消息提交结果。

  3. 合并提交加入两行开发。例如,一行实现小部件,另一行删除杂乱。合并为您提供了小部件的代码,没有混乱。

    现在考虑一下挑选过程的第一步:git无法猜测你是想删除混乱还是实现小部件。你也不能同时做到这两点,因为关于如何做到这两点的信息不包含在单个合并提交中,只有合成树的结果是。

    -m选项允许您告诉git如何继续。例如,如果在master上发生杂乱删除并且使用git merge WIDGET创建了合并提交,那么git cherry-pick -m 1 merged-commit将挑选新的小部件,因为合并树和父级1之间存在差异(最后的杂乱删除提交)将完全是小部件添加。另一方面,git cherry-pick -m 2 merge-commit将删除混乱,因为父2(最后一个小部件添加提交)和 merge-commit 之间的区别正是因为缺少了杂乱删除小部件分支。

答案 1 :(得分:16)

git请求您指定父号(-m),因为您的合并提交有两个父,而git不知道合并的哪一侧应该被视为主线。因此,使用此选项,您可以指定主线和cherry-pick的父编号(从1开始),以便重放相对于指定父级的更改。

要查找您的提交父母,请尝试:

git show --pretty=raw <merge_commit>

或:

git cat-file -p <merge_commit>

或者为了获得更好的GUI可见性,请尝试:

gitk <merge_commit>

结果,你应该得到类似的东西:

commit fc70b1e9f940a6b511cbf86fe20293b181fb7821
tree 8d2ed6b21f074725db4f90e6aca1ebda6bc5d050 
parent 54d59bedb9228fbbb9d645b977173009647a08a9 = <parent1_commit>
parent 80f1016b327cd8482a3855ade89a41ffab64a792 = <parent2_commit>

然后通过以下方式检查您的每个父母详细信息:

git show <parent1_or_2_commit>

添加--stat以查看已修改文件的列表。

或使用以下命令比较更改(基于以上父级):

git diff <parent1_or_2_commit>..<commit>

添加--stat以查看已修改文件的列表。

或使用组合差异来比较两个父母:

git diff --cc <parent1_commit>
git diff --cc <parent2_commit>

然后为你的挑选指定从1开始的父号,例如

git cherry-pick -m 1 <merge_commit>

然后运行git status以查看正在发生的事情。如果您还不想提交更改,请添加-n选项以查看发生的情况。然后当你不开心时,重置为HEAD(git reset HEAD --hard)。如果您遇到git冲突,您可能需要手动解决它们或指定合并策略(-X),请参阅:How to resolve merge conflicts in Git?

答案 2 :(得分:3)

我个人通常做的是,因为合并结合了2个提交,例如,如果我有合并提交C,它由2个父项组成,例如在主服务器中提交A,从另一个分支提交B合并,如果我需要樱桃选择合并我不会打扰令人困惑的命令樱桃选择合并提交本身,但我只是樱桃分别樱桃每个,这也有助于你只想樱桃挑选提交B只是在大师提交A已被挑选到分支机构的情况下,在合并发生之前,它是樱桃挑选。

答案 3 :(得分:2)

手册页的语法如下:

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] <commit>...

父母编号指的是:

  

-m parent-number, - mainline parent-number,通常你不能挑选合并,因为你不知道合并的哪一边应该被认为是主线。此选项指定主线的父编号(从1开始),并允许cherry-pick重放相对于指定父级的更改。

所以我会仔细检查以确保你有正确的提交哈希。可能是你想要一个不是来自合并而是来自之前的提交。否则,您需要使用此标志并指向合并的正确一侧以消除您的请求歧义。

答案 4 :(得分:-1)

尝试合并结果:

git cherry-pick ....
git mergetool
git cherry-pick --continue

答案 5 :(得分:-2)

parent1提交更改 小部件

parent2提交更改 混乱

合并提交(包含两个更改) 小部件 混乱

git cherry-pick -m 1 merge-commit(parent1) 合并和parent2的差异 合并-parent2 =小部件

git cherry-pick -m 2 merge-commit(parent1) 合并和parent1的差异 合并-parent1 =混乱