目录搜索
GuidesgitattributesgiteverydaygitglossarygitignoregitmodulesgitrevisionsgittutorialgitworkflowsAdministrationgit archivegit bundlegit cleangit filter-branchgit fsckgit gcgit instawebgit reflogBasic Snapshottinggit addgit commitgit diffgit mvgit resetgit rmgit statusBranching and Merginggit branchgit checkoutgit loggit mergegit mergetoolgit stashgit tagDebugginggit bisectgit blamegit grepEmailgit amgit format-patchgit request-pullgit send-emailExternal Systemsgit fast-importgit svnGetting and Creating Projectsgit clonegit initGitgit annotategit archimportgit bisect-lk2009git check-attrgit check-mailmapgit check-ref-formatgit checkout-indexgit cherrygit citoolgit columngit credentialgit credential-cachegit credential-storegit cvsexportcommitgit cvsimportgit cvsservergit diff-filesgit diff-treegit difftoolgit fast-exportgit fetch-packgit fmt-merge-msggit get-tar-commit-idgit guigit http-backendgit http-fetchgit http-pushgit imap-sendgit index-packgit interpret-trailersgit ls-remotegit ls-treegit mailinfogit mailsplitgit merge-filegit merge-indexgit merge-one-filegit merge-treegit mktaggit mktreegit name-revgit notesgit p4git pack-objectsgit pack-redundantgit pack-refsgit parse-remotegit patch-idgit prunegit prune-packedgit quiltimportgit receive-packgit remote-extgit remote-fdgit remote-testgitgit repackgit replacegit rereregit send-packgit sh-i18ngit sh-setupgit shellgit show-branchgit show-indexgit stripspacegit unpack-filegit unpack-objectsgit upload-archivegit upload-packgit vargit verify-commitgit verify-taggit whatchangedgit worktreeInspection and Comparisongit describegit shortloggit showMiscellaneousapi credentialsapi indexgitcligitcore tutorialgitcredentialsgitcvs migrationgitdiffcoregithooksgitkgitnamespacesgitremote helpersgitrepository layoutgitsubmodulesgittutorial 2gitwebgitweb.confpack formatUser ManualPatchinggit applygit cherry-pickgit rebasegit revertPlumbing Commandsgit cat-filegit check-ignoregit commit-treegit count-objectsgit diff-indexgit for-each-refgit hash-objectgit ls-filesgit merge-basegit read-treegit rev-listgit rev-parsegit show-refgit symbolic-refgit update-indexgit update-refgit verify-packgit write-treeServer Admingit daemongit update-server-infoSetup and Configgitgit configgit helpSharing and Updating Projectsgit fetchgit pullgit pushgit remotegit submodule
文字

命名

git-cherry-pick  - 应用一些现有提交引入的更改

概要

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff]                  [-S[<keyid>]] <commit>…
git cherry-pick --continuegit cherry-pick --quit
git cherry-pick --abort

描述

给定一个或多个现有的提交,应用每个引入的更改,为每个提交一个新的提交。这要求你的工作树是干净的(不需要修改 HEAD 提交)。

如果不清楚如何应用更改,则会发生以下情况:

  1. 当前分支和HEAD指针停留在最后一次成功提交。

  2. CHERRY_PICK_HEADRef设定点在提交该介绍,很难应用更改。

  3. 干净地应用更改的路径在索引文件和工作树中都会更新。

  4. 对于冲突的路径,索引文件最多可以记录三个版本,如 git-merge [1] 的 “TRUE MERGE” 部分所述。工作树中的文件将包括通常的冲突标记括号冲突的描述<<<<<<<>>>>>>>

  5. 没有其他修改。

有关解决此类冲突的一些提示,请参阅 git-merge [1]。

选项

<commit>…

递交 cherry-pick 。有关拼写提交的更完整列表,请参阅 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 提交匹配。cherry-pick 是根据索引的开始状态完成的。

当在一行中选择多个“索引”效果到索引时,这非常有用。

-s   --signoff

在提交消息的末尾添加 Signed-off-by 行。有关更多信息,请参阅 git-commit [1] 中的 signoff 选项。

-S<keyid>   --gpg-sign=<keyid>

GPG 标志提交。该keyid参数是可选的,并且默认为提交者身份; 如果指定,它必须粘贴到选项没有空格。

--ff

如果当前的 HEAD 与 cherry-pick 的提交的父对象相同,则将执行快速转发此提交。

--allow-empty

默认情况下,cherry-pick 一个空的提交将失败,表明需要显式调用git commit --allow-empty。该选项会覆盖该行为,允许空提交在 cherry-pick 中自动保留。请注意,当“--ff”有效时,即使没有此选项,也会保留符合“快进”要求的空提交。还要注意,使用这个选项只保留最初为空的提交(即提交记录与其父代相同的树)。由于先前的提交而提交的提交被删除。强制包含这些提交使用--keep-redundant-commits

--allow-empty-message

默认情况下,用空信息挑选提交将失败。该选项将覆盖该行为,允许提交空消息提交。

--keep-redundant-commits

如果提交 cherry-pick 复制了当前历史记录中的提交,它将变为空。默认情况下,这些冗余提交会导致cherry-pick停止,以便用户可以检查提交。该选项将覆盖该行为并创建一个空的提交对象。意味着--allow-empty

--strategy=<strategy>

使用给定的合并策略。只能使用一次。有关详细信息,请参阅 git-merge [1] 中的 MERGE STRATEGIES 部分。

-X<option>   --strategy-option=<option>

将合并策略特定选项传递给合并策略。有关详细信息,请参阅 git-merge [1] 。

Sequencer 子命令

--continue

使用中的信息继续正在进行的操作.git/sequencer。可以在解决失败的 cherry-pick 或恢复中的冲突后继续使用。

--quit

忘记当前正在进行的操作。在 cherry-pick 或恢复失败后可用于清除定序器状态。

--abort

取消操作并返回到预序列状态。

例子

git cherry-pick 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之间的一切,masternext; 具体而言,maint如果包含在内,则不会被使用master

git cherry-pick master~4 master~2

应用由 master 指向的第五次和第三次提交所引入的更改,并创建两个新提交并进行这些更改。

git cherry-pick -n master~1 next

向工作树和索引应用由 master 指向的第二次提交引入的更改以及 next 指向的最后一个提交的更改,但不要使用这些更改创建任何提交。

git cherry-pick --ff ..next

如果历史记录是线性的并且 HEAD 是下一个祖先,则更新工作树并前进 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)
  1. 应用将显示的更改git show topic^。在这个例子中,这个补丁并没有很好的应用,所以关于冲突的信息被写入索引和工作树,并且没有新的提交结果。

  2. 总结要调和的变化

  3. 取消 cherry-pick 。换句话说,返回到 cherry-pick 前的状态,保留您在工作树中进行的任何本地修改。

  4. 尝试应用topic^再次引入的更改,花费额外的时间避免基于错误匹配的上下文行的错误。

上一篇:下一篇: