慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

阮一峰的网络日志

科技爱好者周刊(第 396 期):互联网通信的替代方案 科技爱好者周刊(第 396 期):互联网通信的替代方案 - 阮一峰的网络日志 科技爱好者周刊(第 395 期):软件开发的第三种方式 科技爱好者周刊(第 395 期):软件开发的第三种方式 - 阮一峰的网络日志 科技爱好者周刊(第 393 期):脑腐状态 科技爱好者周刊(第 392 期):axios 投毒与好莱坞式骗术 科技爱好者周刊(第 391 期):AI 的贫富分化 科技爱好者周刊(第 390 期):没有语料,大模型就是智障 套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的"套壳"疑云 科技爱好者周刊(第 389 期):未来如何招聘程序员 科技爱好者周刊(第 388 期):测试是新的护城河 零安装的"云养虾":ArkClaw 使用指南 科技爱好者周刊(第 387 期):你是领先的 科技爱好者周刊(第 386 期):当外卖员接入 AI 字节全家桶 Seed 2.0 + TRAE 玩转 Skill 科技爱好者周刊(第 385 期):马斯克害怕中国车企吗? 智谱旗舰 GLM-5 实测:对比 Opus 4.6 和 GPT-5.3-Codex 科技爱好者周刊(第 384 期):为什么软件股下跌 科技爱好者周刊(第 383 期):你是第几级 AI 编程 Kimi 的一体化,Manus 的分层 科技爱好者周刊(第 382 期):独立软件的黄昏 AI native Workspace 也许是智能体的下一阶段 科技爱好者周刊(第 381 期):中国 AI 大模型领导者在想什么 科技爱好者周刊(第 380 期):为什么人们拥抱"不对称收益" 科技爱好者周刊(第 379 期):《硅谷钢铁侠》摘录 我如何用 AI 处理历史遗留代码:MiniMax M2.1 升级体验 科技爱好者周刊(第 378 期):预测是新的互联网热点 科技爱好者周刊(第 377 期):14万美元的贫困线 科技爱好者周刊(第 376 期):太空数据中心的争议 科技爱好者周刊(第 375 期):一扇门的 Bug 终于有人做了 Subagent,TRAE 国内版 SOLO 模式来了 科技爱好者周刊(第 374 期):6GHz 的问题 VS Code 使用国产大模型 MiniMax M2 教程 科技爱好者周刊(第 373 期):数据模型是新产品的核心 国产大模型接入 Claude Code 教程:以 Doubao-Seed-Code 为例 科技爱好者周刊(第 372 期):软件界面如何设计 大模型比拼:MiniMax M2 vs GLM 4.6 vs Claude Sonnet 4.5 科技爱好者周刊(第 371 期):一个乐观主义者的专访 科技爱好者周刊(第 370 期):正确的代码高亮 错误处理:异常好于状态码 科技爱好者周刊(第 369 期):Tim 与罗永浩的对谈 科技爱好者周刊(第 368 期):不要这样管理软件团队 一天之内,智谱和 Anthropic 都发了最强编程模型 科技爱好者周刊(第 367 期):Nano Banana 的几个妙用 科技爱好者周刊(第 366 期):旧金山疯狂的 AI 广告 科技爱好者周刊(第 365 期):流量变现正在崩塌 科技爱好者周刊(第 364 期):最难还原的魔方 科技爱好者周刊(第 363 期):最好懂的神经网络解释 科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计 科技爱好者周刊(第 361 期):暗网 Tor 安全吗?
git cherry-pick 教程
阮一峰 · 2020-04-27 · via 阮一峰的网络日志

對於多分支的代碼庫,將代碼從一個分支轉移到另一個分支是常見需求。

這時分兩種情況。一種情況是,你需要另一個分支的所有代碼變動,那麼就採用合併(git merge)。另一種情況是,你只需要部分代碼變動(某幾個提交),這時可以採用 Cherry pick。

一、基本用法

git cherry-pick命令的作用,就是將指定的提交(commit)應用於其他分支。


$ git cherry-pick <commitHash>

上面命令就會將指定的提交commitHash,應用於當前分支。這會在當前分支產生一個新的提交,當然它們的哈希值會不一樣。

舉例來說,代碼倉庫有masterfeature兩個分支。


    a - b - c - d   Master
         \
           e - f - g Feature

現在將提交f應用到master分支。


# 切換到 master 分支
$ git checkout master

# Cherry pick 操作
$ git cherry-pick f

上面的操作完成以後,代碼庫就變成了下面的樣子。


    a - b - c - d - f   Master
         \
           e - f - g Feature

從上面可以看到,master分支的末尾增加了一個提交f

git cherry-pick命令的參數,不一定是提交的哈希值,分支名也是可以的,表示轉移該分支的最新提交。


$ git cherry-pick feature

上面代碼表示將feature分支的最近一次提交,轉移到當前分支。

二、轉移多個提交

Cherry pick 支持一次轉移多個提交。


$ git cherry-pick <HashA> <HashB>

上面的命令將 A 和 B 兩個提交應用到當前分支。這會在當前分支生成兩個對應的新提交。

如果想要轉移一系列的連續提交,可以使用下面的簡便語法。


$ git cherry-pick A..B 

上面的命令可以轉移從 A 到 B 的所有提交。它們必須按照正確的順序放置:提交 A 必須早於提交 B,否則命令將失敗,但不會報錯。

注意,使用上面的命令,提交 A 將不會包含在 Cherry pick 中。如果要包含提交 A,可以使用下面的語法。


$ git cherry-pick A^..B 

三、配置項

git cherry-pick命令的常用配置項如下。

(1)-e--edit

打開外部編輯器,編輯提交信息。

(2)-n--no-commit

只更新工作區和暫存區,不產生新的提交。

(3)-x

在提交信息的末尾追加一行(cherry picked from commit ...),方便以後查到這個提交是如何產生的。

(4)-s--signoff

在提交信息的末尾追加一行操作者的簽名,表示是誰進行了這個操作。

(5)-m parent-number--mainline parent-number

如果原始提交是一個合併節點,來自於兩個分支的合併,那麼 Cherry pick 默認將失敗,因為它不知道應該採用哪個分支的代碼變動。

-m配置項告訴 Git,應該採用哪個分支的變動。它的參數parent-number是一個從1開始的整數,代表原始提交的父分支編號。


$ git cherry-pick -m 1 <commitHash>

上面命令表示,Cherry pick 採用提交commitHash來自編號1的父分支的變動。

一般來說,1號父分支是接受變動的分支(the branch being merged into),2號父分支是作為變動來源的分支(the branch being merged from)。

四、代碼衝突

如果操作過程中發生代碼衝突,Cherry pick 會停下來,讓用戶決定如何繼續操作。

(1)--continue

用戶解決代碼衝突後,第一步將修改的文件重新加入暫存區(git add .),第二步使用下面的命令,讓 Cherry pick 過程繼續執行。


$ git cherry-pick --continue

(2)--abort

發生代碼衝突後,放棄合併,回到操作前的樣子。

(3)--quit

發生代碼衝突後,退出 Cherry pick,但是不回到操作前的樣子。

五、轉移到另一個代碼庫

Cherry pick 也支持轉移另一個代碼庫的提交,方法是先將該庫加為遠程倉庫。


$ git remote add target git://gitUrl

上面命令添加了一個遠程倉庫target

然後,將遠程代碼抓取到本地。


$ git fetch target

上面命令將遠程代碼倉庫抓取到本地。

接著,檢查一下要從遠程倉庫轉移的提交,獲取它的哈希值。


$ git log target/master

最後,使用git cherry-pick命令轉移提交。


$ git cherry-pick <commitHash>

(完)