我担心的是,我在另一个本地分支中有旧的提交 [包含 abc.cpp,def.cpp]。
现在几个月后我想使用这些更改,但是在我当前的分支中 abc.cpp 已升级。那么,如果我选择樱桃,它会将旧 abc.cpp 的更改整合到新的 abc.cpp [最近的工作目录副本] 中吗?
我担心的是,我在另一个本地分支中有旧的提交 [包含 abc.cpp,def.cpp]。
现在几个月后我想使用这些更改,但是在我当前的分支中 abc.cpp 已升级。那么,如果我选择樱桃,它会将旧 abc.cpp 的更改整合到新的 abc.cpp [最近的工作目录副本] 中吗?
git-cherry-pick(1) 手册页说:
给定一个或多个现有提交,应用每个引入的更改,并为每个提交记录一个新的提交。这要求您的工作树是干净的(不修改 HEAD 提交)。
用简单的英语来说,这意味着git cherry-pick
将提交从一个分支应用到另一个分支,但不会像适当的合并那样保留来自另一个分支的原始历史或祖先。
将其视为应用一系列选定的补丁,而不是两个历史分支的完全合并。显然,如果您倾向于进行非常小的原子提交,那么挑选樱桃看起来就像应用一个编写良好的补丁。但是,由于您没有像合并或变基那样的共同祖先,因此如果您的提交不是小而孤立的,您可能需要解决更多的冲突。
挑选樱桃是否是一个好主意在很大程度上取决于您如何构建提交。如果它不适合你,你总是可以用git format-patch
and来做更多的手动操作git apply
。
是的,它就是这样做的。cherry-pick
正在将提交(或其中的一个范围)作为补丁应用到您的分支(嗯,几乎作为补丁)。
由于分支上发生了独立修改,因此您可能会遇到冲突(例如合并分支时)。
请注意,使用git1.8.5/1.9 (Q4 2013), git cherry-pick 现在可以轻松地从“上一个分支”中挑选:
就像“
git checkout -
”知道签出和“git merge -
”知道合并您之前所在的分支一样,“git cherry-pick
”现在理解“git cherry-pick -
”从前一个分支中选择。
请参阅Hiroshige Umino (yaotti)的提交 182d7d:
cherry-pick
: 允许" -
"作为' @{-1}
'的缩写"
-
" 缩写对于 "cherry-pick
" like "checkout
和 "merge
" 很方便。
-
一个 " " 代表上一个分支的名称,其中一个分支名称被接受,它不能表示任何其他东西,如 stdin ,这也有利于统一。