我在master分支中做了一些更改,并希望将这些更改带到上游。当我挑选以下提交时。然而,我被困在fd9f578上,git说:
$ git cherry-pick fd9f578
fatal: Commit fd9f57850f6b94b7906e5bbe51a0d75bf638c74d is a merge but no -m option was given.
git想告诉我什么?cherry-pick在这里用对了吗?主分支确实包括对上游分支中修改过的文件的更改,所以我相信会有一些合并冲突,但这些冲突还不算太严重,无法解决。我知道哪些地方需要改变。
这些是我想向上游提交的。
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 ...
cherry pick的工作方式是获取变更集表示的差异(该点的工作树与其父级的工作树之间的差异),并将其应用于当前分支。
所以,如果一个提交有两个或多个父级,它也代表两个或更多个diff——应该应用哪一个?
你正试图挑选fd9f578
,这是一个有两个父母的合并。因此,您需要通过使用-m
选项告诉cherry-pick命令应该根据哪个来计算diff。例如,git cherry-pick -m 1 fd9f578
使用父级1作为基础。
对于您的特定情况,我不能确定,但使用git merge
而不是git cherry-pick
通常是可取的。当您选择合并提交时,它会将您未指定给-m
的父级中所做的所有更改折叠为一个提交。你失去了他们所有的历史,把他们所有的差异拼凑在一起。你的电话。
-m
表示父编号。
来自git-doc:
通常,您不能选择合并,因为您不知道合并的哪一边应该被视为主线。此选项指定父编号(从1) 并允许cherry-pick相对于指定的父级重放更改。
例如,如果您的提交树如下所示:
- A - D - E - F - master
/
B - C branch one
那么CCD_ 8将产生您所面临的问题。
git cherry-pick E -m 1
表示使用D-E
,而git cherry-pick E -m 2
表示使用B-C-E
。
简化。Cherry选择提交。不要挑剔合并
如果你确定你需要包括合并和挑选相关提交,你有两个选项:
- (更复杂和模糊;也放弃历史记录)您可以指示应该应用哪个父项
-
使用
-m
选项来执行此操作。例如,git cherry-pick -m 1 fd9f578
将使用合并中列出的第一个父级作为基础。 -
还要考虑,当您选择合并提交时,它会将未指定给
-m
的父级中所做的所有更改折叠为一个提交。你失去了他们所有的历史,把他们所有的差异拼凑在一起。你的电话。
- (更简单、更熟悉;保留历史)您可以使用
git merge
而不是git cherry-pick
- 与
git merge
一样,它将尝试应用正在合并的分支上存在的所有提交,并在git日志中单独列出它们
@Borealid的答案是正确的,但假设你不在乎保留分支的确切合并历史,只想挑选它的线性化版本
起始状态:您在分支X
上,并且您想要挑选提交Y..Z
。
git checkout -b tempZ Z
git rebase Y
git checkout -b newX X
git cherry-pick Y..tempZ
- (可选)
git branch -D tempZ
这样做的目的是在Z
的基础上创建一个分支tempZ
,但从Y
开始的历史被线性化,然后将其挑选到一个名为newX
的X
副本上。(在新分支上这样做比对X
进行变异更安全。)当然,在步骤4中可能会有冲突,您必须以通常的方式解决(cherry-pick
在这方面与rebase
非常相似)。最后,它删除临时CCD_ 34分支。
如果步骤2给出消息"当前分支tempZ是最新的",则Y..Z
已经是线性的,因此忽略该消息并继续执行步骤3。
然后查看newX
,看看它是否达到了您想要的效果。
(注意:在分支Z
上,这与简单的git rebase X
不同,因为它在任何方面都不依赖于X
和Y
之间的关系;在公共祖先和Y
之间可能存在您不想要的提交。)
@Daira Hopwood方法的简化非常适合选择单个提交。不需要临时分支。
就作者而言:
- Z需要提交(fd9f578)
- Y在它之前提交
- X电流工作支路
然后执行:
git checkout Z # move HEAD to wanted commit
git reset Y # have Z as changes in working tree
git stash # save Z in stash
git checkout X # return to working branch
git stash pop # apply Z to current branch
git commit -a # do commit