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