有人能解释一下 git cherry-pick <sha> 是什么吗?

5

我的问题是,我在另一个本地分支中有一个旧的提交 [包含abc.cpp、def.cpp]。

现在几个月后,我想使用这些更改,但在我的当前分支中,abc.cpp已经升级了。那么如果我挑选这个提交,它会将旧的abc.cpp的更改集成到新的abc.cpp [最近的工作目录副本]中吗?


注意:git cherry-pick很快就能够从“上一个分支”中挑选出需要的提交了(在git 1.8.5/1.9中)。请参见下面的答案 - VonC
可能是与[使用git挑选提交的含义是什么?](https://dev59.com/7Wox5IYBdhLWcg3wOx79)重复。 - Ciro Santilli OurBigBook.com
3个回答

8
git-cherry-pick(1)手册中指出:
给定一个或多个现有的提交,应用每个提交所引入的更改,并为每个记录一个新的提交。这需要你的工作区是干净的(没有来自HEAD提交的修改)。
简单来说,这意味着git cherry-pick将从一个分支应用提交到另一个分支,但不像正式合并那样保留其他分支原始的历史或血统。
将其视为应用一系列选定的补丁,而不是两个历史分支的完全合并。显然,如果您倾向于进行非常小的原子提交,那么cherry-picking看起来就像是应用一个精心编写的补丁。但是,由于您没有像合并或变基那样具有共同祖先,因此如果您的提交不是小而孤立的,则可能需要解决更多的冲突。
是否使用cherry-picking取决于您如何构建提交。如果不适合您,您可以使用git format-patchgit apply进行更加手动的操作。

4
是的,这就是它的作用。 cherry-pick 是将一个提交(或一系列提交)作为补丁应用到您的分支上(嗯,几乎像是一个补丁)。
由于在您的分支上发生了独立的修改,因此可能会出现冲突(例如在合并分支时)。

1
嗯?像合并吗?但是它不像经典的合并一样记录合并,因为它更像是应用一个补丁。请参见 https://dev59.com/WXNA5IYBdhLWcg3wpfmu#881112 中的警告。 - VonC
我同意这个比较并不恰当,我想强调一下 cherry-pick 可能需要处理两个不相关的修改,就像在合并中一样。 - CharlesB
1
此外,cherry-pick 可以使用一系列提交(range of commits);) - VonC
1
几乎:你可以说 cherry-pick 并不是 完全 是一个补丁:https://dev59.com/Qm435IYBdhLWcg3w4UWs - VonC

2
请注意,从 git1.8.5/1.9 (Q4 2013) 开始,git cherry-pick 现在可以轻松地从“以前的分支”中复制提交记录了:
就像 "git checkout -" 知道如何检出,"git merge -" 知道如何合并之前所在的分支一样,"git cherry-pick" 现在也理解 "git cherry-pick -" 从上一个分支中挑选。
请参见来自Hiroshige Umino (yaotti)commit 182d7dcherry-pick: 允许 "-" 作为 '@{-1}' 的缩写
"-" 缩写对于类似于 "checkout" 和 "merge" 的 "cherry-pick" 很方便。
当分支名称被接受时,“-”作为以前分支的名称也很好,这对于统一性也有好处,并且它不会意味着任何其他的事情,比如stdin。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接