git cherry-pick 学习

172 阅读2分钟

多个分支的代码库,将代码从一个分支转移到另一个分支要如何操作。

当你只需要部分代码变动或者说是某几个提交时,可以采用 git Cherry pick。请看下图:

image.png

一、基础作用

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开始的整数,代表原始提交的父分支编号。

参考:git cherry-pick 教程 - 阮一峰的网络日志