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
可以描述为:
-
把rev和它的父母之间的变化。
-
将这些更改应用到当前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