IDEA和GIT实现cherry pick拣选部分变更到新分支

IDEA和GIT实现cherry pick拣选部分变更到新分支

前言

在工作中,当你出现一些情况,需要将一个分支的部分变动提取出来,只需要更新提取出来的情况就需要用到当前文章提到的git的功能
并且正常情况下,你工作是没有权限直接合并到生产分支,并且前一个需求还没合并到生产分支,如果你想要复用这部分的改动逻辑,那么就需要用到这个操作,也叫cherry-pick拣选

核心作用

核心作用是将一个或多个已有的提交(commit)复制到当前所在的分支上。

你可以把它想象成在一棵果树上,只挑选(pick)几颗你想要的,而不是把整根树枝都搬过来。

为什么需要它?

主要用于那些不需要合并整个分支,而只需要其中几个特定提交的情况。
将修复补丁应用到多个分支

这是最常见、最经典的场景。假设你有一个bugfix分支上修复了一个关键 bug,这个提交的 hash 是 a1b2c3d。现在你需要将这个修复同时应用到:
main 分支(生产环境)
develop 分支(开发环境)
可能还有旧的维护分支 v1.x
你不需要将整个 bugfix 分支合并到这些分支上,只需要在每个目标分支上执行:

git cherry-pick a1b2c3d 
意外在错误的分支上进行了提交

你本来应该在 feature/login 分支上开发,但不小心在 main 分支上提交了代码。这时你可以:
在 feature/login 分支上,通过 git cherry-pick 将那个误提交“拿”过来。
回到 main 分支,用 git reset 撤销那个提交。

只想引入另一个分支上的某个特定功能

同事在 feature/A 分支上开发了 5 个新功能,但你目前只需要其中的第 3 个功能。你可以找到实现第 3 个功能的提交,然后用 cherry-pick 将其单独引入你的分支。

步骤

那么接下来我会列举下git操作和IDEA操作的方式,不过重点会讲IDEA操作的方式

IDEA方式

首先,我们先新建一个分支
IDEA切换该分支

在右下角,输入自己的分支,点击分支切换check out

在这里插入图片描述
在这里插入图片描述
GIT菜单栏检索Show Git Log 或者左下角点击Git面板

在这里插入图片描述
这里有三部分,在中间部分有
【输入框】 可以筛选提交hash,分支名,提交文本筛选git历史记录
【Branch:All】 根据分支筛选git提交记录,默认带出所有
【User:All】根据提交用户筛选git提交记录,默认带出所有
【Date:All】根据提交时间筛选git提交记录,默认带出所有
【Path:All】根据文件筛选git提交记录,默认带出所有
在这里筛选你需要拣选的分支,筛选之后,点击选中,右侧部分会带出本次git提交记录的变更文件记录
在这里插入图片描述
按照ctrl键,选中需要拣选的文件,然后在选中的文件右键选择Cherry-pick Selected Changes
在这里插入图片描述
然后会弹窗,加入到一个变更的列表
Name需要加入的变更列表,可以自定义命名
Comment 提交文本
在这里插入图片描述
然后点击OK,在我们的左侧Commit就会多出拣选的文件,然后我们正常git push 提交即可
在这里插入图片描述

GIT方式

git方式是比较通用的,哪怕脱离图形化工具我们也可以根据git命令执行拣选,但是按照我如下的IDEA方式会比较方便操作

基本语法实例

# 切换到目标分支git checkout main # 拣选单个提交git cherry-pick abc1234 # 拣选单个提交并保留原提交信息git cherry-pick -x abc1234 # 拣选但不立即提交(允许修改后再提交)git cherry-pick -n abc1234 

一次挑选多个提交实例

挑选不连续的多个提交
# 切换到目标分支git checkout feature-branch # 一次挑选多个不连续的提交git cherry-pick commit1-hash commit2-hash commit3-hash # 实际示例git cherry-pick a1b2c3d e4f5g6h i7j8k9l 
挑选连续的提交范围
# 方法1:使用范围语法(包含start-commit,不包含end-commit)git cherry-pick start-commit^..end-commit # 方法2:使用..语法git cherry-pick older-commit..newer-commit # 实际示例 - 拣选从提交A到提交D的所有提交git cherry-pick a1b2c3d^..d4e5f6g # 或者明确指定范围git cherry-pick a1b2c3d..b2c3d4e..c3d4e5f..d4e5f6g 

解决冲突的完整流程

当 cherry-pick 遇到冲突时的处理步骤:

# 1. 执行cherry-pick时遇到冲突git cherry-pick a1b2c3d # 输出:CONFLICT (content): Merge conflict in file.txt# 输出:Automatic cherry-pick failed.# 2. 查看冲突状态git status # 输出:Unmerged paths:# 输出: both modified: file.txt# 3. 手动解决冲突# 编辑冲突文件,解决 <<<<<<<, =======, >>>>>>> 标记的部分vim file.txt # 4. 将解决后的文件标记为已解决gitadd file.txt # 5. 继续完成cherry-pick操作git cherry-pick --continue # 6. 如果需要放弃这次cherry-pickgit cherry-pick --abort # 7. 如果冲突复杂,可以跳过当前提交git cherry-pick --skip 
  • 冲突解决示例
    假设 file.txt 内容冲突:
<<<<<<< HEAD 这是当前分支的内容 ======= 这是要拣选的提交的内容 >>>>>>> a1b2c3d... 提交信息 

手动解决后:

这是合并后的新内容 

然后执行:

gitadd file.txt git cherry-pick --continue 

挑选某个分支的某次变更的某个文件

方法一:使用 git checkout(推荐)
# 步骤1:切换到目标分支git checkout main # 步骤2:从源分支的特定提交中检出单个文件git checkout feature-branch -- path/to/specific-file.js # 或者直接使用提交hashgit checkout a1b2c3d -- src/utils/helper.js # 步骤3:提交这个文件gitadd src/utils/helper.js git commit -m "feat: 从feature-branch的提交a1b2c3d中拣选helper.js"
方法二:使用 cherry-pick + reset
# 步骤1:切换到目标分支git checkout main # 步骤2:执行cherry-pick但不提交git cherry-pick -n a1b2c3d # 步骤3:重置暂存区,保留工作区改动git reset HEAD # 步骤4:只添加需要的单个文件gitadd src/utils/helper.js # 步骤5:提交git commit -m "feat: 拣选helper.js from a1b2c3d"# 步骤6:清理不需要的改动(可选)git checkout -- .

挑选某个分支的某次变更的多个文件

方法一:使用 git checkout 检出多个文件
# 步骤1:切换到目标分支git checkout main # 步骤2:检出多个特定文件git checkout feature-branch -- src/components/Button.js src/styles/theme.css src/utils/constants.js # 步骤3:提交这些文件gitadd.git commit -m "feat: 从feature-branch拣选多个UI组件文件"
方法二:使用 cherry-pick + 选择性添加
# 步骤1:切换到目标分支git checkout develop # 步骤2:cherry-pick但不提交git cherry-pick -n b2c3d4e # 步骤3:重置暂存区git reset HEAD # 步骤4:查看哪些文件被修改了git status # 步骤5:选择性添加需要的多个文件gitadd src/components/Modal.js src/hooks/useModal.js # 步骤6:提交选中的文件git commit -m "feat: 拣选Modal组件及相关hook"# 步骤7:丢弃不需要的文件改动git checkout -- .
方法三:创建临时分支(最安全的方法)
# 步骤1:创建临时分支git checkout -b temp-cherry-pick # 步骤2:执行完整cherry-pickgit cherry-pick c3d4e5f # 步骤3:重置到cherry-pick之前的状态,但保留文件改动git reset HEAD^ # 步骤4:检查并选择需要的文件git status # 步骤5:添加需要的多个文件gitadd src/api/user.js src/store/auth.js # 步骤6:提交git commit -m "feat: 拣选用户认证相关文件"# 步骤7:回到目标分支并合并临时分支git checkout main git cherry-pick temp-cherry-pick # 步骤8:删除临时分支git branch -D temp-cherry-pick 

综合实战示例

场景:从修复分支挑选特定修复文件
# 假设在hotfix-branch上有多个提交,我们只需要其中的安全修复# 查看hotfix-branch的提交历史git log hotfix-branch --oneline -5 # 输出:# f1e2d3c 修复支付漏洞# e2d3c4b 更新文档# d3c4b5a 修复安全权限# c4b5a6b 样式调整# b5a6b7c 功能增强# 我们只需要安全相关的修复:d3c4b5a 和 f1e2d3c# 方法1:逐个拣选需要的提交git checkout main git cherry-pick d3c4b5a git cherry-pick f1e2d3c # 方法2:批量拣选但只保留特定文件git checkout main git cherry-pick -n d3c4b5a f1e2d3c git reset HEAD gitadd src/security/permissions.js src/payment/processor.js git commit -m "security: 应用关键安全修复"git checkout -- .

结语

如上实现了DEA和GIT实现cherry pick拣选部分变更到新分支

Read more

夜莺-Nightingale-开源云原生监控分析系统部署 Prometheus 作为时序库使用(配置多数据源)

夜莺-Nightingale-开源云原生监控分析系统部署 Prometheus 作为时序库使用(配置多数据源)

夜莺-Nightingale-开源云原生监控分析系统部署 Prometheus 作为时序库使用(配置多数据源) * 一、前言 * 二、Prometheus安装步骤 * 1. 下载并安装Prometheus * 2. 关键配置:启用Remote Write接收器 * 3. 创建Systemd服务 * 4. 启动并验证服务 * 三、验证Remote Write功能 * 四、修改夜莺配置文件对接时序库 * 1. 再增加一个Prometheus 时序库。 * 2. 重启夜莺监控(N9E)服务: * 3. 夜莺数据源管理新增数据源 * 五、常见问题解决 * 1. 夜莺转发数据时报404错误 * 2. 权限问题 * 3. 端口冲突 * 六、总结 * 参考链接 💐The Begin💐点点关注,收藏不迷路💐 一、前言 Prometheus是一款开源的监控系统和时序数据库,

By Ne0inhk
今日AI榜单速览(GitHub Trending AI Top3)

今日AI榜单速览(GitHub Trending AI Top3)

🔥 个人主页:杨利杰YJlio❄️ 个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》《Python》《Kali Linux》《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更简单,让重复的工作自动化 今日AI热榜 * 1 1 今日榜单速览(GitHub Trending AI Top3) * 2 2 ruvnet / RuView:WiFi DensePose 的“无线透视”路线 * 2 我的一句话总结 * 2 为什么今天它能冲到第一? * 2 图:它的可视化界面长这样(很直观) * 2 我如何最快验证(不折腾工具链) * 3 3 K-Dense-AI / claude-scientific-skills:给

By Ne0inhk
盘点IDEA中那些实用的GIT小技巧

盘点IDEA中那些实用的GIT小技巧

作者:唐叔在学习 专栏:唐叔的Java实践 关键词:IDEA技巧,开发效率优化, 代码比较, 团队协作, 程序员必备, 代码管理 一句话:还在用Commit和Pull?唐叔教你解锁IDEA中那些隐藏的Git神操作,让代码管理变得如此简单! 文章目录 * 前言 * 🔄 一、智能更新项目:Update Project * 🔍 二、精准代码比较:Git Show Diff * 1. 当前修改比较:Git Show Diff * 2. 分支/标签比较:Compare Branch or Tag * 📜 三、追溯代码历史:Show History for Selection * 💾 四、灵活提取修改:Patch * 📦 五、暂存未提交代码:Uncommitted

By Ne0inhk
免费无套路!开源 PPT 神器 Presenton 本地部署全攻略,10 分钟搞定专业演示文稿

免费无套路!开源 PPT 神器 Presenton 本地部署全攻略,10 分钟搞定专业演示文稿

1.前言 AI生成PPT是一种利用人工智能技术帮助用户快速创建专业级演示文稿的方法。用户只需提供主题或内容大纲,AI算法就会自动分析并生成幻灯片,从而节省时间和精力。以下是几种常见的AI生成PPT的方式和工具. 上面的PPT 生成效果都不错,但是上面的PPT很多都是付费的。前段时间都豆包生成一个PPT ,生成的PPT 是非常好看,结果呢?好不容易上他生成的PPT。 结果下载下来的时候弹个框 1个月49 ,好像不便宜啊。关键是我平常用PPT 也不多,一个月 做不了几张。结果 要掏49块钱,我感觉这个钱可以订阅其他国外付费模型了。 有没有办法使用免费开源的PPT项目呢?这样我在公司内部搭建起来,数据私密性、会员费也都可以省了。呵呵这个想法不错。接下来我们在github找一下有没有PPT 生成的开源项目。结果真给我找到了,下面看一下生成的效果 总共我让它生成了8页,效果还是不错的。下面手把手带大家本地电脑上部署一个生成PPT 的开源项目。 2.项目的部署 这个项目的开源地址是:https://github.com/presenton/presenton 目前这个项目开源时

By Ne0inhk