Cherry Picking Specific Commits From Another Branch
此文章不允许转载, 违者必究...
目的: 如何使用
git rebase --onto命令来将某一分支的某些相连的 Commit 合并到指定的另外一个分支, 避免用 cherry-pick 一个个合并.
目录:
- content
<!-- Markdown 目录语法 --><!-- Vue 目录组件 -->Why 写这篇文章?
之前学习 git 官方教程的 3.6 Git 分支 - 变基 章节时,
对下面栏目的 git rebase --onto 到底能用来干什么感到有点疑惑:

接下来的某天看到这篇文章
(原文) https://www.devroom.io/2010/06/10/cherry-picking-specific-commits-from-another-branch/
(中文翻译) http://blog.csdn.net/ybdesire/article/details/42145597
才明白 git rebase --onto 的其中一个使用场景(可以这么玩) : 用来合并一连串的 commit 到另外一个分支.
用个例子来讲解
... - dd2e86 - 946992 -9143a9 - a6fd86 - 5a6057 [branch_dev_产品A]
\
76cada - 62ecb3 - b886a0 - 977f6f02 [branch_dev_产品B]
↑______________________↑
|
b1 功能该公司有2个产品 branch_dev_产品A 和 branch_dev_产品B. 某一天有个大客户觉得 branch_dev_产品B 的 b1 功能 做的不错, 出价1个亿想买一个具有 b1 功能 的 branch_dev_产品A, 于是我定了个小目标...
注:
b1 功能由76cada - 62ecb3 - b886a0这 3 个 commit 组成.
步骤:
STEP 1)
Administrator@Guang123456-PC [12:19:35] [/d/my_blog] [branch_dev_产品B *]
-> % git checkout -b "branch_one_Million" b886a0此时 git 仓库是这样的:
[branch_dev_产品A]
|
↓
... - dd2e86 - 946992 -9143a9 - a6fd86 - 5a6057
\
76cada - 62ecb3 - b886a0 - 977f6f02
↑ ↑
| |
| [branch_dev_产品B]
|
[branch_one_Million]STEP 2)
Administrator@Guang123456-PC [12:19:35] [/d/my_blog] [branch_one_Million *]
-> % git rebase --onto branch_dev_产品A 76cada^解析
git rebase --onto branch_dev_产品A 76cada^的作用是:把当前分支
branch_one_Million中的(76cada^, b886a0]截取出来, 然后 rebase --onto 到branch_dev_产品A
此时 git 仓库是这样的:
[branch_dev_产品A] [branch_one_Million]
| |
↓ ↓
... - dd2e86 - 946992 -9143a9 - a6fd86 - 5a6057 - 76cada' - 62ecb3' - b886a0'
\
76cada - 62ecb3 - b886a0 - 977f6f02
↑
|
[branch_dev_产品B]STEP 3)
Administrator@Guang123456-PC [12:19:35] [/d/my_blog] [branch_one_Million *]
-> % git checkout branch_dev_产品A
Administrator@Guang123456-PC [12:19:35] [/d/my_blog] [branch_dev_产品A *]
-> % git merge branch_one_Million此时 git 仓库是这样的:
[branch_dev_产品A]
|
[branch_one_Million]
|
↓
... - dd2e86 - 946992 -9143a9 - a6fd86 - 5a6057 - 76cada' - 62ecb3' - b886a0'
\
76cada - 62ecb3 - b886a0 - 977f6f02
↑
|
[branch_dev_产品B]
// branch_one_Million 完成任务, 删掉
Administrator@Guang123456-PC [12:19:35] [/d/my_blog] [branch_dev_产品A *]
-> % git branch -d branch_one_Million