git高级特性之 – cherry-pick

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路git高级特性之 – cherry-pick,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

背景

在开发过程中,我们一般会使用多分支来管理开发。在特殊情况下,其中一个分支的改动,我想搬到我的另一个分支(它会作为一个新的提交引入到你当前分支上),关于这种操作,如果使用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>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/155821.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!