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

背景故事

时间

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这个提交这里,如下图所示

为什么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汇报了

面试官:你了解git cherry-pick吗?的更多相关文章

  1. git之rebase、merge和cherry pick的区别(面试常问)

    git flow图例镇楼 merge 这个简单,初学者常用.比如主分支是Dev,最新版本是01.然后小明基于此,搞了个feature 分支A,业务:打酱油.然后在上面多次提交,完成功能迭代开发,如A1 ...

  2. 技术简历这样写,才能得到BAT面试官的青睐

    公众号[程序员江湖] 作者陆小凤,985 软件硕士,阿里 Java 研发工程师,在技术校园招聘.自学编程.计算机考研等方面有丰富经验和独到见解,目前致力于分享程序员干货和学习经验,同时热衷于分享作为程 ...

  3. 大厂面试官:Java工程师的“十项全能”

    想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,在面试之前到底需要准备哪些东西呢?面试时面试官想了解你的什么专业技能,以下都是一个合格Java软件工程师所要具备的. 一.专业技能 熟练的 ...

  4. 你所不知道的 CSS 阴影技巧与细节 滚动视差?CSS 不在话下 神奇的选择器 :focus-within 当角色转换为面试官之后 NPOI 教程 - 3.2 打印相关设置 前端XSS相关整理 委托入门案例

    你所不知道的 CSS 阴影技巧与细节   关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 filter:drop-shadow 详解及奇技淫巧,介绍了一些关于 box-shadow  ...

  5. 技术简历写这么写,才能得到BAT面试官们的青睐

    公众号[程序员江湖] 作者陆小凤,985 软件硕士,阿里 Java 研发工程师,在技术校园招聘.自学编程.计算机考研等方面有丰富经验和独到见解,目前致力于分享程序员干货和学习经验,同时热衷于分享作为程 ...

  6. 一口气说出 9种 分布式ID生成方式,面试官有点懵了

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 本文作者:程序员内点事 原文链接:https://mp.weix ...

  7. Redis 到底是单线程还是多线程?我要吊打面试官!

    最近在Java技术栈公众号发布的一篇文章,其中有一道题: Redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看) 好些粉丝在后台问我:为什么请回,Redis不是单线程吗? 大家注意 ...

  8. 面试28k职位,老乡面试官从HashCode到HashMap给我讲了一下午!「回家赶忙整理出1.6万字的面试材料」

    作者:小傅哥 博客:https://bugstack.cn 目录 一.前言 二.HashCode为什么使用31作为乘数 1. 固定乘积31在这用到了 2. 来自stackoverflow的回答 3. ...

  9. 【Nginx】面试官:给我讲讲Nginx如何实现四层负载均衡?

    写在前面 这次又被问到Nginx四层负载均衡的问题了,别慌,我们一起来细细分析这个看似简单的问题. 如果文章对你有点帮助,请关注 冰河技术 微信公众号,点赞.在看.留言和转发,大家的四连是我持续创作的 ...

  10. [每日一题]面试官问:Async/Await 如何通过同步的方式实现异步?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

随机推荐

  1. 在python中安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))

    所以最终的 解决办法:pip install keras -i http://pypi.douban.com/simple --trusted-host pypi.douban.com(其中的kera ...

  2. Jetbrains系列产品最新激活方法[持续更新]

    Jetbrains系列产品最新激活方法[持续更新] 2021.3.4系列激活 方法一: 2021.3.4参考文章: https://www.exception.site/essay/how-to-fr ...

  3. ctfshow_web_1(困难题)

    CTFshow web1(困难题) 根据前面做题经验,看见登录框基本都是跑一下爆破,弱口令等等 这里用 dirmap 目录爆破爆出来有一个 www.zip 把他下载下来 看了 login.php 和 ...

  4. 2022年官网下安装Tomcat最全版与官网查阅方法

    目录 一.环境整合 构建工具(参考工具部署方式) 二.官网下载 三.解压安装 四.配置环境 五.启动运行 六.配置为服务 七.查看设置服务 一.环境整合 构建工具(参考工具部署方式) 软件名称 版本 ...

  5. docker之docker-compose

    docker-compose就是个二进制的工具,它可以单机编排,批量管理多个容器 [root@mcwk8s01 harbor]# file /usr/local/bin/docker-compose ...

  6. springcloud整合stream解决项目升级的多个消息中间件的收发问题

    cloud stream (一)简介Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架.它可以基于 Spring Boot 来创建独立的.可用于生产的 Spring ...

  7. C# Bitmap 在winform里编辑了,再次重新编辑,报gdi+错误解决办法

    经过排查,var bitmap=new Bitmap()这个局部对象,没有Dispose所致.虽然是局部的对象,但还是需要Dispose:

  8. MFC之ListControl选中行删除

    if (m_list.GetSelectedCount() > 0) { POSITION pos= m_list.GetFirstSelectedItemPosition(); while ( ...

  9. 鸿蒙HarmonyOS实战-Stage模型(进程模型)

    前言 进程是计算机中运行的程序的实例.它是操作系统对正在执行的程序的一种抽象概念.每个进程都有自己的独立内存空间.运行状态和执行上下文.进程可以包含一个或多个线程,每个线程可以独立执行一部分任务.操作 ...

  10. 研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?

    一.写在开头     今天和一个之前研二的学妹聊天,聊及她上周面试字节的情况,着实感受到了Java后端现在找工作的压力啊,记得在18,19年的时候,研究生计算机专业的学生,背背八股文找个Java开发工 ...