Git Cherry-pick使用

概述

无论项目大小,当你和一群程序员一起工作时,处理多个 Git 分支之间的变更都会变得很困难。有时,与其把整个 Git 分支合并到另一个分支,不如选择并移动几个特定的提交。这个过程被称为 "挑拣", 即 Cherry-pick。

本文将介绍 "Cherry-pick" 的内容、原因和方法。

让我们开始吧~

什么是 Cherry-pick?

通过 cherry-pick 命令,Git 可以将任何分支中的选定提交合并到当前的 Git HEAD 分支中。

在执行 git mergegit rebase 时,一个分支的所有提交都会被合并。而 cherry-pick 命令则允许你选择单个提交进行整合。

区别图示如下:

使用 merge 或 rebase 的情况 △ 使用 merge 的情况: 在执行 merge 或 rebase 时,一个分支的所有提交都会被整合。

使用 cherry-pick 的情况 △ 使用 cherry-pick 的情况: 允许你选择个别提交进行整合。在本例中,只有 C2 被整合到主分支,而不是 C4。

为什么要用 Cherry-pick?

下面的情况可能更容易理解 "Cherry-pick" 的作用。

想象一下,您正在为即将到来的每周 spring 实施新功能。代码准备就绪后,您将把它推送到远程分支,准备进行测试。

然而,客户并不满意所有的修改,要求你只提交某些修改。因为客户还没有批准下次发布的所有修改,所以 git rebase 不会产生预期的结果。因为 git rebasegit merge 会将上一次冲刺的所有调整都纳入其中。

而 "Cherry-pick" 就能解决这个问题!因为 "Cherry-pick" 只关注提交中添加的改动,所以它只会带来已批准的改动,而不会添加其他提交。

使用 "Cherry-pick" 还有其他一些原因:

  • 这对修复 bug 非常重要,因为开发分支中的 bug 都是用它们的提交设置的。
  • 通过使用 git cherry-pick,而不是其他应用指定提交的改动的选项(如 git diff),可以避免不必要的争斗。
  • 如果因为各 Git 分支的版本不兼容而无法进行完整的分支合并,它就是一个很有用的工具。

什么时候用 Cherry-pick?

简而言之就是:尽量少用。之所以要尽量少用 cherry-pick,是因为它很容易产生 "重复"提交:当你使用 cherry-pick 将一个提交整合到 HEAD 分支时,Git 必须创建一个内容完全相同的新提交。不过,这是一个全新的提交对象,有自己的 SHA 标识符。同时也会失去跟踪提交历史的能力。

如果你不按顺序提交了很多提交,这些提交就会被记录在你的分支中,这可能会导致你的 Git 分支出现不理想的结果。

只要能用传统的合并或重置来整合,就应该这么做。Cherry-pick 应保留给不可能这样做的情况,例如必须创建 Hotfix 或只想从一个废弃的分支中保存一个或几个提交。

如何使用 Cherry-pick 命令?

流程概述

下面是使用步骤:

  1. 拉取本地分支。使用 git fetch
  2. 回到要合并的分支。你可能会通过运行 git checkout main 来做到这一点。
  3. 找到要拉入分支的提交。转到 git log,为每条提交获取唯一的提交哈希值。
  4. "Cherry-pick" 您想要加入该分支的提交。运行以下命令:git cherry-pick <commit sha>。这将只把这个提交拉入当前分支。
  5. (可选) 在某些情况下, 可能需要手动解决冲突.
  6. 像往常一样推送这个分支: git push origin main

具体命令

cherry-pick 命令的最简单形式中,你只需使用要集成到当前 HEAD 分支中的提交的 SHA 标识符即可。

要获取提交哈希值,可以使用 git log 命令:

git log --oneline

知道 commit 的哈希值后,就可以使用 cherry-pick 命令。

语法如下:

git cherry-pick <commit sha>

📝Notes:

<commit sha> 可以是多个

例如:

git cherry-pick  85c5532

这将把指定的更改专用于当前已签出的分支。

如果你想做进一步修改,也可以指示 Git 在你的工作副本中添加提交改动。

语法如下:

git cherry-pick <commit sha> --no-commit

如:

git cherry-pick 85c5532 --no-commit

如果您想同时选择多个提交,请添加它们的提交哈希值,中间用空格隔开:

git cherry-pick hash1 hash3

在挑选提交时,不能使用 git pull 命令,因为它会从一个版本库中获取提交并自动合并到另一个版本库中。cherry-pick 命令是专门用来避免这种情况发生的工具;取而代之的是使用 git fetch,它会获取提交但不应用它们。

Cherry-pick 实战

要尝试该过程,请启动终端并生成一个示例项目:

mkdir fruit.git
cd fruit.git
git init .

创建一些数据并提交:

echo "Kiwifruit" > fruit.txt
git add fruit.txt
git commit -m 'First commit'

现在,创建一个项目的 fork 来代表远程开发者:

mkdir ~/fruit.fork
cd !$
echo "Strawberry" >> fruit.txt
git add fruit.txt
git commit -m 'Added a fruit"

这是一个有效的提交。现在,创建一个糟糕的提交,代表你不想合并到项目中的内容:

echo "Rhubarb" >> fruit.txt
git add fruit.txt
git commit -m 'Added a vegetable that tastes like a fruit"

返回你的权威版本库,从你假想的开发者那里获取提交(使用 git fetch 获取):

$ cd ~/fruit.git
$ git remote add dev ~/fruit.fork
$ git fetch dev
remote: Counting objects: 6, done. 
remote: Compressing objects: 100% (2/2), done. 
remote: Total 6 (delta 0), reused 0 (delta 0) 
Unpacking objects: 100% (6/6), done...
$ git log –oneline dev/master
e858ab2 Added a vegetable that tastes like a fruit 
0664292 Added a fruit 
b56e0f8 First commit

你已经从假想的开发者那里获取了提交,但还没有将它们合并到你的版本库中。你想接受第二个提交,但不想接受第三个,所以要使用 cherry-pick

git cherry-pick 0664292

现在,第二个提交就在你的版本库中:

$ cat fruit.txt
Kiwifruit
Strawberry

将更改推送到远程服务器,就大功告成了!

Cherry-pick 多个提交实战

从 dev 挑选数个 commits 进行合并:

git cherry-pick  85c5532  366a196  53ebe44 --no-commits

然后, 可能第一个合并会出现冲突, 手动解决冲突, 并git add 具体文件或 git rm.

继续 cherry-pick:

git cherry-pick --continue

第二个提交可能没有冲突, 直接合并.

第三个提交可能又有冲突, 手动解决冲突, 并git add 具体文件或 git rm.

继续 cherry-pick:

git cherry-pick --continue

最后再执行 git cherry-pick --continue, 会提示你没有在运行的任务.

此时, 可以提交:

git push origin main

总结

Cherry-pick 是一个功能强大的命令,如果没有正确理解可能发生的情况,使用它可能会带来麻烦。不过,当你搞砸并提交到错误的分支时,它可能会拯救你的生命(至少是你的日常工作)。

📚️参考文档

  • What is Git cherry-picking? | Opensource.com
  • How to merge only specific commits from a pull request with git cherry-pick | MattStauffer.com
  • Git Cherry Pick - How to use the "cherry-pick" command in Git | Learn Version Control with Git

三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/32938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue3】解决scope.row.id套标签太多无法随着点击按钮而变化

实现要求:再点击每一行的修改按钮时&#xff0c;动态拿取该行的id传给后端作为pk(主键)实现数据库数据的修改&#xff0c;并显示在vue前端&#xff1b; 我遇到的问题&#xff1a;在2处使用 scope 作用域插槽拿取每一行的数据&#xff0c;在3处&#xff0c;删除按钮那一行代码&a…

19. python从入门到精通——Web编程

HTTP协议 HTTP协议的常用方法 方法 描述 GET 请求指定的页面信息&#xff0c;并返回实体主体。 POST 向指定资源提交数据进行处理请求&#xff08;例如提交表单或者上传文件&#xff09;。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 …

如何高效解决“字符串相乘“问题?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ >&#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 金句分…

笔记本电脑如何把sd卡数据恢复

在使用笔记本电脑过程中&#xff0c;如果不小心将SD卡里面的重要数据弄丢怎么办呢&#xff1f;别着急&#xff0c;本文将向您介绍SD卡数据丢失常见原因和恢复方法。 ▌一、SD卡数据丢失常见原因 - 意外删除&#xff1a;误操作或不小心将文件或文件夹删除。 - 误格式化&#…

Java分布式微服务3——Docker

文章目录 Docker介绍安装DockerDocker基础操作Docker服务的启动镜像命令容器命令1. 从docker hub去查看Nginx容器的运行命令2. 查看所有容器状态3. 查看容器日志4. 进入Nginx容器执行命令&#xff0c;修改Html内容&#xff0c;添加“Hello World”5. 停止与开始容器6. 删除容器…

【MySQL】InnoDB存储引擎详解

InnoDB引擎是MySQL5.5版本之后默认的存储引擎 逻辑存储结构 首先是表空间Tablespace&#xff08;ibd文件&#xff09;&#xff1a;一个mysql实力可以对应多个表空间&#xff0c;用于存储及记录&#xff0c;索引等数据 这些存储记录&#xff0c;索引等数据中是用段(Segment)来…

【PDF密码】PDF文件不能打印,为什么?

正常的PDF文件是可以打印的&#xff0c;如果PDF文件打开之后发现文件不能打印&#xff0c;我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

AWS——03篇(AWS之Amazon S3(云中可扩展存储)-01入门)

AWS——03篇&#xff08;AWS之Amazon S3&#xff08;云中可扩展存储&#xff09;-01入门&#xff09; 1. 前言2. 关于 Amazon S32.1 介绍2.1.1 简述2.1.2 详细介绍 2.2 Amazon S3 好处和功能2.3 3. 创建S3存储桶3.1 创建存储桶3.2 修改访问权限 4. 简单实用4.1 上传图片文件4.2…

iOS 实现图片高斯模糊效果

效果图 用到了 UIVisualEffectView 实现代码 - (UIVisualEffectView *)bgEffectView{if(!_bgEffectView){UIBlurEffect *blur [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];_bgEffectView [[UIVisualEffectView alloc] initWithEffect:blur];}return _bgEffect…

数据结构:栈的实现(C实现)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》 文章目录 前言一、栈的实现思路1. 结构的定义2. 初始化栈(StackInit)3. 入栈(StackPush)4. 出栈(StackPop)5. 获取栈顶元素(StackTop)6. 检查栈是否为空(StackEmpty)7. 销毁栈(StackDestroy) 二、…

UNIX网络编程卷一 学习笔记 第二十七章 IP选项

IPv4允许在20字节的首部固定部分后跟最多共40字节的选项。尽管已经定义了10种IPv4选项&#xff0c;但最常用的是源路径选项。我们可通过存取IP_OPTIONS套接字选项访问这些选项&#xff0c;我们存取该套接字选项时&#xff0c;所用的缓冲区中的值就是它们置于IP数据报中的格式。…

在QT及VS运行包含opencv的cmakelists实例

本文分享如何利用QT和Visual Studio运行cmake组织管理的程序&#xff0c;也就是运行cmakelists.txt。 main和cmakelists内容 main和cmakelists文件路径如下&#xff1a; main.cpp #include<opencv2/opencv.hpp> #include<iostream> #include <string> usi…

Linux:Shell编程之正则表达式

目录 绪论 1、正则表达式 1.1 通配符 1.2 正则表达式分类 1.3 基本正则 1.4 正则表达式中表示次数的表达式 1.5 位置锚定 1.5.1 词首锚定和词尾锚定 1.6 分组&#xff08;&#xff09; 1.7 逻辑或 1.8 扩展正则 绪论 正则表达式&#xff1a;有一类特殊字符以及文本…

Debian安装和使用Elasticsearch 8.9

命令行通过 .deb 包安装 Elasticsearch 创建一个新用户 adduser elastic --> rust # 添加sudo权限 # https://phoenixnap.com/kb/how-to-create-sudo-user-on-ubuntu usermod -aG sudo elastic groups elastic下载Elasticsearch v8.9.0 Debian 包 https://www.elastic.co/…

YOLOv5基础知识入门(3)— 目标检测相关知识点

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLO算法发展历程和YOLOv5核心基础知识学习完成之后&#xff0c;接下来我们就需要学习目标检测相关知识了。为了让大家后面可以顺利地用YOLOv5进行目标检测实战&#xff0c;本节课就带领大家学习一下目标检测的基础知识点&…

使用Javassist实现热修复

工程目录图 请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 代码&#xff1a;LearnRobustFix

数据结构篇七:排序

文章目录 前言1.插入排序1.1 基本思想1.2 代码实现1.3 特性总结 2.希尔排序2.1 基本思想2.2 代码实现2.3 特性总结 3. 选择排序3.1 基本思想3.2 代码实现3.3 特性总结 4. 堆排序4.1 基本思想4.2 代码实现4.3 特性总结 5. 冒泡排序5.1 基本思想5.2 代码实现5.3 特性总结 6. 快速…

LeetCode 33题:搜索旋转排序数组

目录 题目 思路 代码 暴力解法 分方向法 二分法 题目 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 …

提速Rust编译器!

Nethercote是一位研究Rust编译器的软件工程师。最近&#xff0c;他正在探索如何提升Rust编译器的性能&#xff0c;在他的博客文章中介绍了Rust编译器是如何将代码分割成代码生成单元&#xff08;CGU&#xff09;的以及rustc的性能加速。 他解释了不同数量和大小的CGU之间的权衡…

考虑微网新能源经济消纳的共享储能优化配置(Matlab代码实现

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…