面试官:你了解git cherry-pick吗

事情要从一次不规范的代码开发开始说起

背景故事

时间

2024年某个风平浪静的周五晚上

地点

中国,北京,西二旗,某互联网大厂会议室

人物

小杰,小A,小B,老K

对话

老K:昨天提交的代码被测试打回来了!为什么小B没开发完的内容也一起提交上去了?

小B:啊?我不清楚啊,我在开发分支B开发完一部分就提交到test分支进行联调了啊

小A:额(‘’!),我把test分支合并到发布分支提交给测试了,因为我跟小杰最开始在各自的分支开发,但是中间联调的时候,为了图方便直接在test分支上改,改来改去就直接在test分支上开发了。。。

老K:什么?你怎么能直接在test分支开发?

老K:正确的开发流程规范应该是:现在各自的开发分支上开发,然和合并到test分支上进行联调,联调没有问题在提交发布release分支进行测试和部署,验证没问题在把各自的开发分支合并到基线分支master

老K:现在要把代码回滚,谁做的事情谁负责。小杰,你去把test分支上的代码抽出来放到单独一个开发分支上

小杰:啊?


小杰接受这个任务,准备把test分支上他跟小A多次提交的内容跟转移到一个纯净的开发分支,小杰决定使用git cherry pick 这个命令

git cherry-pick

介绍

git cherry-pick 是 Git 中的一个非常有用的命令,它允许你从一个分支中选择特定的提交(commit)应用到当前的分支。这个命令在需要引入某些特定功能或修复而不想进行完整的分支合并时特别有用。

使用示例

假设你有以下 Git 分支结构:

* 5a3d5f2 (feature) Add new feature
* c7e33a5 Fix bug B
* 1a2b3c4 Fix bug A
* 9d8e7f6 (main) Initial commit

现在你在 main 分支上,想要将 feature 分支中修复 bug A 的提交 (1a2b3c4)引入当前分支。你可以这样做:

  1. 切换到目标分支(假设是 main 分支):

    git checkout main
    
  2. 使用 git cherry-pick 命令:

    git cherry-pick 1a2b3c4
    

    执行上述命令后,提交 1a2b3c4 的更改会被应用到 main 分支上。

  3. 使用范围(range)来批量 cherry-pick. 假设你要 cherry-pick 从 commitA 到 commitB 之间的所有 commit(包含 commitA 但不包含 commitB),你可以使用以下命令:

    git cherry-pick commitA^..commitB
    
  4. 使用多个单独的 commit 来批量 cherry-pick . 假设你有一系列的 commit 哈希 commit1, commit2, commit3,你可以使用以下命令:

    git cherry-pick commit1 commit2 commit3
    
  5. **解决可能的冲突:**在 cherry-pick 的过程中,如果遇到冲突,Git 会提示你。你需要手动解决这些冲突并继续 cherry-pick

    # 解决冲突后,添加解决后的文件
    git add <conflicted-file>
    # 继续 cherry-pick
    git cherry-pick --continue
    

注意事项

  1. 冲突处理:如果在 cherry-pick 的过程中,存在文件冲突,Git 会暂停操作,并提示冲突文件。你需要手动解决这些冲突,然后使用 git add <file> 添加解决后的文件,最后运行 git cherry-pick --continue 继续操作。如果你想中止 cherry-pick,可以使用 git cherry-pick --abort
  2. 保持提交历史干净:频繁使用 cherry-pick 可能会导致提交历史变得复杂。在使用前,评估是否可以通过别的操作(如合并或重置)来实现相同的目标。
  3. 避免重复提交:如果你已经 cherry-pick 了一个提交,再次尝试 cherry-pick 同一个提交可能会引发问题。Git 会提示你已经包含了相同的更改。
  4. 顺序和依赖关系:如果一个提交依赖于之前的其他提交,cherry-pick 这些提交时需要注意顺序,以避免破坏代码的完整性。

解决方案

第一次尝试

# Step 1: 创建新的分支 xsj_0701
git checkout master
git pull origin master
git checkout -b xsj_0701

# Step 2: 查看 stable_test 分支的 commit 历史
git log stable_test

# Step 3: 批量 cherry-pick commit
git checkout xsj_0701
git cherry-pick commitA^..commitB  # 使用范围
# 或者
git cherry-pick commit1 commit2 commit3  # 使用多个单独的 commit 哈希

# Step 4: 解决可能的冲突
# 解决冲突后
git add <conflicted-file>
git cherry-pick --continue

# Step 5: 推送新的分支
git push origin xsj_0701

小杰使用批量范围cherry-pick,这个范围大约包含了10个commit,正当小杰吭哧吭哧的解决几个冲突之后,cherry-pick突然停止,没有冲突,查看当前commit也只到add cache这个提交这里,如下图所示

image-20240702104831308

为什么cherry-pick会停止呢?

小杰经过观察发现,停止的位置是merge节点

当你尝试 cherry-pick 一个 merge commit 时,Git 需要更多信息来决定如何处理合并。默认情况下,Git 不会自动 cherry-pick merge commit,因为它无法确定你想要保留哪个分支的变更。

要解决这个问题,你可以使用以下方法:

方法 1: 跳过 merge commit

如果你不需要 cherry-pick 这个 merge commit,可以手动跳过它。你可以通过在失败后继续 cherry-pick 后续的 commit 来实现:

在发生停止后,手动跳过 merge commit 并继续 cherry-pick 后续的 commit:

git cherry-pick --skip
# 然后继续 cherry-pick 后续的 commit
git cherry-pick <remaining-commits>

方法 2: 使用 cherry-pick -m 选项

如果你确实需要 cherry-pick 这个 merge commit,可以使用 -m 选项。-m 选项需要一个参数来指定父提交的索引,通常使用 1 表示第一父提交。

  • 继续 cherry-pick merge commit 并指定父提交索引:
git cherry-pick -m 1 5b30dd90
  • 继续后续的 cherry-pick:
git cherry-pick <remaining-commits>

第二次尝试

# Step 1: 创建新的分支 xsj_0701
git checkout master
git pull origin master
git checkout -b xsj_0701

# Step 2: 查看 stable_test 分支的 commit 历史
git log stable_test

# Step 3: 批量 cherry-pick commit
git checkout xsj_0701
git cherry-pick commitA^..commitB  # 使用范围
# 或者
git cherry-pick commit1 commit2 commit3  # 使用多个单独的 commit 哈希

# Step 4: 解决可能的冲突
# 解决冲突后
git add <conflicted-file>
git cherry-pick --continue

# Step 5: 跳过merge节点
git cherry-pick --skip

# Step 6: 推送新的分支
git push origin xsj_0701

经过一下午的奋战,小杰终于把test分支上的开发内容都迁移到纯净开发分支,然后屁颠屁颠去跟老K汇报了


更多惊喜

我还将定期分享:

  • 最新互联网资讯:让你时刻掌握行业动态。

  • AI前沿新闻:紧跟技术潮流,不断提升自我。

  • 技术分享与职业发展:助你在职业生涯中走得更远、更稳。

  • 程序员生活趣事:让你在忙碌的工作之余找到共鸣与乐趣。

关注回复【1024】惊喜等你来拿!

点击查看惊喜

敬请关注【程序员世杰】

点击关注程序员世杰

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——带环链表、循环队列问题

1.带环链表问题 1.1给定一个链表判断其是否带环 解决思路&#xff1a;利用快慢指针法&#xff0c;快指针一次走两步慢指针一次走一步&#xff0c;从链表起始位置遍历链表&#xff0c;如果链表带环&#xff0c;则快慢指针一定会在环中相遇&#xff0c;否则快指针先到达链表末尾…

OpenSSH Server 远程代码执行漏洞(CVE-2024-6387)(附代码)

OpenSSH Server 远程代码执行漏洞&#xff08;CVE-2024-6387&#xff09;&#xff08;附代码&#xff09; 前言影响范围验证脚本1.python2.C? 参考链接 前言 2024年7月1日&#xff0c;OpenSSH 官方发布安全通告&#xff0c;披露CVE-2024-6387 OpenSSH Server 远程代码执行漏洞…

【084】基于SpringBoot实现的家乡特色推荐系统

系统介绍 视频演示 点击查看演示视频 基于SpringBoot实现的家乡特色推荐系统主要采用SpringBootVue进行开发&#xff0c;系统整体分为管理员、用户两种角色&#xff0c;主要功能包括首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;文章分类管理&#xff0c;文章分…

鸿蒙开发Ability Kit(程序访问控制):【对所有应用开放】

对所有应用开放 在申请目标权限前&#xff0c;建议开发者先阅读[申请应用权限]&#xff0c;对权限的工作流程有基本了解后&#xff0c;再结合以下权限字段的具体说明&#xff0c;判断应用能否申请目标权限&#xff0c;提高开发效率。 说明&#xff1a; 权限级别为normal的权限…

Sharding-JDBC分库分表的基本使用

前言 传统的小型应用通常一个项目一个数据库&#xff0c;单表的数据量在百万以内&#xff0c;对于数据库的操作不会成为系统性能的瓶颈。但是对于互联网应用&#xff0c;单表的数据量动辄上千万、上亿&#xff0c;此时通过数据库优化、索引优化等手段&#xff0c;对数据库操作…

新手教学系列——【Python开发】不同系统更换pip源的方法

在使用Python进行开发时,你可能会发现使用pip安装包的速度较慢,尤其是在国内进行操作时。为了提高安装速度,我们可以将pip的默认源更换为国内的一些镜像源。本文将详细介绍如何在不同操作系统上进行这一操作,并给出常用的国内镜像源。 为什么要换源 pip默认使用的是官方的…

嵌入式Linux系统编程 — 6.2 signal和 sigaction信号处理函数

目录 1 信号如何处理 2 signal()函数 2.1 signal()函数介绍 2.2 示例程序 3 sigaction()函数 3.1 sigaction()函数介绍 3.2 示例程序 1 信号如何处理 信号通常是发送给对应的进程&#xff0c;当信号到达后&#xff0c; 该进程需要做出相应的处理措施&#xff0c;可以通…

IP地址与电商企业

网购作为我们现代生活不可或缺的部分&#xff0c;现如今电商企业蓬勃发展。 IP地址是网络世界中每一台设备的独特标识符&#xff0c;就像现实世界中每家每户的门牌号。对于电商企业而言&#xff0c;它在很多方面方面发挥着作用。 IP地址能够帮助电商企业精准地确定用户所在的地…

从理论到实践的指南:企业如何建立有效的EHS管理体系?

企业如何建立有效的EHS管理体系&#xff1f;对于任何企业&#xff0c;没有安全就谈不上稳定生产和经济效益&#xff0c;因此建立EHS管理体系是解决企业长期追求的建立安全管理长效机制的最有效手段。良好的体系运转&#xff0c;可以最大限度地减少事故发生。 这篇借着开头这个…

要不要从单片机转Linux?进来看看大神怎么说

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;究竟要不要从单片机转Linu…

对象的引用和常引用

前面曾介绍&#xff1a;一个变量的引用就是变量的别名。实际上&#xff0c;引用是一个指针常量&#xff0c;用来存放该变量的地址。如果形参为变量的引用&#xff0c;实参为变量名&#xff0c;则在调用函数进行虚实结合时&#xff0c;把实参变量的地址传给形参&#xff08;引用…

2024 年江西省研究生数学建模竞赛题目 B题投标中的竞争策略问题---完整文章分享(仅供学习)

问题&#xff1a; 招投标问题是企业运营过程中必须面对的基本问题之一。现有的招投标平台有国家级的&#xff0c;也有地方性的。在招投标过程中&#xff0c;企业需要全面了解招标公告中的相关信息&#xff0c;在遵守招投标各种规范和制度的基础上&#xff0c;选择有效的竞争策…

工业交换机端口统计功能

工业交换机端口统计功能不仅是一项技术手段&#xff0c;更是一双透视企业网络健康状态的慧眼。通过这一功能&#xff0c;企业能够实时捕捉到网络中每一个端口的流量情况&#xff0c;这不仅仅是数据的积累&#xff0c;更是对网络脉搏的精准把握。当网络的每一个脉动都被记录在案…

【每日一练】Python遍历循环

1. 情节描述&#xff1a;上公交车(10个座位)&#xff0c;并且有座位就可以坐下 要求&#xff1a;输入公交卡当前的余额&#xff0c;只要超过2元&#xff0c;就可以上公交车&#xff1b;如果车上有空座位&#xff0c;才可以上。 seat 10 while seat > 0:money int(input(…

springboot个人证书管理系统-计算机毕业设计源码16679

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了个人证书管理系统的开发全过程。通过分析个人证书管理系统管理的不足&#xff0c;创建了一个计算机管理个人证书管理系统的方案。文章介绍了个人证书管理系统的系…

计算机组成原理 | CPU子系统(4)MIPS32架构-单周期处理器设计

R型运算指令通路 I型运算指令通路 I型访存指令数据通路 I型分支 J型j指令 重新布局 继续整合通路&#xff1a;MUX多路选择器 控制方式 硬连接控制方式&#xff1a;依靠电路 微命令控制&#xff1a;将指令转换为微命令 控制信号的整理和编码 控制系统的两级控制方案 ALU控制器&…

大模型时代的基础架构,大模型算力中心建设指南重磅来袭!

什么是最畅销商品&#xff1f;什么是高毛利商品&#xff1f; 我们来看一个例子&#xff1a; 一件T恤使用成本为100元的原料&#xff0c;价格为140元。另一件T恤使用成本为80元的原料&#xff0c;但在样式、颜色、图案的设计上比较有特色&#xff0c;价格也为140元。 当这两件…

【BES2500x系列 -- RTX5操作系统】深入探索CMSIS-RTOS RTX -- 同步与通信篇 -- 消息队列和邮箱处理 --(四)

&#x1f48c; 所属专栏&#xff1a;【BES2500x系列】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f49…

面向航天器大数据安全传输的发布/订阅系统设计

源自&#xff1a;系统工程与电子技术 作者&#xff1a;覃润楠 彭晓东 谢文明 惠建江 冯渭春 姜加红 注&#xff1a;若出现无法显示完全的情况&#xff0c;可 V 搜索“人工智能技术与咨询”查看完整文章 摘 要 针对航天器试验任务过程监控的在轨故障诊断状态检测、健…

5款简洁干净,功能强悍,专注实用的软件

​ 电脑上的各类软件有很多&#xff0c;除了那些常见的大众化软件&#xff0c;还有很多不为人知的小众软件&#xff0c;专注于实用功能&#xff0c;简洁干净、功能强悍。 1.音量控制利器——EarTrumpet ​ EarTrumpet是一款专为Windows用户设计的音量控制软件。它允许用户轻松…