首页 > 其他分享 >面试官:你了解git cherry-pick吗?

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

时间:2024-07-02 13:42:24浏览次数:18  
标签:面试官 git cherry 提交 pick commit 分支

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

背景故事

时间

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汇报了

标签:面试官,git,cherry,提交,pick,commit,分支
From: https://www.cnblogs.com/xieshijie/p/18279724

相关文章

  • git 同步主仓库到fork仓库
    #1.克隆你的fork仓库(如果你还没有克隆)gitclone<your-fork-repo-url> #2.进入仓库目录cd<your-fork-repo-directory> #3.添加主仓库作为一个新的远程仓库(如果你还没有添加)gitremoteaddupstream<main-repo-url> #4.获取主仓库的最新更改gitfetchupstream #5.......
  • git同一分支代码冲突 [GPT]
    问题描述李四和王五同时下载了dev分支代码,main.cpp代码为:#include<stdio.h>voidmain(void){ printf("hello");}李四修改代码后提交并push,李四修改的代码#include<stdio.h>voidmain(void){ printf("hello李四");}同时王五也修改了代码#include<stdio.h>voi......
  • centos7系统GitLab服务器搭建(最新稳定版)
    1、GitLab介绍GitLab是一个用于仓库管理系统的开源项目,使Git作为代码管理工具,并在此基础上搭建起来的Web服务。Gitlab是被广泛使用的基于git的开源代码管理平台,基于RubyonRails构建,主要针对软件开发过程中产生的代码和文档进行管理,Gitlab主要针对group和proj......
  • 聊聊gitlab ci如何构建以时间为版本号的docker镜像
    前言最近朋友他们部门有部分内部项目,打算用gitlabci来做项目持续集成部署,他们有个需求,构建docker镜像的时候,版本需要是以当前时间作为版本。其格式为yyyymmddhhmm一开始朋友翻阅官方文档,发现gitlabci有个变量CI_COMMIT_TIMESTAMP,可以生成时间戳,他默认生成的格式是ISO-8601。就......
  • pycharm 配置git
    配置Git与PyCharm连接的认证信息,可以参考以下步骤:安装Git:如果还未安装Git,需前往Git官网(https://git-scm.com/downloads)下载并安装。在PyCharm中配置Git路径:打开PyCharm,点击菜单栏的“File”(文件)->“Settings”(设置)进入设置界面。在左侧的面板中找到“Version......
  • Two-factor authentication (2FA) is required for your GitHub account
    今天在尝试打开GitHub页面时,突然出现了一个错误提示:“Two-factorauthentication(2FA)isrequiredforyourGitHubaccount”(如图所示)。这个错误提示表明,GitHub账户需要启用双因素认证(2FA)才能继续使用。在网上找了一些办法可以解决但是太麻烦找了比较简单的方法  ......
  • 【git】github如何上传超过100MB大小的单个文件
    在使用GitHub进行版本控制时,默认情况下,单个文件的大小限制为100MB。如果你需要上传超过这个大小的文件,可以使用GitLFS(LargeFileStorage)。GitLFS是一种Git扩展,专门用于处理大文件,它将大文件替换为轻量级的指针,并将实际的文件内容存储在远程服务器上。1.安装从Git2......
  • git使用
    【一】常用命令#基本命令gitinit#初始化git文件gitstatus#查看仓库状态gitadd文件夹#把当前文件的变更提交到暂存区gitadd.#把当前工作区所有变更提交到暂存区gitcommit-m'注释'#把暂存区提交到版本库,变更被版本管理,以后即便删除了也能找回来#设置......
  • 大厂面试官问我:在同步binlog的时候主库是一个时间,从库是一个时间,底层是怎么解决的?【后
    本文为【Mysql日志八股文合集(2)】初版,后续还会进行优化更新,欢迎大家关注交流~大家第一眼看到这个标题,不知道心中是否有答案了?在面试当中,面试官经常对项目亮点进行深挖,来考察你对这个项目亮点的理解以及思考!这个时候,你如果可以回答出面试官的问题,甚至是主动说出自己的思考,那在......
  • 修改element-ui日期下拉框datetimePicker的背景色样式
    如图: 1、修改背景色.el-date-picker.has-sidebar.has-time{  background:#04308D;  color:#fff;  border:1pxsolid#326AFF}.el-date-picker__header-label{  color:#ffffff;}.el-date-tableth{  color:#fff;}.el-icon-d-arrow-......