git chury-选择说“…38c74d是一个合并,但没有给出-m选项”

我在主分支中做了一些更改,并想将它们带到上游。当我选择以下提交时。然而,我被困在fd9f578上,git说:

$ git cherry-pick fd9f578fatal: Commit fd9f57850f6b94b7906e5bbe51a0d75bf638c74d is a merge but no -m option was given.

git想告诉我什么,樱桃选择是这里使用的正确的东西吗?主分支确实包括对在上游分支中被修改的文件的更改,所以我敢肯定会有一些合并冲突,但这些并不是太糟糕,无法理顺。我知道哪些地方需要更改。

这些是我想带到上游的提交。

e7d4cff added some comments...23e6d2a moved static strings...44cc65a incorporated test ...40b83d5 whoops delete whitspace...24f8a50 implemented global.c...43651c3 cleaned up ...068b2fe cleaned up version.c ...fd9f578 Merge branch 'master' of ssh://extgit/git/sessions_common4172caa cleaned up comments in sessions.c ...
530249 次浏览

樱桃选择的工作方式是获取变更集表示的差异(该点的工作树与其父树的工作树之间的差异),并将其应用于当前分支。

因此,如果一个提交有两个或多个父级,它也代表了两个或多个差异——应该应用哪一个?

您正在尝试选择fd9f578,这是一个有两个父级的合并。因此,您需要使用-m选项来告诉chrier-选择命令应该计算哪个diff。例如,git cherry-pick -m 1 fd9f578使用父级1作为基数。

我不能确定你的具体情况,但是使用git merge而不是git cherry-pick通常是明智的。当你选择合并提交时,它会将所有你没有指定-m的父级中所做的更改折叠到一次提交中。你失去了所有的历史记录,并将所有的差异聚集在一起。你的电话。

@Borealid的答案是正确的,但是假设你不关心保存分支的确切合并历史,只想选择它的线性化版本。这是一个简单而安全的方法:

开始状态:您在分支X上,您想选择提交Y..Z

  1. git checkout -b tempZ Z
  2. git rebase Y
  3. git checkout -b newX X
  4. git cherry-pick Y..tempZ
  5. (可选)git branch -D tempZ

这样做是在Z的基础上创建一个分支tempZ,但从Y开始的历史记录线性化,然后将其挑选到名为newXX副本上。(在新分支上执行此操作比突变X更安全。)当然,步骤4中可能会有冲突,您必须以通常的方式解决(cherry-pick在这方面与rebase非常相似)。最后它删除了临时的tempZ分支。

如果第2步给出了消息“当前分支是最新的”,那么Y..Z已经是线性的,所以只需忽略该消息并继续执行第3步。

然后查看newX,看看它是否符合您的要求。

(注意:这与分支Z上的简单git rebase X不同,因为它不依赖于XY之间的关系;在共同祖先和Y之间可能存在您不想要的提交。

简化。樱桃选择提交。不要樱桃选择合并。

如果您确定需要包含合并与挑选相关提交,您有两个选项:

  1. (更复杂和模糊;也丢弃历史)您可以指示应该应用哪个父级。
  • 使用-m选项来执行此操作。例如,git cherry-pick -m 1 fd9f578将使用合并中列出的第一个父级作为基础。

  • 还要考虑,当您选择合并提交时,它会将所有中您没有指定-m的父级所做的更改折叠到一次提交中。您丢失了所有历史记录,并将所有差异聚集在一起。你的电话。

  1. (更简单,更熟悉;保留历史)您可以使用git merge而不是git cherry-pick
  • git merge一样,它将尝试应用您正在合并的分支上存在的所有提交,并在您的git日志中单独列出它们。

简化@Daira Hopwood方法有助于选择一个单一的提交。不需要临时分支。

就作者而言:

  • Z被通缉提交(fd9f578)
  • Y是承诺在它之前
  • X当前工作分支

然后这样做:

git checkout Z   # move HEAD to wanted commitgit reset Y      # have Z as changes in working treegit stash        # save Z in stashgit checkout X   # return to working branchgit stash pop    # apply Z to current branchgit commit -a    # do commit

-m表示父编号。

从git doc:

通常你不能选择合并,因为你不知道合并的哪一边应该被视为主线。此选项指定父编号(从1)的主线,并允许Cherry-Picch重播相对于指定父级的更改。

例如,如果您的提交树如下所示:

- A - D - E - F -   master\     /B - C           branch one

然后git cherry-pick E将生成您面临的问题。

git cherry-pick E -m 1表示使用D-E,而git cherry-pick E -m 2表示使用B-C-E