任何人都可以解释一下git cherry-pick <sha>的作用吗?</sha>

时间:2012-06-28 11:32:52

标签: git git-cherry-pick

正如我所关注的那样,我在另一个本地分支中有旧提交[包含abc.cpp,def.cpp]。

现在几个月后我想要使用这些更改,但在我目前的分支中,abc.cpp已升级。那么如果我选择那么它会将旧的abc.cpp的变化整合到新的abc.cpp [最近的工作目录副本]中吗?

3 个答案:

答案 0 :(得分:8)

git-cherry-pick(1)手册页说:

  

给定一个或多个现有提交,每个提交应用更改   介绍,记录每个提交的新提交。这需要你的工作   树要干净(没有HEAD提交的修改)。

简单来说,这意味着git cherry-pick将提交从一个分支应用到另一个分支,但不会以正确合并的方式保留原始历史或来自另一个分支的祖先。

将其视为应用一系列选定的补丁,而不是两个历史分支的完全合并。显然,如果你倾向于进行非常小的原子提交,那么采摘樱桃就像应用一个写得很好的补丁一样。但是,由于您没有像使用merge或rebase那样拥有共同的祖先,如果您的提交不小并且孤立,您可能会遇到更多冲突。

挑选樱桃是否是一个好主意在很大程度上取决于你如何构建你的提交。如果它不适合您,您可以随时使用git format-patchgit apply手动执行更多操作。

答案 1 :(得分:4)

是的,这就是它的作用。 cherry-pick正在将一个提交(或其中的一系列)作为补丁应用到您的分支(嗯,almost as a patch)。

您可能会遇到冲突(例如合并分支时),因为您的分支机构已经发生了独立修改。

答案 2 :(得分:2)

请注意,使用git1.8.5/1.9 (Q4 2013),git cherry-pick现在可以轻松选择“来自之前的分支”:

  

就像“git checkout -”知道签出并且“git merge -”知道合并您之前使用的分支一样,“git cherry-pick”现在理解“git cherry-pick -”从上一个分支中选择。

请参阅commit 182d7d中的Hiroshige Umino (yaotti)

cherry-pick:允许“-”缩写为“@{-1}

  

-”缩写非常适合“cherry-pick”,例如“checkout”和“merge”。

     

对于统一性而言,“-”代表前一个分支的名称,其中分支名称被接受,并且它不能表示任何其他东西,如stdin 。 / p>