Git代码合并两大神器:Merge 对决 Cherry-pick,你真的用对了吗?

Git 分支整合策略:Cherry-pick、Merge、Rebase 三者之间对比 Merge Rebase都是将分支的改动带到另一分支的方法,区别在于“迁移范围”、“历史显示方式”以及“对后续工作的影响”。选择策略主要看目标:若你只想复制几个提交且不干扰其他内容,是好帮手;若要合并完整分支并保留多人协作痕迹,Merge更简单可靠;若追求最简洁线性历史或需要交互式编辑提交,Rebase是首选,但需关注团队协作中的冲突与历史重写问题。团队协作开发要形成统一规范哪些分支只能使用 merge;哪些分支可以 rebase;何时可以 cherry-pick; 阅读详情
AI摘要

本文介绍了Git代码合并的两种方式Merge和Cherry-pick。Merge会将整个分支的历史合并,好处是历史记录清晰、追溯问题方便,但分支多会使历史图谱混乱;Cherry-pick可精准选取单个提交,灵活且保持历史干净,但有上下文丢失等问题。还给出了使用场景的选择指南。

今天想跟大家扯扯一个老生常谈但又经常被搞混的话题——代码合并这点事儿。

说起合并代码,估计 git merge 大家都用烂了。不过它还有个"兄弟" git cherry-pick,虽然不太起眼,但关键时刻真的能救命。问题是,很多人(包括我之前)经常把这俩搞混,结果把项目历史弄得一团糟,后悔都来不及。

那这俩家伙到底啥区别?什么时候该用哪个?别急,我们慢慢聊。
在这里插入图片描述

老朋友:git merge —— 大河东去,海纳百川

在这里插入图片描述

先说说大家最熟悉的 merge。我喜欢把它想象成这样:你的 master 分支是条主河道,然后你在旁边开了条支流(比如 feature 分支)搞开发。等功能做完了、测试也过了,是时候让这条支流回归主河道了。这时候 merge 就派上用场了。

它的思路很简单:把整个分支的历史都给你合并进来,一个不落。

具体怎么干的呢?

你站在 master 上,敲个 git merge feature/user-center,Git 就开始忙活了:

  1. 先找到两个分支的"共同祖先"(就是它们分叉的那个点)
  2. 把 feature 分支从那之后的所有提交都拿过来,跟 master 的提交一起合并
  3. 在 master 上生成一个特殊的合并提交,这家伙有两个"爸爸"——一个指向 master 的最新提交,一个指向 feature 的最新提交
# 标准操作流程,应该都很眼熟
git checkout master
git fetch origin
git pull origin master

git merge feature/user-center
git push origin master

merge 的好处显而易见:

  • 历史记录贼清楚:谁都能看出来什么时候合并的什么分支,整个开发过程一目了然
  • 追溯问题不头疼:用 git log --graph 一看,分支合并的轨迹清清楚楚
  • 操作傻瓜化:想合并整个功能?一个命令搞定

但也有让人头疼的地方:

  • 历史图谱像麻花:分支多了真的看着乱,有时候理解主线发展都费劲
  • 要么全要,要么不要:想只合并分支里的某个改动?不好意思,做不到

外科手术刀:git cherry-pick —— 想要哪个拿哪个

在这里插入图片描述

现在换个场景。你正在一个复杂的 feature/new-algorithm 分支上折腾,里面有10个提交。突然发现第3个提交(假设是 a1b2c3d)修复了个要命的Bug,生产环境马上就要崩了!

问题是,整个 feature 分支还没搞完,但这个Bug修复必须马上上线。咋办?

这时候 cherry-pick 就像个精准的外科手术刀,专门干这种活。

它的思路更直接:我不要你的分支,我就要你这一个提交,其他的别烦我。

具体操作:

你切到 master,然后 git cherry-pick a1b2c3d,Git就会:

  1. 找到那个 a1b2c3d 提交
  2. 把它的代码改动"复制"一份,应用到当前的 master 上
  3. 生成一个全新的提交,内容一样,但ID完全不同!
# 精准打击,专治急症
git checkout master
git pull origin master

# 从feature分支"偷"个提交过来
git cherry-pick a1b2c3d 
git push origin master

cherry-pick 的优势:

  • 灵活得不行:想要啥就拿啥,跨分支、跨时间,随便你
  • 历史保持干净:不会产生合并提交,主线历史看着舒服
  • 救急神器:热修复、关键改动同步,这就是它的主场

但坑也不少:

  • 上下文丢了:提交脱离了原来的环境,可能会有依赖问题
  • 重复提交的隐患:这个最坑!你cherry-pick了一个提交,后来又merge了整个分支,Git可能会懵逼,给你来个冲突
  • 管理成本高:你得记住哪些提交被cherry-pick过,项目复杂了就是噩梦

一个真实的例子

前段时间我们项目就遇到过这种情况:

我在feature/payment分支开发支付功能,写了大概15个提交。突然测试发现生产环境有个计算金额的bug,而我在第8个提交里正好修复了这个问题。

这时候支付功能还没开发完,但这个bug必须马上修复。我就用了cherry-pick:

git checkout master
git cherry-pick 8a7b6c5  # 第8个提交的ID
git push origin master

这样就把bug修复快速上线了,而不用等整个支付功能开发完。

直观对比:一眼看懂谁是谁

在这里插入图片描述

对比项git mergegit cherry-pick
处理对象整个分支单个提交
核心思想历史汇合代码搬运
历史样子有分叉,有合并节点保持直线,新提交
历史完整性完整保留分支上下文会丢失原来的上下文
适合场景合并完整功能紧急修复、少量改动同步
主要优点历史清楚,便于追溯灵活精准,主线干净
主要坑点历史可能变复杂容易搞出重复提交

选择指南:到底用哪个?

看到这儿,你心里应该有数了。我总结了个简单粗暴的原则:

“功能用 merge,修复用 cherry-pick”

什么时候用 merge:

  • 功能分支开发完了,测试也过了,该合并到主线了
  • 想让某个分支同步另一个分支的所有进展
  • 团队重视开发历史的完整性,需要清楚的合并记录

什么时候用 cherry-pick:

  • 从未完成的分支里拯救一个紧急Bug修复
  • 需要把主线的某个提交同步到旧版本维护分支
  • 看中了别人分支里的某个改动,但不想要整个分支

写在最后

说到底,merge 和 cherry-pick 就像螺丝刀和镊子,没有好坏之分,关键是用对地方:

  • Merge 适合处理大块的、结构性的变化,关注的是历史的融合
  • Cherry-pick 适合处理细小的、精确的操作,关注的是代码的搬运

作为码农,理解这两个工具的本质和风险,能帮我们避开很多坑,让项目历史更健康,团队协作更顺畅。

希望今天的分享对你有用。下次遇到合并代码的时候,记得先想想:我到底是要合并功能,还是要迁移修复?答案就在那里。

IDEA可视化解决代码合并冲突:从原理到实战的完整指南 在团队协作开发中,版本控制系统是管理代码变更的核心工具,其核心原理是通过分支管理实现并行开发。当多个开发者对同一代码区域进行修改时,系统无法自动裁决,便会产生合并冲突,这是分布式协作的自然产物。理解并高效解决冲突,对于保障代码质量、提升团队协作效率具有重要技术价值。尤其在持续集成和敏捷开发场景下,快速解决冲突能确保交付流程顺畅。本文聚焦于使用IntelliJ IDEA这一集成开发环境,系统讲解如何利用其可视化工具应对常见的pods依赖冲突和dll冲突等复杂场景,将冲突解决从繁琐的文本操作转化为清晰的逻辑整合 阅读详情

相关推荐

Git分支管理完全指南:从原理到冲突解决的实战手册

版本控制是现代软件工程的基础设施,而Git作为最主流的分布式版本控制系统,其分支管理能力直接决定了团队协作的效率与代码历史的清晰度。很多开发者熟悉git checkout、git commit等基础命令,却在面对分支合并、代码冲突时陷入迷茫。理解分支的本质——一个指向提交的可移动指针,是掌握一切高级操作的前提。基于此,merge与rebase的选择、cherry-pick的灵活运用、冲突产生的底层逻辑以及使用git stash暂存未完成工作,构成了高效分支管理的核心技能。在实际项目中,无论是个人开发还是多人

weixin_33787529的博客 135

git merge rebase cherry-pick分别什么时候用?一文解惑

一、git merge 1.使用 将分支切换到 master 上去:git checkout master 将分支 feature 合并到当前分支(即 master 分支)上:git merge feature 2.特点 只处理一次冲突 引入了一次合并的历史记录,合并后的所有 commit 会按照提交时间从旧到新排列 所有的过程信息更多,可能会提高之后查找问题的难度 二、git rebase 1.使用 与 git merge 一致,git rebase 的目的也是将一个分支的更改并入到另外

weixin_64314555的博客 8181

启动盘安装Win10完整指南:U盘制作、BIOS设置与分区排错

系统重装是解决电脑卡顿、系统崩溃、病毒残留等问题的基础操作,而U盘启动盘则是目前最主流的安装介质。其核心原理在于通过Rufus等工具,将原版ISO镜像写入U盘,并依据主板固件类型(UEFI或Legacy)选择对应的GPT或MBR分区表,确保引导程序能正确加载。掌握这些底层概念,不仅能提升安装成功率,还能避免因引导模式不匹配导致的黑屏、无法启动等问题。在实际应用中,无论是老旧电脑升级、硬盘更换,还是需要纯净的系统环境,制作一个可靠的启动盘都是必备技能。本文从备份数据、下载官方镜像讲起,逐步演示U盘制作、启动快

weixin_32667955的博客 341

git中merge,rebase,cherry-pick,patch的联系与区别

这些操作都是为了把一个分支上的工作加到另一个分支上。 merge 把另一个分支合并到当前分支上。 rebase 把当前分支的提交在另一分支上重演。(如果可以成功重演,本分支将会消失) cherry-pick 把本分支或者其他分支的某一次或某几次提交,在当前分支上重演。 patch 把一次或几次提交,做成补丁文件(可以远程发送给其他人)。这个补丁文件可以被应用到分支上。

frcoder的博客 1万+

软硬件协同设计的大小端问题

缘起 最近需要在soc系统内做协处理器,加速AES加密运算,寄存器一次读取32bit,AES一次处理128bit,因此在数据拼接的时候,需要考虑大小端的问题,特来记录一番。 一、什么是大小端 大小端的问题发生在寄存器和内存间传递数据,这点非常重要,很多地方简单地说是数据存储方式,其实不准确。追根溯源,大小端问题是在设计load,store指令的时候考虑的,因此本质是寄存器和内存交互的问题,其他地方不会发生。 比如c语言里定义一个变量int a=ox1234,那么查看在线汇编平台的对应汇编代码: # 给2号寄

http://www.icfgblog.com/ 613

wsl2内核版本和模块版本不一致解决方法

** /lib/modules/…build: No such file or directory错误解决办法这篇文章历时1个月整,从4月5日一直到5月5日,这一问题才得以解决。

m0_60634555的博客 5103

git中的cherry-pick和merge有些区别以及cherry-pick怎么用

可以看到,我们只将feature分支上的F这个commit应用到了dev分支,而不是合并整个feature分支。这就是cherry-pick的一个简单用法,它可以灵活地挑选修改并应用到当前分支。

ityqing的博客 6686

ROS2与Gazebo协同实现多机器人避障仿真

本文详细介绍了如何利用ROS2与Gazebo协同搭建多机器人避障仿真环境。通过创建SDF机器人模型、编写多机器人启动文件以及集成基础避障算法,构建了一个低成本、高效率的虚拟测试平台,为AGV编队、机器人集群等项目的算法验证与迭代提供了完整解决方案。

weixin_29065659的博客 296

Git 代码合并最佳实践:如何合理选择 Merge 或 Cherry-Pick?含常见问题解答

Git 代码合并最佳实践:如何合理选择 Merge 或 Cherry-Pick?含常见问题解答

John_ToStr的博客 1362

ESP32-S3 SPI驱动SD卡与FATFS文件系统实践

SPI(串行外设接口)是嵌入式系统中常用的同步串行通信协议,通过主从架构实现全双工通信。其工作原理基于时钟同步和数据线传输,具有接线简单、占用引脚少的优势。在存储扩展场景中,SPI模式可驱动SD卡实现大容量数据存储,配合FATFS文件系统可提供标准化的文件管理能力。ESP32-S3作为乐鑫推出的高性能Wi-Fi/蓝牙双模芯片,其SPI外设支持高达80MHz时钟频率,结合ESP-IDF提供的sdspi_host驱动,开发者能快速实现SD卡存储方案。该技术广泛应用于物联网设备日志存储、传感器数据采集等场景,本实

weixin_29168393的博客 357

72-dify案例分享-揭秘!如何用 Dify 实现多语言 PDF 文档原格式翻译

本文围绕 Dify 1.6 + 版本,演示搭建 PDF 文档翻译 Agent:配置 MCP 服务、构建 Agent 并以 URL 传文件测试,实现高效翻译,展现 MCP 跨工具复用与简化集成的优势,助力 AI 应用开发。

个人技术 2287

图解4种git合并分支方法

有时候我们会后悔,有时候我们会想回到过去,有时候我们想改变历史,然而在我们这个世界,目前来看是无法回到过去改变历史的 但在git的世界里,一切皆有可能,我们可以在多维空间里任意切换,随意改变一个宇宙的时间线,只要我们愿意,git的分支就是这么神奇 然而很多时候你以为你改变了历史,不为人知,那个宇宙并没有消失,而是遗失在了git的世界里,有能力的人便能找到 彼此分开的世界也能随时交叉合并,世界就这样开开合合,偶会需要解决合并冲突 git中的分支非常的轻量,其实就是一个文件,里面记录了分支所指向的com

coco的专栏 3493

2026.2.23:AgentScope框架实战<一>:安装并使用agentscope

本文介绍了AgentScope框架的安装与使用实践。通过PyPI安装agentscope[full]后,演示了如何创建ReActAgent代理:1)配置DashScope聊天模型;2)注册自定义工具函数(查询位置和天气);3)初始化代理并处理用户请求。示例展示了代理如何响应复合查询(如同时获取北京位置和天气信息),输出结果显示代理成功执行了工具调用并返回结构化响应。该框架支持Python 3.13环境,提供内存管理、工具集成等功能,适用于构建智能代理系统。

拥抱具身智能,昇腾Ascend C 509

Git Cherry-Pick 功能介绍

在 Git 的日常使用中,merge 和 rebase 是我们最熟悉的两个分支合并指令。但有时候,我们并不想合并整个分支,而只是想把某个特定的提交(Commit)“复制”到当前分支。这时,git cherry-pick 就登场了。

CoderJia的学习之路 839

YOLOv11低光照检测性能优化:基于Retinexformer主干网络的深度改进实践

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!@[TOC]在自动驾驶、安防监控、遥感探测等关键领域,目标检测系统必须保证24小时全天候的可靠工作。然而,现有最先进的目标检测模型,包括YOLOv11,其训练数据大多源于光照良好的场景。当环境光照条件急剧下降时,图像会出现严重的噪声、低对比度、颜色失真和细节丢失,直接导致模型性能断崖式下跌。常规的解决方案如图像直方图均衡化或简单的伽马校正,往往收效甚微,甚至可能放大噪声,进一步干扰检测。

m0_71589036的博客 190

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Git Cherry-pick:精准合并分支提交的实用指南

本文详细介绍了Git Cherry-pick工具,这是一种精准的代码“摘取”技术,允许开发者跨分支选择性合并特定提交。文章通过多个实际场景(如紧急修复上线、功能选择性发布)和命令行与图形化界面的操作指南,阐述了如何高效使用Cherry-pick来维护代码整洁与发布节奏,并对比了其与Merge、Rebase的区别。

beer8的博客 506

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

图解4种git合并分支方法(转载)

本文作者将四种git合并分支的方法采用动图的方式进行演示,非常通俗易懂。 非常喜欢,转载在此。 如想了解更多相关文章请去原作者网站学习。 -------------------------------------原文如下----------------------------------------------------------   有时候我们会后悔,有时候我们会想回到过去,有时候...

GoodIdea 842

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Git合并与变基:如何选择Merge与Rebase提升代码历史清晰度

在版本控制系统中,分支管理是团队协作的核心环节,它直接影响代码历史的可读性与维护效率。其基本原理是通过不同的策略整合代码变更,确保项目演进过程有序可控。从技术价值看,清晰的提交历史能显著提升代码审查、问题追溯和持续集成的效率。常见的应用场景包括功能开发、Bug修复以及多版本并行维护。本文聚焦于Git中Merge与Rebase这两种关键操作,深入解析它们如何塑造提交历史的结构。通过对比两者的核心差异,例如Merge保留完整分支脉络而Rebase创造线性历史,开发者可以更好地管理代码演进路径。合理运用这些策略,

466

Git工作流最佳实践里那个容易忽略的细节:rebase/cherry-pick/分支模型

上线前提交记录乱成麻花?合并冲突天天有?这是团队 Git 工作流落地的通病。别光盯着分支模型,底层操作没搞对,流程再完美也是白搭。本文深挖 rebase 和 cherry-pick 用法,保你历史清晰,上线不慌。

H19905222的博客 281

git分支合并学习大全

看到这个动画基本就完全理解了合并技巧 有时候我们会后悔,有时候我们会想回到过去,有时候我们想改变历史,然而在我们这个世界,目前来看是无法回到过去改变历史的 但在git的世界里,一切皆有可能,我们可以在多维空间里任意切换,随意改变一个宇宙的时间线,只要我们愿意,git的分支就是这么神奇 然而很多时候你以为你改变了历史,不为人知,那个宇宙并没有消失,而是遗失在了git的世界里,有能力的人便能找到 彼此分开的世界也能随时交叉合并,世界就这样开开合合,偶会需要解决合并冲突 git中的分支非常的轻量,其实就是一个文件

博水之野,人杰地灵 1038

Git 核心命令保姆级教程:一篇吃透Git核心知识

Git 是日常开发中不可或缺的版本控制工具,但 merge、rebase、reset 等命令的底层逻辑常常让人困惑。本文从 Git 的核心对象模型(提交树、分支指针、HEAD)出发,系统梳理了 6 大核心命令模块:提交与历史查看、分支创建与切换、合并策略对比、变基操作原理、撤销回滚机制、远程仓库协作。文中附有详细的命令对比表格和场景化使用建议,帮助你建立清晰的心智模型。配合交互式可视化工具 LearnGitBranching 同步练习,效果更佳。适合 Git 初学者夯实基础,也适合有经验的开发者查漏补缺。

林间藏好物,码间藏星光 专注分享优质网站、开源项目、小众工具、模型算法 安静攒资源,慢慢变厉害•͈ᴗ⁃͈ ✧ 1462

git 图解 四种切糕方式 —— 含好玩H5体验git

原文:https://blog.youkuaiyun.com/w605283073/article/details/80099644 本文系转载原文地址:http://yanhaijing.com/git/2017/07/14/four-method-for-git-merge/ 本文作者将四种git合并分支的方法采用动图的方式进行演示,非常通俗易懂。 非常喜欢,转载在此。 好玩的H5盲敲git命令:https://learngitbranching.js.org/ --------------------.

yuezhilangniao的博客 260

使用IDEA高效合并Git分支的部分提交记录:步骤详解与实战技巧

本文详细介绍了如何在IntelliJ IDEA中高效使用Cherry-Pick功能,精准合并Git分支的特定提交记录。通过步骤详解与实战技巧,帮助开发者掌握在团队协作中仅移植所需代码变更的方法,有效处理紧急修复、功能独立上线等场景,并妥善解决合并冲突,从而提升开发效率和代码管理精度。

oo7890的博客 574

Git分支实战:创建、管理与合并的工程化指南

Git分支是分布式版本控制的核心机制,本质是基于commit对象的轻量指针,用于隔离开发环境、控制变更边界并支撑协作流程。其原理建立在引用(ref)、对象数据库与有向无环图(DAG)历史模型之上,技术价值在于降低集成风险、提升发布可控性、保障多人并行效率。典型应用场景包括功能开发(feature/)、紧急修复(hotfix/)、版本发布(release/)及CI/CD流水线触发。本文聚焦真实项目中的分支实践,覆盖git switch创建、--set-upstream-to追踪配置、rebase与merge策

weixin_33892359的博客 392
上一篇: 当Metadata失效时:我是如何从2000张手机自拍照片里“考古“出真实拍摄时间的?
下一篇: 告别混淆:如何精准找出两个Git分支间“真正”的差异?
Apple_Web
博客等级 码龄9年 938粉丝 257原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Apple_Web

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值