多个分支的代码库,将代码从一个分支转移到另一个分支要如何操作。
当你只需要部分代码变动或者说是某几个提交时,可以采用 git Cherry pick。请看下图:
一、基础作用
git cherry-pick 命令的作用,就是将指定的提交应用于其他分支。
git cherry-pick <commitHash>
举例说明:
当前分支结构
a - b - c - d Master
\
e - f - g Feature
期望:把 g 点的提交合并到 master
# 切换到 master 分支
git checkout master
# Cherry pick 操作
git cherry-pick g
或者
# 切换到 master 分支
git checkout master
# Cherry pick 操作
git cherry-pick Feature
注意: git cherry-pick 命令的参数,不一定是提交的哈希值,分支名也是可以的,如果是分支名,仅会同步分支上最新一次提交
二、同步多个提交
将 A 和 B 两个提交应用到当前分支。这会在当前分支生成两个对应的新提交
git cherry-pick <HashA> <HashB>
将 C 到 E 连续的提交应用到当前分支
git cherry-pick C..E
注意:提交顺序需要按照提交时间排列,提交 C 的时间一定要早于提交 E
三、产生冲突
如果操作过程中发生代码冲突,Cherry pick 会停下来,让用户决定如何继续操作。
(1)--continue
用户解决代码冲突后
- 第一步将修改的文件重新加入暂存区(
git add .) - 第二步使用下面的命令,让 Cherry pick 过程继续执行。
git cherry-pick --continue
(2)--abort
$ git cherry-pick --abort
发生代码冲突后,放弃合并,回到操作前的样子。
(3)--quit
发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。
四、配置介绍
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开始的整数,代表原始提交的父分支编号。