git-cherry-pick
名称
git-cherry-pick - 应用某些现有提交引入的更改
概要
git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff]
[-S[<keyid>]] <commit>…
git cherry-pick --continue
git cherry-pick --quit
git cherry-pick --abort
描述
给定一个或多个现有提交,应用每个引入的更改,为每个提交记录一个新提交。这需要您的工作树是干净的(没有HEAD提交的修改)。
如果不明显如何应用更改,则会发生以下情况:
当前分支和
HEAD
指针保持在最后一次成功提交。CHERRY_PICK_HEAD
ref设置为指向引入难以应用的更改的提交。干净地应用更改的路径在索引文件和工作树中都会更新。
对于冲突路径,索引文件最多可记录三个版本,如 git-merge [1] 的“TRUE MERGE”部分所述。工作树文件将包含由通常的冲突标记
<<<<<<<
和>>>>>>>
括起来的冲突的描述。没有进行其他修改。
有关解决此类冲突的一些提示,请参阅 git-merge [1] 。
OPTIONS
<commit>…
承诺挑选樱桃。有关拼写提交方法的更完整列表,请参阅 gitrevisions [7] 。可以传递提交集,但默认情况下不执行遍历,就像指定了--no-walk
选项一样,请参阅 git-rev-list [1] 。请注意,指定范围会将所有< commit> …参数提供给单个修订版步行(请参阅后面使用 maint master..next 的示例)。
-e
--edit
使用此选项, git cherry-pick 将允许您在提交之前编辑提交消息。
-x
记录提交时,在原始提交消息中附加一行“(从提交中挑选出来的樱桃)”,以指示从哪个提交中挑选出这个更改。这只适用于没有冲突的樱桃选择。如果您从私人分支机构挑选,则不要使用此选项,因为该信息对收件人无用。另一方面,如果您在两个公开可见的分支之间进行挑选(例如,从开发分支向旧版本的维护分支向后端移植修复),添加此信息可能很有用。
-r
过去,命令默认执行上述-x
,-r
禁用它。现在默认情况下不执行-x
所以此选项是无操作。
-m parent-number
--mainline parent-number
通常你不能挑选合并因为你不知道合并的哪一边应该被认为是主线。此选项指定主线的父编号(从1开始),并允许cherry-pick重放相对于指定父级的更改。
-n
--no-commit
通常,该命令会自动创建一系列提交。此标志应用必要的更改来挑选您的工作树和索引的每个命名提交,而不进行任何提交。此外,使用此选项时,索引不必与HEAD提交匹配。樱桃选择是针对索引的开始状态完成的。
当在一行中挑选多个提交效果时,这非常有用。
-s
--signoff
在提交消息的末尾添加Sign-by-by行。有关详细信息,请参阅 git-commit [1] 中的签收选项。
-S[<keyid>]
--gpg-sign[=<keyid>]
GPG签名提交。 keyid
参数是可选的,默认为提交者标识;如果指定,它必须粘在没有空格的选项上。
--ff
如果当前HEAD与cherry-pick’ed提交的父级相同,则将执行此提交的快进。
--allow-empty
在默认情况下,挑选空提交将失败,表明需要显式调用git commit --allow-empty
。此选项会覆盖该行为,允许在提取中自动保留空提交。请注意,当“ - ff”生效时,即使没有此选项,也会保留满足“快进”要求的空提交。另请注意,使用此选项仅保留最初为空的提交(即提交记录与其父项相同的树)。由于先前提交而变为空的提交被删除。要强制包含这些提交,请使用--keep-redundant-commits
。
--allow-empty-message
默认情况下,使用空消息挑选提交将失败。此选项会覆盖该行为,允许提取空消息的提交。
--keep-redundant-commits
如果提取的提交重复了当前历史记录中的提交,则它将变为空。默认情况下,这些冗余提交会导致cherry-pick
停止,以便用户可以检查提交。此选项会覆盖该行为并创建一个空提交对象。意味着--allow-empty
。
--strategy=<strategy>
使用给定的合并策略。应该只使用一次。有关详细信息,请参阅 git-merge [1] 中的MERGE STRATEGIES部分。
-X<option>
--strategy-option=<option>
将合并策略特定选项传递给合并策略。有关详细信息,请参阅 git-merge [1] 。
SEQUENCER SUBCOMMANDS
--continue
使用 .git / sequencer 中的信息继续进行中的操作。可以在解决失败的挑选或恢复中的冲突后继续使用。
--quit
忘记当前正在进行的操作。在樱桃挑选或恢复失败后,可用于清除顺序器状态。
--abort
取消操作并返回到预序列状态。
例子
git cherry-pick master
应用master分支顶端提交引入的更改,并使用此更改创建新提交。
git cherry-pick ..master
git cherry-pick ^HEAD master
应用所有提交引入的更改,这些提交是master的祖先但不是HEAD的祖先,以生成新的提交。
git cherry-pick maint next ^master
git cherry-pick maint master..next
应用作为maint或next的祖先的所有提交所引入的更改,但不应包含master或其任何祖先。注意,后者并不意味着maint
和master
和next
之间的所有内容;具体而言,如果master
中包含maint
,则不会使用maint
。
git cherry-pick master~4 master~2
应用master指向的第五个和第三个最后提交所引入的更改,并使用这些更改创建2个新提交。
git cherry-pick -n master~1 next
将工作树和索引应用于master指向的第二个最后一次提交所引入的更改以及next指向的最后一个提交,但不要使用这些更改创建任何提交。
git cherry-pick --ff ..next
如果历史是线性的并且HEAD是next的祖先,则更新工作树并使HEAD指针前进以匹配next。否则,将下一个但不是HEAD的提交引入的更改应用于当前分支,为每个新更改创建一个新提交。
git rev-list --reverse master -- README | git cherry-pick -n --stdin
将触及README的主分支上的所有提交引入的更改应用到工作树和索引,因此可以检查结果并将其作为单个新提交(如果合适)。
以下序列尝试向后移植补丁,因为补丁适用的代码已经发生了太大的变化,然后再次尝试,这次会更加关注匹配上下文行。
$ git cherry-pick topic^ (1)
$ git diff (2)
$ git reset --merge ORIG_HEAD (3)
$ git cherry-pick -Xpatience topic^ (4)
应用
git show topic^
显示的更改。在此示例中,修补程序不能完全应用,因此有关冲突的信息将写入索引和工作树,而不会产生新的提交结果。总结要调和的变化
取消樱桃挑选。换句话说,返回pre-cherry-pick状态,保留您在工作树中的任何本地修改。
尝试再次应用
topic^
引入的更改,花费额外的时间来避免基于错误匹配的上下文行的错误。
也可以看看
GIT
部分 git [1] 套件