git高级特性之 - cherry-pick

本文详细介绍了Git的cherry-pick命令,包括其背景、配置项和实践案例。cherry-pick允许将一个分支的特定提交应用到另一个分支,用于在不同分支间迁移改动。文章讲解了如何使用-cherry-pick进行自动提交、不自动提交、增加额外说明信息,以及处理冲突和从远程仓库转移提交等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

在开发过程中,我们一般会使用多分支来管理开发。在特殊情况下,其中一个分支的改动,我想搬到我的另一个分支(它会作为一个新的提交引入到你当前分支上),关于这种操作,如果使用git 的话,那就可以做到了,这就是我们这篇博客想要介绍的 git cherry-pick 高级特性。

介绍

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

首先看下官方介绍: 运行下面的命令

git help cherry-pick

基本语法:

git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff]
		  [-S[<keyid>]] <commit>…​
git cherry-pick --continue
git cherry-pick --quit
git cherry-pick --abort

其中:
-n, --no-commit       不自动提交
-e, --edit            编辑提交信息

配置项

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

-e,–edit

打开外部编辑器,编辑提交信息。

-n,–no-commit

只更新工作区和暂存区,不产生新的提交。

-x

在提交信息的末尾追加一行(cherry picked from commit …),方便以后查到这个提交是如何产生的。

-s,–signoff

在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。

-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)。

实践案例

自动提交

如果没有出现冲突,该命令将自动提交。

git cherry-pick <commit_id>

当cherry-pick时,没有成功自动提交,这说明存在冲突,因此首先需要解决冲突,解决冲突后需要git commit手动进行提交;
或者git add .后直接使用git cherry-pick --continue继续。

不自动提交

参数 -n,–no-commit
只更新工作区和暂存区,不产生新的提交。

git cherry-pick -n <commit_id>

增加额外说明信息

git cherry-pick -x <commit_id>

在原来的提交信息下,增加一行额外说明信息(cherry picked from commit …),用来说明该次commit是从哪里cherry-pick的。
如果是从自己的私人分支之间做这个操作,就不要使用这个,这样的信息是无用的。
如果是cherry-pick别的同事的提交,可以使用这个参数,这个额外信息将非常有用。

重新编辑提交信息

如果想要在cherry-pick后重新编辑提交信息,则使用git cherry-pick -e命令

git cherry-pick -e <commit_id>

有冲突的情况

如果在执行git cherry-pick时遇到冲突,一般会有下面的几种提示:

git cherry-pick --continue
git cherry-pick --quit
git cherry-pick --abort

如果要继续cherry-pick,则首先需要解决冲突,通过git add .将文件标记为已解决,然后可以使用git cherry-pick --continue命令,继续进行cherry-pick操作。

如果要中断这次cherry-pick,则使用git cherry-pick --quit,这种情况下当前分支中未冲突的内容状态将为modified,

如果要取消这次cherry-pick,则使用git cherry-pick --abort,这种情况下当前分支恢复到cherry-pick前的状态,没有改变。

cherry-pick分支

git cherry-pick <branchname>

如果在git cherry-pick后加一个分支名,则表示将该分支最近一次提交,转移到当前分支。

一次pick连续的多个提交

语法如下:

git cherry-pick <commit_id_0>..<commit_id_n>

中间的两个点,表示把两个commit区间的所有commit都复制过去。
注意:
上面的操作,不会包含第一个commit_id_0,即只会复制(commit_id_1 到 commit_id_n)。
所以使用时,记得算好第一个commit id。

如果要包含第一个commit_id_0提交,可以使用下面的语法:

git cherry-pick <commit_id_0>^..<commit_id_n>

注意,多了一个符号^

转移到另一个代码库

Cherry pick 也支持转移另一个代码库的提交,方法是先将该库加为远程仓库。

git remote add target git://gitUrl

上面命令添加了一个远程仓库target。

然后,将远程代码抓取到本地。

git fetch target

上面命令将远程代码仓库抓取到本地。

接着,检查一下要从远程仓库转移的提交,获取它的哈希值。

git log target/master

最后,使用git cherry-pick命令转移提交。

git cherry-pick <commitHash>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值