git cherry-pick使用总结

2023-10-31

第一次在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
图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] C
 Date: Sat Jan 19 20:46:31 2019 +0800
 1 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-pickD
 1 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] G
 1 file changed, 1 insertion(+)
 create mode 100644 G

$ git checkout dev
Switched to branch 'dev'
//将master分支上的新提交应用到dev分支上
$ git cherry-pick e40c664 -s
[dev 48b886c] G
 Date: Sun Jan 20 10:50:53 2019 +0800
 1 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 +0800

    G

    Signed-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] H
 1 file changed, 1 insertion(+)
 create mode 100644 H


$ git checkout dev
Switched to branch 'dev'
//将提交应用到dev分支上
$ git cherry-pick 8143abe -x
[dev de3e790] H
 Date: Sun Jan 20 10:57:52 2019 +0800
 1 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 +0800

    H

    (cherry picked from commit 8143abedef64b2dc79f359117ffcff0449e50157)//源提交的commitId

commit 48b886c
Author: author<email>
Date:   Sun Jan 20 10:50:53 2019 +0800

    G

    Signed-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] I
 1 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 +0800

    I

commit de3e7901cf5cbbd473b4fa43fa554eb4efa8b0e1
Author: author <email>
Date:   Sun Jan 20 10:57:52 2019 +0800

    H

    (cherry picked from commit 8143abedef64b2dc79f359117ffcff0449e50157)

commit 48b886cdd77c9afe109a23f3c7a6aa877430f955
Author: author <email>
Date:   Sun Jan 20 10:50:53 2019 +0800

    G

    Signed-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] J
 1 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] K
 1 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] L
 1 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] M
 1 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 B
 create mode 100644 C
 create mode 100644 D
 create mode 100644 E
 create mode 100644 F
 create mode 100644 G
 create mode 100644 H
 create 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] N
 1 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 dev3
 Date: Sun Jan 20 13:49:25 2019 +0800
 4 files changed, 4 insertions(+)
 create mode 100644 J
 create mode 100644 K
 create mode 100644 L
 create 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 dev3
 Date: Sun Jan 20 13:49:25 2019 +0800
 8 files changed, 8 insertions(+)
 create mode 100644 B
 create mode 100644 C
 create mode 100644 D
 create mode 100644 E
 create mode 100644 F
 create mode 100644 G
 create mode 100644 H
 create 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分支的最新提交应用到当前分支。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git cherry-pick使用总结 的相关文章

  • git 如何在不同分支中保持不同的配置文件?

    请允许我先表达一下我的尝试 假设我有两个分支 Alice1 和 Alice2 Alice1 有自己的服务器 Alice2 也有自己的服务器 我希望能够签出 Alice1 编写我的代码 然后通过使用保存在 URL 配置文件中的 URL 直接推
  • Git 将分支从一个远程推送到另一个远程?

    我设置了以下遥控器 git remote korg rorg 以及以下分支 git branch a no branch remotes korg gingerbread remotes korg gingerbread release r
  • 我如何知道哪些文件已在 git 中标记为“假设未更改”

    这个答案 https stackoverflow com a 936325 554807向您展示如何将 git 管理的文件标记为 我不希望从该文件的存储库进行更改 IE 拥有该文件的您自己的本地未跟踪版本 即使它仍然受到 git 的修订控制
  • 如何从另一个目录使用git?

    假设有如下文件夹结构 repos repo1 lt here is git repository I do cd repos 我现在如何使用存储库 repo1仍然在repos目录 我不想做 cd repo1 git status git c
  • 读取 git 的最后一次提交和提交号

    在使用Git源代码的maven项目中 每当我使用maven编译构建时 是否可以读取git的最后一次提交和提交号 我想使用该提交编号来找到最后一次提交 这是假设您想要读取该信息 然后将其存储在属性文件中 基于https github com
  • 在 Git 中查看已删除的文件

    我已使用 Git 删除了一个文件 然后又提交了 因此该文件不再位于我的工作副本中 我想查看该文件的内容 但不想真正恢复它 我怎样才能做到这一点 git show HEAD path to file 您可以使用显式提交标识符或HEAD n查看
  • 如何更改我的 Github Pages 默认 index.html 位置?

    我已经尝试过以下线程中显示的内容 我可以将我的 Github Pages index html 放在存储库的子文件夹中吗 https stackoverflow com questions 25320356 can i have my gi
  • ClearCase 到 Git 的迁移

    我们正在努力将 CC Vobs 转换为 GIT 我们有基础 vobs 和 UCM vobs 我见过很多没有明确步骤的主题 有没有什么工具或步骤可以保留历史记录和分支 不 据我所知 没有 ClearCase 到 Git 的桥梁 转换器或适配器
  • 合并两个github帐户

    假设我有两个 github 帐户xyz 邮件 ID email protected cdn cgi l email protection and abc email protected cdn cgi l email protection
  • 撤消 git pull,如何将存储库恢复到旧状态

    有什么方法可以恢复或撤消 git pull 以便我的源 存储库将恢复到执行 git pull 之前的旧状态 我想这样做是因为它合并了一些我不想这样做的文件 但只合并了其他剩余的文件 那么 我想找回这些文件 可以吗 编辑 我想撤消 git m
  • 是否有一个 Git 命令可以在推送到 master 之前添加通知/警告

    我有一个用例 其他人依赖我在从 master 下拉时没有启用标志 但我需要在本地处理存储库时启用它 我希望 希望 Git 有一种方法可以添加通知或警告 当请求推送到 master 时会触发 作为某种 提醒 所以也许我的工作流程可能是这样的
  • 在 Jenkins API 中,有没有办法找到上次构建的 git 提交?

    我想编写一个脚本来自动创建热修复的功能分支 为了做到这一点 我需要弄清楚如何查看当前构建中的最后一次提交 有没有办法从 Jenkins API 获取最后一次提交 git checkout b hotfix
  • 为什么我必须使用“git commit -a”而不仅仅是“git commit”?

    我正在尝试了解 Git 的复杂性 我使用 git clone url here 从 GitHub 上下载了一个存储库 我做了一些更改 尝试使用 git commit 来提交它们 这似乎没有将更改推送到我的本地存储库 在本地目录 git 中
  • 创建 Git 标签时自动运行 Git hook

    是否有一个 Git 钩子可以在添加新的 Git 标签时执行 因为我想自动将新的 Git 标签名称写入文本文件 您知道如何执行此操作吗 虽然目前无法使用挂钩 但您始终可以创建一个简单的脚本 mytag sh bin sh z 1 git ta
  • 用于跟踪远程分支的 Git 子模块

    我正在尝试使用 git 子模块将 10 多个存储库聚合到一个结构中 以便于开发 它应该克隆模块并签出分支 相反 模块以分离头模式检出 git clone email protected cdn cgi l email protection
  • gnutls_handshake() 失败:握手失败 GIT

    一切都工作正常 但突然我收到错误 致命 无法访问 https 电子邮件受保护 cdn cgi l email protection name repo name git gnutls handshake 失败 握手失败 我在我的计算机和 E
  • 如何在 Mac OS X 10.9 上安装和使用最新的 Git?

    我从 sourceforge 下载了 Git 2 4 3http git scm com download mac http git scm com download mac对于我的 Macbook Pro OS X 10 9 5 然后安装
  • git 可以知道你当前的分支是从哪个分支分支出来的吗?

    我想创建一个 git 别名 让我可以从其分支的原始分支同步我的分支 例如 如果我从
  • Git - 致命:无法获取当前工作目录?

    When I git clone从回购协议中 我得到 fatal Could not get current working directory No such file or directory 我该怎么办 我检查了服务器并发现 git文
  • 如何将Github中的develop分支设置为默认分支而不是master?

    我知道这可以在存储库的管理页面上完成 可以在那里设置另一个默认分支 这就是这个问题的答案 但我发现 也许是一个错误 以下内容 如果你的master分支和develop分支完全相同 那么git克隆将不会克隆默认的 develop 分支 但仍然

随机推荐

  • npx mkdirp命令

    npx是什么 npx 是 npm v5 2 0引入的一条命令 更方便开发者使用包内提供的命令行工具 ep1 npm原方式 npm install g create react app create react app my app npx方
  • 行为型模式-状态模式(State)

    概述 当一个对象的内在状态改变时允许改变其行为 这个对象看起来像是改变了其类 定义 状态模式的核心理念就是将不同状态对应的行为封装到状态中 在状态变化时改变依赖状态对象的行为 那种在一个方法内对状态进行多重判断的方式 虽然可以根据不同的状态
  • Android系统启动流程(八)——Launcher启动

    1 概述 Launcher是Android的桌面应用 也是一个系统初始化完成之后自动拉起的应用 Launcher会在SystemServer进程初始化完成之后 在ActivityManagerService的systemReady方法中开始
  • 图算法(二十五):子图匹配(Subgraph Matching)【基本的图查询操作,意在发掘图重要的子结构】【适用场景:社交网络分析、群体发现、异常检测】【在一个给定的大图里找到与给定小图同构的子图】

    一 概述 子图匹配 subgraph matching 算法的目的是在一个给定的大图里面找到与一个给定小图同构的子图 这是一种基本的图查询操作 意在发掘图重要的子结构 适用场景 子图匹配 subgraph matching 算法适用于社交网
  • Routh-Hurwitz Criterion 劳斯稳定判据

    Routh Hurwitz Criterion 为什么仅仅要有一个极点在右半平面 那么系统就不会稳定 比如H s 1 s 1 1 s 3 1 s 2 这里有个极点s 2 在有半平面 通过laplace 反变换能够知道 当时间足够长的时候 A
  • [Unity]Crest Ocean System增加海面透明度

    原因 插件没有设置海面透明度的功能 修改shader可以修改透明度 解决方案 关键代码 Shader Ocean shader Shader Crest Ocean SubShader Pass half4 Frag const Varyi
  • FreeSwitch模式:Inbound和Outbound的区别

    14 Inbound和Outbound Outbound模式相较于嵌入式语言相比更强大 适合控制单腿的呼叫 实现复杂的IVR应用 而Inbound更适合接收所有的事件 与多条腿进行交互 进行更复杂的呼叫控制 其中 在Outbound模式中
  • 面试系列之线程篇

    线程和进程 进程是资源分配和调度的最小独立单元 线程是CPU调度的基本单元 一个进程可以包含多个线程 多个线程共享该进程的资源 线程可以看作是轻量级的进程 进程间通信的方式 volatile synchronized wait notify
  • 字符串学习&总结(感觉主要是总结模板)

    目录 前言 一 哈希 导读 HASH模板 哈希 双哈希 hash应用 hash牛逼克拉斯 0 核心操作 求子串哈希值 1 字符串匹配 2 允许k次失配的字符串匹配 3 最长回文子串 hash操作简单 可解决的问题有点多啊 nice 4 最长
  • 深入理解 RPC : 基于 Python 自建分布式高并发 RPC 服务

    RPC Remote Procedure Call 服务 也即远程过程调用 在互联网企业技术架构中占据了举足轻重的地位 尤其在当下微服务化逐步成为大中型分布式系统架构的主流背景下 RPC 更扮演了重要角色 Google 开源了 gRPC F
  • Grpc demo java 实现

    环境 JDK8 Maven3 6 3 我的 Grpc java demo https github com 999bug grpc java 记得star 搭建步骤 1 利用代码编译器创建maven 项目 2 添加依赖坐标
  • python自动化之models 进阶操作二

    PUBLIC METHODS THAT ALTER ATTRIBUTES AND RETURN A NEW QUERYSET def all self 获取所有的数据对象 def filter self args kwargs 条件查询 条
  • hive--分组排序函数

    分组排序 最主要的区别就是如果两个分数相同 排名是否同列以及排名是否相同 这个方法仅在mysql8 0以后 hive或其他数据库支持 直接看图 原始表 原表如上 想要的结果如下 从图中可以发现 row number函数 如果并列但名次反而不
  • (四十四)数据字典-树状treeview树的实现

    数据字典 treeview树的实现 什么是数据字典 顾名思义数据字典 数据 字典 字典是用来查询东西的 所以数据字典就是描述数据信息的集合 数据字典是一种通用的程序设计方法 程序中有很多主体 每个主体的都有很多属性 每种属性都有很多取值并且
  • Python中的变量与常量

    目录标题 一 变量 1 什么是变量 2 python代码中变量的展示和练习 3 用画图的形式展示变量 变量值与内存之间的关系 二 常量 1 什么是常量 2 python中的常量 一 变量 1 什么是变量 程序运行过程中 值会发生变化的量 也
  • xshell连接centos7虚拟机时显示SSH服务器拒绝了密码

    xshell连接centos7虚拟机时显示SSH服务器拒绝了密码 这个问题可能有以下几个原因 1 SSH服务未启动或未安装 在CentOS上安装SSH服务 可以使用以下命令 sudo yum install openssh server 然
  • xp服务器文档在哪里设置密码,xp ftp服务器设置密码

    xp ftp服务器设置密码 内容精选 换一换 登录Windows操作系统的弹性云服务器时 需使用密码方式登录 因此 用户需先根据创建弹性云服务器时使用的密钥文件 获取该弹性云服务器初始安装时系统生成的管理员密码 Administrator帐
  • Visual Studio2019中源文件 <bits/stdc++.h>无法打开解决方法

    在Visual Studio2019中创建stdc h文件 将下面代码保存文件当中 C includes used for precompiling C Copyright C 2003 2015 Free Software Foundat
  • MySQL介绍,SQL入门及表结构分析

    数据库分类 关系型数据库 SQL 通过表与表之间 行与列之间的关系去存储数据 如MySQL Oracle 两者本质都是DBMS 数据库管理系统 非关系型数据库 No SQL意为Not only SQL 通过对象自身属性去存储 如Redis
  • git cherry-pick使用总结

    第一次在csdn发文章 还没找到节奏 请多多指教 这次给大家介绍一下Git中常用的cherry pick cherry pick的作用 将现有的某个提交应用到当前分支上 git cherry pick edit n m parent num