git cherry-pick使用总结
第一次在csdn发文章,还没找到节奏,请多多指教~
这次给大家介绍一下Git中常用的cherry-pick。
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
1.基础用法
首先看一下最简单的用法。
git cherry-pick <commit-id>
这个用法就是将目前仓库中已存在的某个提交A应用到当前分支。在应用成功以后,当前分支的HEAD引用变为A。
示例:切换到dev分支下,并将master分支中的C提交应用到dev分支:
![](/assets/blank.gif)
![](/assets/blank.gif)
如上图所示,当前仓库有两个本地分支:master和dev。其中master分支中有A,B,C,D 4个提交,dev分支有A,B,E,F 4个提交。
$ git checkout dev
Switched to branch 'dev'
$ git cherry-pick feca78f
[dev bc9f684] CDate: Sat Jan 19 20:46:31 2019 +08001 file changed, 1 insertion(+)create mode 100644 C
$ git log --oneline --abbrev-commit
bc9f684 (HEAD -> dev) C
14f4789 F
eeb02b1 E
9c0305c B
4cd0c6d A
此时通过gitk看到的提交图形是这样的:
![](/assets/blank.gif)
![](/assets/blank.gif)
2.阶进用法
2.1 -n
git cherry-pick -n <commit-id>
这个用法是将目前仓库中存在的某个提交应用到当前分支,但是不生成提交。需要通过commit才能产生新的提交。
例如,在前面将master分支上的提交C应用到dev分支后,继续将提交D应用到dev分支,但是在执行时携带-n操作。
$ git cherry-pick 0ed1d6c -n
//当前状态下并没有直接生成一个提交,而是在暂存区中存在D提交的内容。$ git status
On branch dev
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file: D//提交cherry-pick -n 后的D’提交
git commit -m "cherry-pickD"
[dev 6a3a121] cherry-pickD1 file changed, 1 insertion(+)create mode 100644 D$ git status
On branch dev
nothing to commit, working tree clean$ git log --oneline --abbrev-commit
6a3a121 (HEAD -> dev) cherry-pickD
bc9f684 C
14f4789 F
eeb02b1 E
9c0305c B
4cd0c6d A
2.2 -s
用法:
git cherry-pick -s <commit-id>
作用:在将某个提交A应用到当前分支后,在当前分支最新的提交message上加上作者信息。
示例:
//在master分支上创建一个新的提交
$ git checkout master
Switched to branch 'master'
$ echo "G">G
$ git add G
warning: LF will be replaced by CRLF in G.
The file will have its original line endings in your working directory
$ git commit -m "G"
[master e40c664] G1 file changed, 1 insertion(+)create mode 100644 G$ git checkout dev
Switched to branch 'dev'
//将master分支上的新提交应用到dev分支上
$ git cherry-pick e40c664 -s
[dev 48b886c] GDate: Sun Jan 20 10:50:53 2019 +08001 file changed, 1 insertion(+)create mode 100644 G$ git log
commit 48b886cdd77c9afe109a23f3c7a6aa877430f955 (HEAD -> dev)
Author: author<email>
Date: Sun Jan 20 10:50:53 2019 +0800GSigned-off-by: author<email>//作者信息
2.3 -x
用法:
git cherry-pick -x <commit-id>
作用:在应用提交时,git会在提交的原始信息中添加一行信息,表示"源于哪个提交"
示例:
//在master分支上创建一个新的提交
$ git checkout master
Switched to branch 'master'
$ echo "H">H
$ git add .
warning: LF will be replaced by CRLF in H.
The file will have its original line endings in your working directory
$ git commit -m "H"
[master 8143abe] H1 file changed, 1 insertion(+)create mode 100644 H$ git checkout dev
Switched to branch 'dev'
//将提交应用到dev分支上
$ git cherry-pick 8143abe -x
[dev de3e790] HDate: Sun Jan 20 10:57:52 2019 +08001 file changed, 1 insertion(+)create mode 100644 H
$ git log --abbrev-commit
commit de3e790 (HEAD -> dev)
Author: author<email>
Date: Sun Jan 20 10:57:52 2019 +0800H(cherry picked from commit 8143abedef64b2dc79f359117ffcff0449e50157)//源提交的commitIdcommit 48b886c
Author: author<email>
Date: Sun Jan 20 10:50:53 2019 +0800GSigned-off-by: author <email>//作者信息
2.4 -ff
用法:
git cherry-pick --ff <commit-id>
解释:如果当前正在应用的提交A的父提交P和当前分支的HEAD指向的提交H相同,那么使用fast-forward策略将HEAD快进到当前应用。
示例:
//从dev检出一个新分支dev2
$ git checkout -b dev2
Switched to a new branch 'dev2'
$ git log --oneline --abbrev-commit
de3e790 (HEAD -> dev2, dev) H
48b886c G
6a3a121 cherry-pickD
bc9f684 C
14f4789 F
eeb02b1 E
9c0305c B
4cd0c6d A//在新分支上新建提交
$ echo "I">I
$ git add .
warning: LF will be replaced by CRLF in I.
The file will have its original line endings in your working directory
$ git commit -m "I"
[dev2 b715b64] I1 file changed, 1 insertion(+)create mode 100644 I
$ git log --oneline --abbrev-commit
b715b64 (HEAD -> dev2) I
de3e790 (dev) H
48b886c G
6a3a121 cherry-pickD
bc9f684 C
14f4789 F
eeb02b1 E
9c0305c B
4cd0c6d A//切换回dev分支
$ git checkout dev
Switched to branch 'dev'
$ git log --oneline --abbrev-commit
de3e790 (HEAD -> dev) H
48b886c G
6a3a121 cherry-pickD
bc9f684 C
14f4789 F
eeb02b1 E
9c0305c B
4cd0c6d A
//执行--ff操作
$ git cherry-pick --ff b715b64
$ git log
commit b715b64f0ba65b2a656d73321b9cc4b1bd9581c4 (HEAD -> dev, dev2)
Author: author <email>
Date: Sun Jan 20 11:10:29 2019 +0800Icommit de3e7901cf5cbbd473b4fa43fa554eb4efa8b0e1
Author: author <email>
Date: Sun Jan 20 10:57:52 2019 +0800H(cherry picked from commit 8143abedef64b2dc79f359117ffcff0449e50157)commit 48b886cdd77c9afe109a23f3c7a6aa877430f955
Author: author <email>
Date: Sun Jan 20 10:50:53 2019 +0800GSigned-off-by: author <email>
2.5 -m
git cherry-pick -m 1 <commit-id>
解释:假设有一个提交A,是在dev3分支上合并了dev2分支时产生的提交。现在需要将A提交中来自与dev3分支的提交应用到dev4上时,通过指定-m的参数值实现该需求。-m后面的参数不超过合并时的分支数目。
//当前dev3最新提交时I,commit-id为b715b64
//现在要增加几个提交J、K、L、M$ echo "J">J
$ git add J
$ git commit J -m "J"
warning: LF will be replaced by CRLF in J.
The file will have its original line endings in your working directory
[dev3 c946df1] J1 file changed, 1 insertion(+)create mode 100644 J$ echo "K">K
$ git add K
warning: LF will be replaced by CRLF in K.
The file will have its original line endings in your working dir
$ git commit K -m "K"
warning: LF will be replaced by CRLF in K.
The file will have its original line endings in your working directory
[dev3 029496a] K1 file changed, 1 insertion(+)create mode 100644 K$ echo "L">L
$ git add L
warning: LF will be replaced by CRLF in L.
The file will have its original line endings in your working directory
$ git commit -m "L" L
warning: LF will be replaced by CRLF in L.
The file will have its original line endings in your working directory
[dev3 506067a] L1 file changed, 1 insertion(+)create mode 100644 L$ echo "M">M
$ git add M
warning: LF will be replaced by CRLF in M.
The file will have its original line endings in your working directory
$ git commit -m "M" M
warning: LF will be replaced by CRLF in M.
The file will have its original line endings in your working directory
[dev3 c02ef9d] M1 file changed, 1 insertion(+)create mode 100644 M//产生一个合并的提交
$ git merge dev2
Merge made by the 'recursive' strategy.B | 1 +C | 1 +D | 1 +E | 1 +F | 1 +G | 1 +H | 1 +I | 1 +8 files changed, 8 insertions(+)create mode 100644 Bcreate mode 100644 Ccreate mode 100644 Dcreate mode 100644 Ecreate mode 100644 Fcreate mode 100644 Gcreate mode 100644 Hcreate mode 100644 I//在合并的提交后面增加一个提交N
$ echo "N">N
$ git add N
warning: LF will be replaced by CRLF in N.
The file will have its original line endings in your working directory
$ git commit N -m "N"
warning: LF will be replaced by CRLF in N.
The file will have its original line endings in your working directory
[dev3 04c8735] N1 file changed, 1 insertion(+)create mode 100644 N//从主分支切出一个dev4分支,只包含主分支的第一个提交
$ git checkout master
Switched to branch 'master'
$ git checkout -b dev4 HEAD~5
Switched to a new branch 'dev4'
$ git log --abbrev-commit --oneline
4cd0c6d (HEAD -> dev4) A//将dev3分支中由从dev2分支合并而来的提交应用到当前分支,并且只应用dev3分支部分的代码
$ git cherry-pick -m 2 e1eda64
[dev4 2e37f16] Merge branch 'dev2' into dev3Date: Sun Jan 20 13:49:25 2019 +08004 files changed, 4 insertions(+)create mode 100644 Jcreate mode 100644 Kcreate mode 100644 Lcreate mode 100644 M$ git log --oneline --abbrev-commit
2e37f16 (HEAD -> dev4) Merge branch 'dev2' into dev3
4cd0c6d A//将dev3分支中由从dev2分支合并而来的提交应用到当前分支,并且只应用dev2分支部分的代码
//首先先移除刚刚应用到dev4的提交.
$ git reset HEAD~1 --hard
HEAD is now at 4cd0c6d A
//应用
$ git cherry-pick -m 1 e1eda64
[dev4 6104083] Merge branch 'dev2' into dev3Date: Sun Jan 20 13:49:25 2019 +08008 files changed, 8 insertions(+)create mode 100644 Bcreate mode 100644 Ccreate mode 100644 Dcreate mode 100644 Ecreate mode 100644 Fcreate mode 100644 Gcreate mode 100644 Hcreate mode 100644 I
2.6 --continue
用法:
git cherry-pick --continue
当执行cherry-pick指令发生冲突时,在解决冲突以后,先执行add执领,然后执行--continue指令,使cherry-pick操作成功,当前分支变为干净的分支,HEAD指向cherry-pick的提交。
2.7 --abort
用法
git cherry-pick --abort
解释:当执行cherry-pick发生冲突时,执行该指令可以放弃cherry-pick执行后引发的代码"合并",使得当前分支变为干净的分支,HEAD不变。
2.8 --quit
用法
git cherry-pick --quit
解释:放弃并清空cherry-pick失败或revert失败的操作,当前分支变为干净,并且HEAD不变。
2.9 <branchname>
git cherry-pick <branchname>
将branchname分支的最新提交应用到当前分支。
git cherry-pick使用总结相关推荐
- git cherry pick
直接将选定的其他分支的commit,提交到该分支上 不建议使用 git rebase --onto 使用cherry pick代替 http://weblog.avp-ptr.de/20120928/ ...
- IDEA git cherry pick 简单使用
cherry pick的作用: 参考了一些博客, eg: 参考博客1 参考博客2 再做了个小案例后,我目前的理解是,cherry pick的作用是将一个分支的部分提交/历史提交,可以合并到另外一个分支 ...
- 【git cherry pick冲突】
修好了bug愉快的打算commit提交的时候 看到提示语句是can not commit changes due to unresolved conflicts 在Android Studio中寻找图 ...
- idea cherry pick 功能 git log 窗口 冲突conflict
git log 窗口 参考 source tree cherry pick, merge conflict merge conflict 冲突 <<<<<<< ...
- [gitsourcetree]cherry pick和遴选的使用
前言 cherry pick. 拷贝其中的某一次提交记录. 本文就介绍一种更加快捷的方式 cherry pick. 介绍 此方法主要用于2分支分别独立维护的情况, 即某一分支已经上线了spring-2 ...
- 在gerrit上cherry pick多笔提交到一个仓库中
我们的要求是在dvr_service仓库上从其他分支cherry pick 两笔提交到release/b03chn_rel_sop_3_nobo分支 这两笔提交分别如图所示 如图所示,B02-5746 ...
- 1.Cherry Pick与Create Patch的区别
Cherry Pick与Create Patch的区别 结论 实验 场景1:应用时无冲突 场景2: 应用时产生冲突 使用cherry pick 使用patch 场景3:产生冲突,并且有其他文件的变更 ...
- gerrit cherry pick to merge code
开发中经常遇到,不同branch代码需要同步修改的问题, 通过gerrit cherry pick to功能可以方便的将已提交A Branch 的修改同步到B Branch上,提升工作效率
- Git 经常使用命令合集
====== Git 经常使用命令合集 ====== === 1.Git 文档 === Git 中文文档观看地址:http://git.oschina.net/progit/ === 2.G ...
- Git 报错:You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).Please, commit your changes
Git 报错 在 IDEA 中使用 Git 报错: You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).Please, ...
最新文章
- 【Android 高性能音频】高性能音频简介 ( 高性能音频问题引入 | 使用场景 | 相关开发库及技术 )
- 最像windows10的linux,Linuxfx:外观神似Win10的Linux操作系统
- couchdb java 连接_CouchDB客户端连接的说明---Java版
- 阿里大数据分析与应用(part5)--QuickBI
- python处理word文档保留格式_python 处理document文档 保留原样式
- html5中音乐播放器怎么写,打造属于自己的音乐播放器 HTML5之audio标签
- RobotFramework自动化测试框架的基础关键字(五)
- java showinputdialog_java - JOptionPane.showInputDialog中的多个输入
- [开心学php100天]第五天:string函数(上)
- 业务复杂就用 if-else?刚来的技术大佬用这招彻底干掉了!
- 机器学习基础(二十八) —— 数据规格化
- unix和linux命令_在Linux / UNIX中查找命令
- 海外php程序员,国外PHP程序员的13个好习惯_php
- 93. php 命名空间(3)
- Netty实战中英文版
- Pr 入门教程:如何向影片中的剪辑添加过渡效果?
- YOUTUBE API调用 JAVA
- 关于Odoo盘盈成本和计价法的讨论
- 在DeSmuME模拟器上成功运行AK2i的内核,破解AK2i命令集
- (转)走进全球CTA领导者:元盛资本(Winton CapitalManagement)