Git樱桃挑选语法和合并分支

所以我之前做了无数的樱桃采摘,看起来我现在必须在这个生活中失败,我试图从一个分支挑选到另一个应该很容易,我怎么会得到一个关于它是一个合并的错误,但是,不是-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 

从什么时候我必须提供-mfunction?

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

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

  1. rev和它的父母之间的变化。

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

合并提交join了两个开发线。 例如,一行实现小部件,另一行消除混乱。 合并给你的代码与小部件,没有杂波。

现在考虑挑选进程的第一步:git不能猜测你是否想要移除混乱或者实现widget。 你也不能这样做,因为关于如何执行这两个操作的信息不包含在单个合并提交中,只有合成的合并树的内容是。

-m选项允许你告诉git如何继续。 例如,如果在master发生了混乱删除,并且使用git merge WIDGET创build了合并提交,那么git cherry-pick -m 1 merged-commit将樱桃select新的小部件,因为合并树和父代1之间的差异杂乱无章的提交)将已经完全是小部件的增加。 另一方面, git cherry-pick -m 2 merge-commit会删除混乱,因为parent 2(最后一个widget添加提交)和merge-commit之间的区别正是从widget中缺less的混乱删除科。

git要求你指定父母号码( -m ),因为你的合并提交有两个父母,而git不知道合并的哪一方应该被认为是主线。 所以使用这个选项,你可以指定mainline和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 ),请参阅: 如何解决Git中的合并冲突?

就个人而言,我通常做的是,因为一个合并组合2提交,例如,如果我有合并提交C由2父母组成,例如提交A在主和从其他分支合并提交B,如果我需要樱桃select合并我不会打扰樱桃select合并提交本身的混淆命令,而是我将樱桃每个父母A和B单独樱桃,这也是有帮助的情况下,你只想樱桃select提交B只在案件承诺A已经被樱桃采摘到樱桃采摘到合并发生之前的分支。

手册页的语法如下所示:

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

父母号码是指:

-m parent-number,–mainline parent-number,通常你不能select合并,因为你不知道合并的哪一边应该被认为是主线。 此选项指定主线路的父号码(从1开始),并允许樱桃select重播相对于指定的父亲的变化。

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

尝试合并结果:

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