【问题标题】:Git cherry-pick syntax and merge branchesGit cherry-pick 语法和合并分支
【发布时间】:2012-09-19 13:20:53
【问题描述】:

所以我以前做过无数次樱桃挑选,现在看来我必须在生活中失败,我正在尝试从一个分支到另一个分支,这应该很容易,但我怎么会出错合并但没有给出-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 函数?

【问题讨论】:

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


    【解决方案1】:

    手册页的语法如下:

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

    父编号指的是:

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

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

    【讨论】:

      【解决方案2】:

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

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

      1. 获取 rev 与其父级之间的更改。

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

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

      现在考虑挑选过程的第 1 步: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 之间的区别正是 widget 分支。

      【讨论】:

      • 要验证git cherry-pick 是否按照您的意图执行,请在推送前运行git show;这将向您展示即将推送的内容的差异。
      • 不管怎样,恢复合并提交与成功所需的注意事项和命令行参数完全相同。
      • 如果我想要添加小部件和删除杂乱怎么办?这就是挑选合并提交的重点吗?否则,我会选择小部件添加的最后一次提交或杂乱删除的最后一次提交
      • @Zennichimaro 如果两者都需要,那么我猜你需要merge,而不是cherry-pick。挑选樱桃的重点不是在提交后重新创建树(这将包括更改的双方),而是重新创建 change。合并提交的变化取决于您从合并的哪一侧查看。
      • 上帝保佑你 user4815162342
      【解决方案3】:

      就我个人而言,我通常做的是,因为合并结合了 2 个提交,例如,如果我有合并提交 C,它由 2 个父级组成,例如 master 中的提交 A 和来自另一个分支的提交 B 合并,如果我需要樱桃选择合并我不会打扰令人困惑的命令来樱桃选择合并提交本身,而是我只会单独樱桃每个父母A和B,这在你只想樱桃选择提交的情况下也很有帮助B 仅在来自 master 的提交 A 已经被挑选到分支的情况下,一个是在合并发生之前挑选到的分支。

      【讨论】:

        【解决方案4】:

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

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

        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?

        【讨论】:

          【解决方案5】:

          parent1 提交更改 小部件

          parent2 提交更改 杂乱无章

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

          git cherry-pick -m 1 合并提交 合并和 parent1(master) 的差异 合并 - master= 小部件

          git cherry-pick -m 2 合并提交 合并和 parent2 的差异(小部件) 合并 - WIDGET=混乱

          【讨论】:

            猜你喜欢
            • 2018-07-27
            • 1970-01-01
            • 2012-12-02
            • 1970-01-01
            • 2013-05-17
            • 2010-11-17
            • 2018-10-04
            • 1970-01-01
            相关资源
            最近更新 更多