Git cherry pick语法和合并分支

Git cherry pick语法和合并分支,git,cherry-pick,git-cherry-pick,Git,Cherry Pick,Git Cherry Pick,所以我以前做过无数次樱桃采摘,现在看来我一定会失败,我正在尝试从一个树枝到另一个树枝进行樱桃采摘,这应该很容易,我怎么会得到一个错误,关于它是一个合并,而不是-m是给定的 $ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 error: Commit a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 is a merge but no -m option was given. fatal: cher

所以我以前做过无数次樱桃采摘,现在看来我一定会失败,我正在尝试从一个树枝到另一个树枝进行樱桃采摘,这应该很容易,我怎么会得到一个错误,关于它是一个合并,而不是-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

从什么时候开始,我必须提供a-m函数?

手册页的语法如下:

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] <commit>...
git cherry pick[--edit][n][m父编号][s][x][--ff]。。。
父编号指的是:

-m parent number,-mainline parent number,通常您无法选择合并,因为您不知道合并的哪一侧应被视为主线。此选项指定主线的父编号(从1开始),并允许cherry pick重播相对于指定父项的更改


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

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

通常情况下,
git cherry pick REV
的功能可以描述为:

  • 在rev和其父级之间进行更改

  • 将这些更改应用于当前头部,并使用rev的提交消息提交结果

  • 合并提交连接两条开发线。例如,一行实现小部件,另一行消除杂乱。合并为您提供了带有小部件的代码,消除了混乱

    现在考虑樱桃选择过程的第1步:Git不能猜测你是想去除杂乱还是要实现小部件。也不能同时执行这两项操作,因为关于如何执行这两项操作的信息不包含在单个合并提交中,只包含结果合并树的内容


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

    我个人通常做的是,由于合并合并了两个提交,例如,如果我有一个merge commit C,它由两个父级组成,例如主级中的commit A和另一个合并分支中的commit B,如果我需要cherry选择merge,我就不必费心使用令人困惑的命令来cherry选择merge commit本身,而是只需分别选择父级A和父级B,这在以下情况下也很有帮助:只有在主节点的提交a已经在合并发生之前从主节点到分支节点的提交a是在主节点到分支节点的提交B的情况下,才需要对提交B进行cherry pick操作。

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

    要查找您的提交父母,请尝试以下操作之一:

    git show --pretty=raw <merge_commit>
    
    添加
    --stat
    以查看已修改文件的列表

    或者使用组合的差异通过以下方式比较两个双亲:

    git diff --cc <parent1_commit>
    git diff --cc <parent2_commit>
    
    git diff--cc
    git-diff--cc
    
    然后为您的樱桃选择指定从1开始的父编号,例如

    git cherry-pick -m 1 <merge_commit>
    
    git cherry pick-m1
    
    然后运行
    git status
    查看发生了什么。如果您还不想提交更改,请添加
    -n
    选项以查看发生了什么。然后,当你不高兴的时候,重置到HEAD(
    git reset HEAD--hard
    )。如果您遇到git冲突,可能需要手动解决或指定合并策略(
    -X
    ),请参阅:

    parent1提交更改 小部件

    parent2提交更改 杂乱

    合并提交(包含两个更改) 小装置 杂乱

    git cherry pick-m1合并提交 合并和父级1的差异(主) merge-master=widget

    git cherry pick-m2合并提交 合并和父项2的差异(小部件)
    merge-WIDGET=croot

    要验证git cherry pick是否按您的意思操作,请在按下之前运行
    git show
    ;这将向您展示将要推送的内容的差异。无论如何,恢复合并提交的考虑因素和命令行参数与成功所需的考虑因素和参数完全相同。如果我希望同时添加小部件和删除杂波,该怎么办?这就是cherry选择合并提交的要点,对吗?另一方面,我会选择小部件添加的最后一次提交或杂波删除的最后一次提交instead@Zennichimaro如果您想要两者,那么我想您需要的是
    合并
    ,而不是
    樱桃选择
    。樱桃采摘的整个要点不是在提交后重新创建树(这将包括更改的双方),而是重新创建更改。合并提交的更改取决于您从合并的哪一侧查看。上帝保佑您用户4815162342
    commit fc70b1e9f940a6b511cbf86fe20293b181fb7821
    tree 8d2ed6b21f074725db4f90e6aca1ebda6bc5d050 
    parent 54d59bedb9228fbbb9d645b977173009647a08a9 = <parent1_commit>
    parent 80f1016b327cd8482a3855ade89a41ffab64a792 = <parent2_commit>
    
    git show <parent1_or_2_commit>
    
    git diff <parent1_or_2_commit>..<commit>
    
    git diff --cc <parent1_commit>
    git diff --cc <parent2_commit>
    
    git cherry-pick -m 1 <merge_commit>