第一次在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分支:

图1

图2

如上图所示,当前仓库有两个本地分支: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看到的提交图形是这样的:

图3

图4

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使用总结相关推荐

  1. git cherry pick

    直接将选定的其他分支的commit,提交到该分支上 不建议使用 git rebase --onto 使用cherry pick代替 http://weblog.avp-ptr.de/20120928/ ...

  2. IDEA git cherry pick 简单使用

    cherry pick的作用: 参考了一些博客, eg: 参考博客1 参考博客2 再做了个小案例后,我目前的理解是,cherry pick的作用是将一个分支的部分提交/历史提交,可以合并到另外一个分支 ...

  3. 【git cherry pick冲突】

    修好了bug愉快的打算commit提交的时候 看到提示语句是can not commit changes due to unresolved conflicts 在Android Studio中寻找图 ...

  4. idea cherry pick 功能 git log 窗口 冲突conflict

    git log 窗口 参考 source tree cherry pick, merge conflict merge conflict 冲突 <<<<<<< ...

  5. [gitsourcetree]cherry pick和遴选的使用

    前言 cherry pick. 拷贝其中的某一次提交记录. 本文就介绍一种更加快捷的方式 cherry pick. 介绍 此方法主要用于2分支分别独立维护的情况, 即某一分支已经上线了spring-2 ...

  6. 在gerrit上cherry pick多笔提交到一个仓库中

    我们的要求是在dvr_service仓库上从其他分支cherry pick 两笔提交到release/b03chn_rel_sop_3_nobo分支 这两笔提交分别如图所示 如图所示,B02-5746 ...

  7. 1.Cherry Pick与Create Patch的区别

    Cherry Pick与Create Patch的区别 结论 实验 场景1:应用时无冲突 场景2: 应用时产生冲突 使用cherry pick 使用patch 场景3:产生冲突,并且有其他文件的变更 ...

  8. gerrit cherry pick to merge code

    开发中经常遇到,不同branch代码需要同步修改的问题, 通过gerrit cherry pick to功能可以方便的将已提交A Branch 的修改同步到B Branch上,提升工作效率

  9. Git 经常使用命令合集

    ====== Git 经常使用命令合集 ====== === 1.Git 文档 === Git 中文文档观看地址:http://git.oschina.net/progit/      === 2.G ...

  10. 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, ...

最新文章

  1. 【Android 高性能音频】高性能音频简介 ( 高性能音频问题引入 | 使用场景 | 相关开发库及技术 )
  2. 最像windows10的linux,Linuxfx:外观神似Win10的Linux操作系统
  3. couchdb java 连接_CouchDB客户端连接的说明---Java版
  4. 阿里大数据分析与应用(part5)--QuickBI
  5. python处理word文档保留格式_python 处理document文档 保留原样式
  6. html5中音乐播放器怎么写,打造属于自己的音乐播放器 HTML5之audio标签
  7. RobotFramework自动化测试框架的基础关键字(五)
  8. java showinputdialog_java - JOptionPane.showInputDialog中的多个输入
  9. [开心学php100天]第五天:string函数(上)
  10. 业务复杂就用 if-else?刚来的技术大佬用这招彻底干掉了!
  11. 机器学习基础(二十八) —— 数据规格化
  12. unix和linux命令_在Linux / UNIX中查找命令
  13. 海外php程序员,国外PHP程序员的13个好习惯_php
  14. 93. php 命名空间(3)
  15. Netty实战中英文版
  16. Pr 入门教程:如何向影片中的剪辑添加过渡效果?
  17. YOUTUBE API调用 JAVA
  18. 关于Odoo盘盈成本和计价法的讨论
  19. 在DeSmuME模拟器上成功运行AK2i的内核,破解AK2i命令集
  20. (转)走进全球CTA领导者:元盛资本(Winton CapitalManagement)

热门文章

  1. 1、什么是软件危机?它是哪些典型表现?为什么会出现软件危机?
  2. 揭秘seo快排原理,seo快排流量
  3. 京东网页端顶部导航HTML代码
  4. Bash命令光标移动和编辑
  5. 老罗与西门子的公关战争
  6. localhost拒绝连接解决办法
  7. 防火墙双机热备升级步骤
  8. 计算机绘图中有六种方法绘圆,绘图用品和制图方法
  9. usereduce reducer使用
  10. html5自助建站源码,疯狂原始人