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到上次的提交,然后复制要 ...
随机推荐
- (selenium+python)_UI自动化01_Mac下selenium环境搭建
前言 Selenium 是一个用于Web网页UI自动化测试的开源框架,可以驱动浏览器模拟用户操作.支持多种平台(Windows.Mac OS.Linux)和多种浏览器(IE.Firefox.Chrom ...
- 剑指offer--day09
1.1 题目:栈的压入.弹出序列:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列 ...
- 腾讯视频的手机端的地址和PC端的地址是不一样的
腾讯视频的手机端的地址和PC端的地址是不一样的,所以使用iframe的时候记得要使用手机端的地址
- ElasticSearch 基础 1
ElasticSearch 基础=============================== 索引创建 ========================== 1. RESTFUL APIAPI 基本 ...
- python+selenium元素定位之CSS学习01
参考文档:https://www.w3school.com.cn/cssref/css_selectors.asp 选择器 例子 例子描述 CSS .class .intro 选择 class=&qu ...
- python列表-使用
一.列表用于循环 1.for循环 2. in 和 not in 3.多重赋值
- jQuery淡入淡出瀑布流效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ssh传文件
#coding=utf-8 import paramiko transport = paramiko.Transport(('192.168.70.129',22)) transport.connec ...
- Gos: Armed Golang 💪
Gos: Armed Golang
- http请求报文格式(请求行、请求头、空行 和 请求包体)和响应报文格式(状态行、响应头部、空行 和 响应包体)
转载 出处 超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议.HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求 ...