
文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载git cherry-pick不止能针对单个提交还可以一次性地把一段连续的提交序列应用到当前分支上其核心语法与git log等命令通用的点号区间dotted range记法一脉相承。本文以 TIL 仓库中 cherry-pick-a-range-of-commits.md 为线索系统讲解用A..B与B^..D语法挑选提交范围的原理、边界行为下界开区间 vs 上界闭区间以及配套的实用技巧读完即可在日常分支管理中精准、安全地批量移植提交。核心概念cherry-pick 与提交范围git cherry-pick的官方语义是「给定一个或多个已存在的提交将其中每一个引入的变更应用出来并为每一个提交记录一个新提交」。因此它天然支持一次处理多个提交——既可以像 cherry-pick-multiple-commits-at-once.md 中那样显式列出多个 SHA$ git cherry-pick 5206af5 6362f41也可以直接传入一个提交范围让 Git 替你枚举该区间内的全部提交并逐一应用。后者正是本主题的用武之地当你想把某个分支上一段连续的改动原样搬到另一个分支例如把 hotfix 分支的连续三个修复提交移植到主干范围语法远比逐个抄写 SHA 高效、不易出错。范围语法A..B上界包含、下界排除Git 的A..B双点记法在git log、git diff、git rev-list等命令中随处可见参见 two-kinds-of-dotted-range-notation.md。把它用在git cherry-pick上时语义完全一致A是范围较旧的一端且该端点本身被排除开区间下界B是范围较新的一端且该端点本身被包含闭区间上界。考虑一条如下的提交链A - B - C - D越靠右越新D为最新。执行$ git cherry-pick B..D实际被挑选到HEAD上的是提交C和D而B不会进入结果。原因正是上面说的下界是排他的exclusive区间只覆盖「B 之后、直到并包括 D」的提交。小贴士若此时还希望把B本身也一并带上就把下界再往前推一位写成B^..D见下文。这一点与git log A..B的结果边界完全一致——同样的记法在整个 Git 生态中保持统一理解了其一即可举一反三。下界前移B^..D把起点也包含进来当范围下界被排除时如何「补上」那个被跳过的提交答案是使用^符号引用下界提交的父提交。B^表示提交B的第一个父提交也就是链中的A。于是$ git cherry-pick B^..D等价于「从B^即A之后开始、直到并包含D」正好把A - B - C - D链中的B、C、D三个提交全部挑选出来同时仍不包含A。这一技巧在以下场景尤其好用你想迁移的「第一个提交」本身就在区间端点位置上而你又不想把它的父提交一起带过来你只记得区间两端的 SHA却记不清中间到底有几个提交——用B..D和B^..D可以放心地表达「去掉开头 vs 包含开头」两种意图而不必逐一核对中间提交与 checking-commit-ancestry.md 中git merge-base --is-ancestor的思路配合先确认端点提交的祖先关系再放心批量挑选。一次性应用多个提交时的实际行为范围语法本质上等价于把区间内的提交逐个交给 cherry-pick。参考 cherry-pick-multiple-commits-at-once.md 展示的多提交输出命令会按顺序逐个应用并各自生成新提交自动合并时还会打印Auto-merging与对应的新提交摘要$ git cherry-pick 5206af5 6362f41 Auto-merging test/services/event_test.rb [jb/my-feature-branch 961f3deb] Use the other testing syntax Date: Fri May 2 10:50:14 2025 -0500 1 file changed, 7 insertions(), 7 deletions(-)对范围形式git cherry-pick B..D而言输出模式完全相同C的变更先应用并生成一个新提交接着D的变更再应用并再生成一个新提交两条新提交依次叠在HEAD之上。这意味着挑选后的提交不会保留原提交的 SHA而是获得全新的提交对象提交的作者信息、提交时间会按默认行为保留原始值除非使用-e编辑或--no-commit等选项调整如果中间某个提交无法干净合并cherry-pick 会停下来等待人工解决冲突解决后可用git cherry-pick --continue继续或用--abort整体放弃。合并冲突与常用配套选项范围挑选本质上是多次逐个合并因此冲突概率随提交数量上升。若遇到「近乎可合并但边界微妙」的情况可考虑在挑选时施加与git diff一致的合并策略例如 diffing-with-patience.md 提到的 patience 算法$ git cherry-pick -Xpatience B..D-Xpatience会把 patience 作为底层合并策略传入对「大量重复行」「行被移位」这类容易误判的场景通常能得到更合理的冲突结果。除此之外man git-cherry-pick中值得留意的选项还包括选项作用-e/--edit应用提交前打开编辑器允许修改提交信息-n/--no-commit应用变更但不创建新提交便于把多个提交先合为一个待提交状态-x在新提交信息中追加一行(cherry picked from commit ...)便于追溯来源-m parent-number挑选合并提交时必须指定要采用哪个父提交的变更--continue/--abort/--quit冲突后的继续、放弃与退出流程控制需要特别提醒默认情况下不能直接对合并提交执行 cherry-pick除非用-m指明父提交编号——这同样是范围挑选中可能遇到的一个坑。范围记法与分支对比的联动理解理解了A..B的边界语义后可以顺带把它与仓库中其他 Git 条目打通形成完整的知识闭环list-commits-on-a-branch.md 使用git log master..my-feature-branch列出「在功能分支上、但不在 master 上」的提交——与git cherry-pick master..my-feature-branch的挑选对象完全对应可以先用git log --oneline预览将要挑选的提交清单再执行挑选two-kinds-of-dotted-range-notation.md 区分了..与...三点对称差两种记法cherry-pick 场景下使用..即可...主要用于git log --left-right --cherry-pick这类双向对比见 list-different-commits-between-two-branches.mdtransition-a-branch-from-one-base-to-another.md 提供了「换基准」的另一种思路若想整段迁移某个分支而不是挑选零散提交用git rebase --onto dev main my-feature-branch更干净——范围 cherry-pick 与--ontorebase 各有所长前者适合把提交「复制一份」到别处并保留原分支后者适合「整体挪动」分支基线accessing-a-lost-commit.md 展示了一个典型组合拳通过git reflog找回丢失提交的 SHA 后可以顺手用git cherry-pick把它恢复回来。实战演练一条可复现的完整流程把以上知识串成一个可直接照做的实验建议在临时分支上操作避免影响真实历史# 1. 构造一条 A-B-C-D 提交链 git checkout -b demo-base git commit --allow-empty -m A # 记为 A git commit --allow-empty -m B # 记为 B git commit --allow-empty -m C # 记为 C git commit --allow-empty -m D # 记为 D # 2. 用 --oneline 预览范围只会列出 C 与 D git log B..D --oneline # 3. 把 C、D 挑选到当前分支示例从 demo-base 上另开一个分支 git checkout -b demo-target git cherry-pick B..D # 4. 若想把 B 也包含进来下界前移到 B^ git cherry-pick B^..D # 5. 挑选结束后检查新提交及来源 git log --oneline -5第 2 步的git log B..D --oneline是与git cherry-pick B..D完全同源的预览手段——先看清单、再执行挑选是规避误选的最佳习惯。总结git cherry-pick A..B会把A之后、直到并包含B的全部提交逐个应用到当前分支其中下界A本身被排除需要连下界一起挑选时用B^..D把起点前移到父提交即可包含B范围挑选逐提交生成新提交冲突时可用-Xpatience、--continue/--abort等选项控制流程更全面的语法与选项细节以man git-cherry-pick及man git-rev-parse范围记法的权威来源为准。本主题来自 TIL 仓库的 cherry-pick-a-range-of-commits.md并交叉印证了仓库内 cherry-pick-multiple-commits-at-once.md、two-kinds-of-dotted-range-notation.md、list-commits-on-a-branch.md 等条目如需继续深入可在仓库 git 目录 下检索更多 cherry-pick 与范围记法相关的实战笔记。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐重新定义音乐体验用foobox-cn打造你的专属音乐空间重新定义音乐体验用foobox cn打造你的专属音乐空间 厌倦了千篇一律的音乐播放器界面想要一个既美观又实用的音乐管理工具今天我要向你介绍一个能彻底改变f桌面应用音视频30 Seconds of Code Git 技巧用 git cherry-pick 从一次或多次提交中挑选并移植变更30 Seconds of Code Git 技巧用 git cherry pick 从一次或多次提交中挑选并移植变更 本篇指南围绕 30 seconds o教程文档Git cherry-pick选择性提交应用的冲突处理Git cherry pick选择性提交应用的冲突处理 一、痛点直击为什么需要掌握 cherry pick 冲突处理 你是否遇到过这些场景 线上紧急修复版本控制开发工具CLI上一篇Tianshou迁移学习终极指南5步将预训练模型快速适配新任务下一篇极速云预览Preevy零配置部署实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考