git cherry-pick的使用
[Git] Git整理(五) git cherry-pick的使用
概述
git cherry-pick
可以理解为”挑拣”提交,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。 当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,那么就要使用git cherry-pick
了。
用法
git cherry-pick [<options>] <commit-ish>...
常用options:
--quit 退出当前的chery-pick序列
--continue 继续当前的chery-pick序列
--abort 取消当前的chery-pick序列,恢复当前分支
-n, --no-commit 不自动提交
-e, --edit 编辑提交信息
git cherry-pick commitid
在本地仓库中,有两个分支:branch1和branch2,我们先来查看各个分支的提交:
# 切换到branch2分支
$ git checkout branch2
Switched to branch 'branch2'
$
$
# 查看最近三次提交
$ git log --oneline -3
23d9422 [Description]:branch2 commit 3
2555c6e [Description]:branch2 commit 2
b82ba0f [Description]:branch2 commit 1
# 切换到branch1分支
$ git checkout branch1
Switched to branch 'branch1'
# 查看最近三次提交
$ git log --oneline -3
20fe2f9 commit second
c51adbe commit first
ae2bd14 commit 3th
现在,我想要将branch2分支上的第一次提交内容合入到branch1分支上,则可以使用git cherry-pick
命令:
$ git cherry-pick 2555c6e
error: could not apply 2555c6e... [Description]:branch2 commit 2
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
当cherry-pick
时,没有成功自动提交,这说明存在冲突,因此首先需要解决冲突,解决冲突后需要git commit
手动进行提交:
$ git commit
[branch1 790f431] [Description]:branch2 commit 2
Date: Fri Jul 13 18:36:44 2018 +0800
1 file changed, 1 insertion(+)
create mode 100644 only-for-branch2.txt
或者git add .
后直接使用git cherry-pick --continue
继续。
现在查看提交信息:
$ git log --oneline -3
790f431 [Description]:branch2 commit 2
20fe2f9 commit second
c51adbe commit first
branch2分支上的第二次提交成功合入到了branch1分支上。
以上就是git cherry-pick
的基本用法,如果没有出现冲突,该命令将自动提交。
git cherry-pick -n
如果不想git cherry-pick
自动进行提交,则加参数-n
即可。比如将branch2分支上的第三次提交内容合入到branch1分支上:
$ git cherry-pick 23d9422
[branch1 2c67715] [Description]:branch2 commit 3
Date: Fri Jul 13 18:37:05 2018 +0800
1 file changed, 1 insertion(+)
$
查看提交log,它自动合入了branch1分支:
$ git log --oneline -3
2c67715 [Description]:branch2 commit 3
f8bc5db [Description]:branch2 commit 2
20fe2f9 commit second
如果不想进行自动合入,则使用git cherry-pick -n
:
# 回退上次提交,再此进行cherry-pick
$ git reset --hard HEAD~
HEAD is now at f8bc5db [Description]:branch2 commit 2
$ git cherry-pick -n 23d9422
$ git status
On branch branch1
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: only-for-branch2.txt
这时通过git status
查看,发现已将branch2的提交获取但是没有合入。
git cherry-pick -e
如果想要在cherr-pick
后重新编辑提交信息,则使用git cherry-pick -e
命令,比如我们还是要将branch2分支上的第三次提交内容合入到branch1分支上,但是需要修改提交信息:
$ git cherry-pick -e 23d9422
1 [Description]:branch2 commit 3
2 #
3 # It looks like you may be committing a cherry-pick.
4 # If this is not correct, please remove the file
5 # .git/CHERRY_PICK_HEAD
6 # and try again.
git cherry-pick –continue, –abort,–quit
当使用git cherry-pick
发生冲突后,将会出现如下信息:
$ git cherry-pick 23d9422
error: could not apply 23d9422... [Description]:branch2 commit 3
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
这时如果要继续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
前的状态,没有改变。
git cherry-pick < branchname >
如果在git cherry-pick
后加一个分支名,则表示将该分支顶端提交进cherry-pick,如:
$ git cherry-pick master
git cherry-pick ..< branchname >
git cherry-pick ^HEAD < branchname >
以上两个命令作用相同,表示应用所有提交引入的更改,这些提交是branchname的祖先但不是HEAD的祖先,比如,现在我的仓库中有三个分支,其提交历史如下图:
C<---D<---E branch2
/
master A<---B
\
F<---G<---H branch3
|
HEAD
如果我使用git cherry-pick ..branch2
或者git cherry-pick ^HEAD branch2
,那么会将属于branch2的祖先但不属于branch3的祖先的所有提交引入到当前分支branch3上,并生成新的提交,执行命令如下:
$ git cherry-pick ..branch2
[branch3 c95d8b0] [Description]:branch2 add only-for-branch2
Date: Fri Jul 13 20:34:40 2018 +0800
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 only-for-branch2
[branch3 7199a67] [Description]:branch2 modify for only-for-branch2--1
Date: Fri Jul 13 20:38:35 2018 +0800
1 file changed, 1 insertion(+)
[branch3 eb8ab62] [Description]:branch2 modify for only-for-branch2--2
Date: Fri Jul 13 20:39:09 2018 +0800
1 file changed, 1 insertion(+)
执行后的提交历史如下:
C<---D<---E branch2
/
master A<---B
\
F<---G<---H<---C'<---D'<---E' branch3
|
HEAD
常见问题
1.The previous cherry-pick is now empty, possibly due to conflict resolution.
原因:
在cherry-pick
时出现冲突,解决冲突后本地分支中内容和cherry-pick
之前相比没有改变,因此当在以后的步骤中继续git cherry-pick
或执行其他命令时,由于此时还处于上次cherry-pick
,都会提示该信息,表示可能是由于解决冲突造成上一次cherry-pick内容是空的。
解决方案:
1.执行
git cherry-pick --abort
取消上次操作。2.执行
git commit --allow-empty
,表示允许空提交。
2.fatal: You are in the middle of a cherry-pick – cannot amend.
原因:
在cherry-pick
时出现冲突,没有解决冲突就执行git commit --amend
命令,从而会提示该信息。
解决方案:
首先在git commit --amend
之前解决冲突,并完成这次cherry-pick
:
$ git add .
$ git cherry-pick --continue
git cherry-pick的使用的更多相关文章
- git之rebase、merge和cherry pick的区别(面试常问)
git flow图例镇楼 merge 这个简单,初学者常用.比如主分支是Dev,最新版本是01.然后小明基于此,搞了个feature 分支A,业务:打酱油.然后在上面多次提交,完成功能迭代开发,如A1 ...
- git cherry命令来比较两个分支的不同
git cherry 命令使用 1. 两个参数的情况 git cherry -v origin/master asa 比较本地的asa分支和远程master的差别 git cherry -v mast ...
- 10 个迅速提升你 Git 水平的提示
1. Git自动补全 假使你使用命令行工具运行Git命令,那么每次手动输入各种命令是一件很令人厌烦的事情.为了解决这个问题,你可以启用Git的自动补全功能,完成这项工作仅需要几分钟. 为了得到这个脚本 ...
- 10 个迅速提升你 Git 水平的提示【转】
转自:https://www.oschina.net/translate/10-tips-git-next-level 最近我们推出了两个教程:熟悉Git的基本功能和让你在开发团队中熟练的使用Git ...
- 【转】10 个迅速提升你 Git 水平的提示
最近我们推出了两个教程:熟悉Git的基本功能和让你在开发团队中熟练的使用Git . 我们所讨论的命令足够一个开发者在Git使用方面游刃有余.在这篇文章中,我们试图探索怎样有效的管理你的时间和充分的使用 ...
- Git 提供篇
1. Git自动补全 假使你使用命令行工具运行Git命令,那么每次手动输入各种命令是一件很令人厌烦的事情.为了解决这个问题,你可以启用Git的自动补全功能,完成这项工作仅需要几分钟. 为了得到这个脚本 ...
- Git 经常使用命令合集
====== Git 经常使用命令合集 ====== === 1.Git 文档 === Git 中文文档观看地址:http://git.oschina.net/progit/ === ...
- Git版本控制原理和常用指令说明
平时在Android Studio开发Android项目,习惯了点击右键或图标直接拉新fetch,pull,commit和push.但是必要的时候还得在终端输入命令行.比如正在开发新版本v3.0,老板 ...
- Git速成学习第六课:Bug分支
Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/ 当你接到一个修复代码为101的任务的时候,很自然的你想创建一个分支issue-101来修复它,但 ...
- git gui 还原部分提交文件
有时候用git提交文件的时候会一起提交了多个文件,但是突然后悔了,想把其中一个文件撤销提交,其他文件不做修改.这个时候该怎么办呢? 我觉得有很多办法,比如可以先checkout到上次的提交,然后复制要 ...
随机推荐
- 关于一段有趣代码引出的String创建对象的解释
通常来说,我们认为hashCode不相同就为不同的对象.就这样由一段代码引发了一场讨论,代码如下: @Test public void stringCompare() { String s1 = &q ...
- 06 使用bbed提交delete的数据--01
使用bbed模拟delete提交操作 --session 1 TEST@ orcl )); Table created. TEST@ orcl ,'AAAAA'); row created. TEST ...
- DFS序1
给一棵有根树,这棵树由编号为1..N的N个结点组成.根结点的编号为R.每个结点都有一个权值,结点i的权值为vi .接下来有M组操作,操作分为两类:1 a x,表示将结点a的权值增加x:2 a,表示求结 ...
- idea奇葩问题汇总
1.用idea在tomcat里运行普通的springMVC项目,用nacos做为配置中心,通过@NacosValue来读取配置中心的值,配置了autoRefreshed = true但是不起作用,读取 ...
- 腾讯视频的手机端的地址和PC端的地址是不一样的
腾讯视频的手机端的地址和PC端的地址是不一样的,所以使用iframe的时候记得要使用手机端的地址
- vue 路由嵌套 及 router-view vue-router --》children
vue 路由嵌套 vue-router -->children 在项目的很多子页面中,我们往往需要在同一个页面做一个组件的切换,同时保存这个页面的部分数据(比如树形菜单),进而显示不同的数据 ...
- 《深入浅出WPF》学习总结之学前知识
一个WPF应用的组成结构 Properties:存放程序资源(图标.图片.静态字符串等) References:标记了当前项目需要引用哪些其他项目App.xmal:程序的主体.在Windows系统里, ...
- CentOS7 redhat7 linux系统1分钟安装Zabbix web 监控 服务器
一.准备工作OS:centos7.4Zabbix version:3.4.6(2018/1/15日上线的新版本)Database:MariaDB关闭防火墙:systemctl stop firewal ...
- HardFault_Handler
STM32程序一运行就进入HardFault_Handler,原因很可能是堆栈溢出 ]={}; // 我把程序中上面这句注释了就没事了 :进入HardFault_Handler也可能是数组越界引起的: ...
- 使用Vue开发微信小程序:mpvue框架
使用Vue开发微信小程序:mpvue框架:https://www.jianshu.com/p/8f779950bfd9