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…

python函数、运算符等简单介绍2(无顺序)

list&#xff08;列表&#xff09; 列表是Python的一种内置数据类型&#xff0c;列表是可以装各种数据类 型的容器 # 第一种list创建方式 list_name [晓东,小刚,明明,小红,123,123.4,123] print(list_name) print(type(list_name)) # 输出结果&#xff1a; [晓东, 小刚, 明明…

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

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

make/makefile/cmake/nmake

最近&#xff0c;有没有被make、cmake、makefile... ... 这些东西绕晕了&#xff0c;看看下面的文章&#xff0c;也许就可以理解清楚了。 1. gcc 它是GNU Compiler Collection&#xff08;就是GNU编译器套件&#xff09;&#xff0c;也可以简单认为是编译器&#xff0c;它可以…

微信ipad实现批量添加联系人及批量分组

GEWE框架官方网站 geweapi.com 点击访问即可 搜索 小提示&#xff1a; 添加联系人必要接口搜索返回的V3 V4用于添加联系人 请求URL&#xff1a; http://域名地址/api/contacts/search 请求方式&#xff1a; POST 请求头&#xff1a; Content-Type&#xff1a;application/…

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

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

MariaDB 10.11.4 安装教程(zip格式,Windows环境)

前言 MariaDB 10.11.4 这个版本是目前最新的长期支持版&#xff0c;下面来安装下 下载 官网&#xff1a;MariaDB 10.11.4 打开上面链接&#xff0c;点Download 安装 解压缩下载的 zip 文件&#xff0c;到 bin 目录&#xff0c;管理员运行cmd&#xff0c;执行如下命令 mys…

UNET 架构综合指南 | 掌握图像分割--附源码

介绍 在令人兴奋的计算机视觉主题中,图像包含许多秘密和信息,区分和突出显示项目至关重要。图像分割是将图像分割成有意义的区域或对象的过程,在从医学成像到自动驾驶和对象识别等各种应用中至关重要。准确和自动的分割长期以来一直面临挑战,传统方法经常在准确性和效率方…

笔记本电脑如何把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. 删除容器…

如何使用PHP Smarty插件和自定义函数?

这是一个非常酷的插件&#xff0c;它可以让你的PHP代码变得更加聪明、灵活和有趣。不过&#xff0c;别担心&#xff0c;我会用幽默的方式引导你一步步掌握这个强大的工具。 首先&#xff0c;要开始使用PHP Smarty&#xff0c;你需要确保已经安装了Smarty库。你可以通过在终端中…

【MySQL】InnoDB存储引擎详解

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

RN实现混合式开发-内嵌html

介绍 React Native WebView是一个用于在React Native应用中嵌入Web内容的组件。它允许你在应用中显示网页、加载HTML字符串、运行JavaScript代码等。 使用 首先&#xff0c;你需要在你的React Native项目中安装React Native WebView库。可以使用以下命令进行安装&#xff1a;…

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

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

【LangChain】Prompts之自定义提示模板

LangChain学习文档 【LangChain】向量存储(Vector stores)【LangChain】向量存储之FAISS【LangChain】Prompts之Prompt templates【LangChain】Prompts之自定义提示模板 概要 假设我们希望LLM生成给定函数名称的英语解释。为了实现此任务&#xff0c;我们将创建一个自定义提示…

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…

腾讯云服务器上传和下载的方法汇总不止是FTP

腾讯云服务器怎么上传文件&#xff1f;腾讯云服务器如何传输文件呢&#xff1f;可以通过FTP上传文件到云服务器&#xff0c;还有MSTSC、SCP、WinSCP、RDP、MRD等方法上传文件到云服务器&#xff0c;本地操作系统分为Windows、Linux和MAC&#xff0c;腾讯云服务器网分享本地不同…

mobile私有方法

目录 1 mobile私有方法 1.1 //当前商家下所有商品模板ID集合 1.2 //属于当前模板的商品ID集合 1.3 //根据模板设置的包邮地区过滤出当前配送地址所在地址 1.4 //只要有一个符合包邮条件,则退出 mobile私有方法 private static <

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) 二、…