git cherry-pick说:“… 38c74d是一个合并,但没有-m选项被给出”

我在主分公司做了一些改变,想把这些东西带到上游。 当我樱桃挑选下面的提交但是我卡在fd9f578哪里git说:

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

git试图告诉我什么是樱桃select在这里使用的正确的东西? 主分支确实包含了在上游分支已经被修改的文件的改变,所以我确定会有一些合并冲突,但是这些并不是很难理顺。 我知道哪些更改需要在哪里。

这是我想要带到上游的承诺。

 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_common 4172caa cleaned up comments in sessions.c ... 

樱桃select工作的方式是通过差异表示变化集(表示当前工作树与其父代的工作树之间的差异),并将其应用于当前分支。

所以,如果一个提交有两个或更多的父母,它也代表两个或更多的差异 – 哪一个应该被应用?

你正在尝试樱桃selectfd9f578 ,这是两个父母合并。 所以你需要通过使用-m选项来告诉cherry-pick命令应该计算哪个差异。 例如, git cherry-pick -m 1 fd9f578以父节点1为基础。

我不能肯定你的具体情况,但使用git merge而不是git cherry-pick通常是可取的。 当你select一个合并提交时,它将在你没有指定的父-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

这样做是基于Z创build一个分支tempZ ,但是从Y开始的历史线性化,然后将其select到名为newXX副本上。 (在新的分支上做这个比在X上更容易些)。当然,在步骤4中可能会有冲突,你必须用通常的方式来解决( cherry-pick非常像在这方面的rebase )。

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

然后检查newX ,看看是否做到了你想要的。

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