当前位置: 首页 > news >正文

一个成功的Git分支模型

本作品原发布账号为【白鸽子中文网】,现转至当前账号【飞翔中文网】。


反思备录(2020/3/5)

这个模型构思于2010年,现已过去10余年,(2010年)那时正处于Git诞生后不久。在这10年间,git-flow(本文中提到的分支模型) 在许多软件队伍里特别流行,以至于人们已经把它当成某种软件标准——但不幸的是它也被视为教条或灵丹妙药。

在这10年里,Git本身已经席卷了世界,而使用Git开发的最受欢迎的软件类型正在更多地转向网络应用程序,至少在我的过滤器泡沫(认知)中是这样。Web应用程序通常是连续交付的,而不是回滚的,而且您不必支持在非主体系中(?)运行的多个版本的软件。

这不是我10年前写博客时想的那种软件。如果您的团队正在持续交付软件,我建议您采用更简单的工作流(如GitHub流),而不是试图将git-flow塞进您的团队。

然而,如果您正在构建明确版本化的软件,或者如果您需要在非主体系中(?)支持多个版本的软件,那么git-flow可能仍然像过去10年一样适合您的团队。在这种情况下,请继续阅读。

总之,永远记住,灵丹妙药是不存在的。充分考虑你自己的背景——不要讨厌自己决定。


正文

在这篇文章中,我介绍了大约一年前我为我的一些项目(包括工作和私人项目)介绍的开发模式,结果证明它非常成功。我想写这篇文章已经有一段时间了,但直到现在,我还没有真正找到时间写得这么彻底。我不谈任何项目的细节,只谈分支策略和发布管理。

img

为什么使用Git?

有关Git与集中式源代码控制系统的优缺点的详细讨论,请参阅web(http://git.or.cz/gitwiki/GitSvnComparsion)。那里正在进行大量的唇枪舌战。作为一名开发人员,我更喜欢Git,而不是现在的所有其它工具。Git确实改变了开发人员对合并和分支的看法。从我所处的经典CVS/Subversion体系来看,分离(分支)/合并(分支)一直被认为有点可怕(“小心合并冲突,它们会反噬你!”)而你只是偶尔做一次。

但是使用Git,这些操作非常便宜和简单,它们被认为是日常工作流程的核心部分之一。例如,在CVS/Subversion书籍中,分离和合并首先在后面的章节中讨论(对于高级用户),而在每一本Git书籍中,它已经在第3章(基础知识)中讨论过了。

由于其自身的简单性和重复性,分离和合并不再是令人害怕的事情。版本控制工具应该比其他任何工具更能帮助分离/合并。

关于工具的内容已经足够了,让我们继续讨论开发模型。我将在这里介绍的模型基本上只不过是一系列的操作,每个团队成员都必须遵循这些操作才能进入托管软件开发过程。

去中心化又中心化

我们使用的存储仓库设置,它与这个分支模型很好地配合使用,是一个中央“真实”仓库。请注意,该仓库仅被(人为)视为中央仓库(由于Git是一个DVCS[Distributed Version Control System,分布式版本控制系统],因此在技术层面上不存在中央仓库)。我们将此仓库称为原始仓库origin,因为所有Git用户都熟悉这个名称。

img

每个开发人员都将其代码分离于且提交到原始仓库origin。但除了统一的“推送-拉取”关系之外,每个开发人员还可以从其他同行那里获取更改,以组成子团队。例如,在过早地将正在进行的工作推到原始仓库origin之前,与两个或两个以上的开发人员合作开发一个大的新特性可能会很有用。在上图中,有爱丽丝(alice)和鲍勃(bob)、爱丽丝与大卫(david)、克莱尔(clair)和大卫的子组。

从技术上讲,这意味着Alice定义了一个名为bob的Git远程,指向bob的存储库,反之亦然(bob也定义了一个名为alice的远程仓库并指向)。

核心分支

最核心的是,开发模型受到了现有模型的极大启发。中央仓库持有两个寿命无限(伴随软件开发的整个周期)的核心分支:

master

develop

img

每个Git用户都应该熟悉原始仓库origin的主分支master。与主分支master并行的还有另一个分支,称为开发分支develop

我们认为origin/master是核心分支,是因为其HEAD源代码总是反映生产就绪状态。

我们认为origin/develop是核心分支,是因为其HEAD源代码总是反映下一个版本中最新交付的开发更改的状态。有人会称之为“集成分支”。这是构成任何自动夜间构建的基础。

当开发分支develop中的源代码达到稳定点并准备发布时,所有更改都应该以某种方式合并回主分支master,然后用发布号标记。这将在后面详细讨论。

因此,每次将更改合合并到主分支master时,这都是一个新的生产版本。我们倾向于对此非常严格,因此理论上,我们可以使用Git钩子脚本在每次主服务器上提交代码到主分支master时自动构建软件,并将其推出到我们的生产服务器。

支撑分支

除了主分支master和开发分支develop之外,我们的开发模型还使用各种支持分支来帮助团队成员之间的并行开发,简化功能跟踪,为生产发布做准备,并帮助快速解决实时生产问题。与核心分支不同,这些分支的寿命总是有限的,因为它们最终会被移除(不必伴随软件开发的整个周期)。

我们可能(“可能”->言外之意也可以自己定义)使用的不同类型的分支有:

Feature branches

Release branches

Hotfix branches

这些分支每个都有特定的目的,并受严格的规则约束,即哪些分支可以是其原始分支,哪些分支必须是其合并目标。我们将在一分钟内彻底了解它们。

从技术角度来看,这些分支绝非“特殊”。分支类型根据我们使用它们的方式进行分类。它们当然是普通的旧Git分支。

特性分支Feature branches

可以来自于(特定分支):

develop

必须合并到(特定分支):

develop

分支命名约定:

除了masterdeveloprelease-*,或hotfix-*之外的所有命名均可。

特性分支Feature branches(或有时称为主题分支)用于为即将发布或将来发布的版本开发新功能。当开始开发一个特性时,这个特性将被纳入的目标版本在那个时候可能是未知的。特性分支的本质是,只要特性处于开发阶段,它就一直存在,但最终会被合并回开发分支develop(以明确地将新特性添加到即将发布的版本中)或被丢弃(以防出现令人失望的经历)。

特性分支Feature branches通常只存在于开发者存储库中,而不存在于原始仓库origin中。

创建功能分支Creating a feature branch

在开始新特性的工作时,从开发分支develop拉出分支。

$ git checkout -b myfeature develop
Switched to a new branch "myfeature"

在开发过程中合并已完成的功能Incorporating a finished feature on develop

完成的功能可以合并到开发分支develop中,以明确地将它们添加到即将发布的版本中:

$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop

--no ff标志使合并始终创建一个新的提交对象,即使(不使用的话)合并可以快速执行。这避免了丢失关于特性分支的历史存在的信息,并将一起添加特性的所有提交分组在一起。比较:

img

在后一种情况下,(合并以后)不可能从Git历史中看到哪些提交对象一起实现了一个特性,您必须手动读取所有日志消息。恢复整个特性(例如一组提交)是一个真正令人头痛的问题,而如果使用了--no ff标志,则很容易完成。

是的,它将创建更多(空)提交对象,但收益远大于成本。

发布分支Release branches

可以来自于(特定分支):

develop

必须合并到(特定分支):

developmaster

分支命名约定:

release-*

发布分支为新的生产发布提供支持。它们允许在最后一刻打点和提交……(原文是:They allow for last-minute dotting of i’s and crossing t’s,此句不明?)。此外,它们还允许小的错误修复和为发布准备元数据(版本号、构建日期等)。通过在发布分支上完成所有这些工作,开发分支develop可以接收下一个大型发布的特性。

从开发分支develop拉出新发布分支的关键时刻是开发分支(几乎)反映了新发布的期望状态。至少此刻所有针对要构建的版本的特性都必须合并在开发分支develop中。所有面向未来版本的功能(可能都不是),它们必须等到发布分支被分离后。

正是从发布分支出现开始,即将发布的版本被分配了一个版本号——而不是更早的时候。直到那一刻(指发布分支出现),开发分支develop反映了“下一次发布”的变化,但在发布分支开始之前,尚不清楚“下一版本”最终会变成0.3还是1.0。这个决定是在发布分支开始时做出的,并由项目关于版本号变更的规则执行。

创建发布分支Creating a release branch

发布分支是从开发分支develop创建的。例如,假设1.1.5版本是当前的生产版本,并且我们即将发布一个大版本。开发分支develop的状态已经为“下一个版本”做好了准备,我们已经决定这将成为1.2版(而不是1.1.6或2.0版)。所以我们拉出分支并给为其起一个反映新版本号的名称:

$ git checkout -b release-1.2 develop
Switched to a new branch "release-1.2"
$ ./bump-version.sh 1.2
Files modified successfully, version bumped to 1.2.
$ git commit -a -m "Bumped version number to 1.2"
[release-1.2 74d9424] Bumped version number to 1.2
1 files changed, 1 insertions(+), 1 deletions(-)

在创建一个新分支并切换到该分支后,我们添加版本号。这里,bump-version.sh是一个虚构的shell脚本,它更改了工作副本中的一些文件以反映新版本。(当然,这可以是手动更改,因为某些文件会更改。)然后,提交更改的版本号。

这个新的分支可能会在那里存在一段时间,直到发行版确认推出。在此期间,bug修复可能会应用于此分支(而不是开发分支develop)。严禁在此处添加大型新功能。它们必须合并到开发分支develop中,并且,等待下一个大型版本。

完成发布分支Finishing a release branch

当发布分支的状态准备成为真正的发布时,需要执行一些操作。首先,发布分支被合并到主分支master中(因为主分支master上的每个提交根据定义都是一个新的发布,请记住这点)。接下来,必须标记在主分支master上的提交,以便于将来参考此历史版本。最后,需要将发布分支上所做的更改合并回开发分支develop中,以便将来的发布也包含这些错误修复。

在Git中的前两个步骤:

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2

该版本现已完成,并已标记以供将来参考。

您还可以使用-s或-u<key>标志对标记进行加密签名。

为了保持发布分支中所做的更改,我们需要将这些更改合并回开发分支develop中。在Git中:

$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)

这一步很可能会导致合并冲突(很有可能,因为我们已经更改了版本号)。如果是,请修复并提交。

现在我们真的完成了,发布分支可能会被删除,因为我们不再需要它了:

$ git branch -d release-1.2
Deleted branch release-1.2 (was ff452fe).
修补程序分支hotfix

可以来自于(特定分支):

master

必须合并到(特定分支):

developmaster

分支命名约定:

hotfix-*

img

修补程序分支与发布分支非常相似,因为它们也旨在为新的生产发布做准备,尽管是计划外的。它们产生于必须立即对现场制作版本的不期望状态采取行动。当必须立即解决生产版本中的关键bug时,可以从标记生产版本的主分支上的相应标记分出一个修补程序分支。

本质是团队成员(在开发分支develop上)的工作可以继续,而另一个人正在准备快速的生产修复。

创建修补程序分支Creating the hotfix branch

修补程序分支是从主分支master创建的。例如,假设1.2版是当前正在运行的生产版本,并由于严重的bug而导致问题。但开发分支develop中的变更仍然不稳定。然后,我们可以分离出一个修补程序分支并开始解决问题:

$ git checkout -b hotfix-1.2.1 master
Switched to a new branch "hotfix-1.2.1"
$ ./bump-version.sh 1.2.1
Files modified successfully, version bumped to 1.2.1.
$ git commit -a -m "Bumped version number to 1.2.1"
[hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1
1 files changed, 1 insertions(+), 1 deletions(-)

分离后别忘了添加版本号!

然后,修复bug并在一次或多次单独提交中提交修复。

$ git commit -m "Fixed severe production problem"
[hotfix-1.2.1 abbe5d6] Fixed severe production problem
5 files changed, 32 insertions(+), 17 deletions(-)

完成修补程序分支Finishing a hotfix branch

完成后,bugfix(hotfix)需要合并回主分支master,但也需要合并回开发分支develop,以确保bugfix(hotfix)也包含在下一个版本中。这完全类似于发布分支的完成方式。

首先,更新主分支master并标记发布。

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2.1

您还可以使用-s或-u<key>标志对标记进行加密签名。

接下来,在开发分支develop中也加入错误修复:

$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)

这里的规则有一个例外,当发布分支当前存在时,需要将修补程序更改合并到该发布分支中,而不是开发分支develop。当发布分支完成时,也会将合并到发布分支中的错误修复程序合并到开发分支develop中。(如果开发分支develop中的工作立即需要此错误修复,并且无法等待发布分支完成,那么您也可以安全地将错误修复合并到开发分支develop中。)

最后,删除临时分支:

$ git branch -d hotfix-1.2.1
Deleted branch hotfix-1.2.1 (was abbe5d6).

总结

虽然这个分支模型并没有什么真正令人震惊的新东西,但这篇文章开头的“大图”表现出在我们的项目中非常有用。它形成了一个优雅的心理模型,易于理解,并允许团队成员对分支和发布过程形成共同的理解。

本文翻译自网络:https://nvie.com/posts/a-successful-git-branching-model

本文由飞翔中文网「feixiang.net」翻译

相关文章:

一个成功的Git分支模型

本作品原发布账号为【白鸽子中文网】,现转至当前账号【飞翔中文网】。 反思备录(2020/3/5) 这个模型构思于2010年,现已过去10余年,(2010年)那时正处于Git诞生后不久。在这10年间,git-flow(本文中提到的分支模型) 在许多软件队伍里…...

MySQL 在 CentOS 7 上安装的步骤指南

🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 1. 卸载不需要的环境 2. 获取 MySQL YUM 仓库 3. 安装 MySQL 4. 启动…...

DeepSeek-R1深度解读

deepseek提出了一种通过强化学习(RL)激励大语言模型(LLMs)推理能力的方法,个人认为最让人兴奋的点是:通过RL发现了一个叫“Aha Moment”的现象,这个时刻发生在模型的中间版本中。在这个阶段&…...

吴恩达机器学习笔记复盘(六)梯度下降算法

简介 梯度下降(Gradient Descent)是一种常用的优化算法,广泛应用于机器学习、深度学习等领域,在这里是用于求J(w,b)局部最小值。 我自己觉得这样说有点过于抽象。换个直观点的说法就是,一个人…...

【环境配置】windows下vscode下无法激活conda环境、创建虚拟环境报错

前言 我的本地的系统,绝大部分是使用的ubuntu。去年下半年开始切换成windows,然后windows下使用vscode还需要注意一些小的配置。为了避免反复搜索,这里记录下。   当已经在 windows 下安装了anaconda、vscode,之后的使用有可能存…...

【Linux笔记】动态库与静态库的理解与加载

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】动态库与静态库的制作 🔖流水不争,争的是滔滔不 一、ELF文件二、ELF的形…...

ollama docker设置模型常驻显存

参考: https://github.com/ollama/ollama/issues/5272 https://deepseek.csdn.net/67cfd7c93b685529b708fdee.html 通过-e传入环境变量,ollama运行: docker run -d --gpusall -e OLLAMA_KEEP_ALIVE-1 -v ollama:/root/.ollama -p 11434:114…...

SAP-ABAP:SAP 主数据管理体系深度解析与学习路径介绍

Ⅰ. 主数据体系全景认知 1.1 主数据核心定位 #mermaid-svg-Lf3tZAfcROs5hlN4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Lf3tZAfcROs5hlN4 .error-icon{fill:#552222;}#mermaid-svg-Lf3tZAfcROs5hlN4 .error-t…...

Redis解决缓存击穿问题——两种方法

目录 引言 解决办法 互斥锁(强一致,性能差) 逻辑过期(高可用,性能优) 设计逻辑过期时间 引言 缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这个时间点对…...

FGPA学习(二)实现LED流水灯

目录 一、6个LED灯实现流水灯 (一)实验逻辑 1、时钟和复位信号的处理 2、按键停止信号的处理 3、计数器的计数逻辑 4、LED 状态更新逻辑 (二)代码实现 (三)效果展示 二、vscode插件下载及其模块分…...

【蓝桥杯】每天一题,理解逻辑(4/90)【Leetcode 二进制求和】

题目描述 我们解析一下题目 我们可以理解到两个主要信息 给的是二进制的字符串返回他们的和 我们知道,十进制的加减法需要进位,例如:9716是因为91之后进了一位,二进制也是如此,只不过十进制是逢10进1,二…...

docker利用ollama +Open WebGUI在本地搭建部署一套Deepseek-r1模型

系统:没有限制,可以运行docker就行 磁盘空间:至少预留50GB; 内存:8GB docker版本:4.38.0 桌面版 下载ollama镜像 由于docker镜像地址,网络不太稳定,建议科学上网的一台服务器拉取ollama镜像&am…...

精准git动图拆解​

参考原文:精准git动图拆解​​ 该工具可精准识别并提取.git 动图的每一帧,无论是代码运行演示,还是项目流程展示的动图,都能完美处理。​ 快速格式转换​ 提取的动图帧会快速转换为 PNG 格式。PNG 无损压缩、支持透明背景&…...

让vscode远程开发也可以图形显示

目录 0. 摘要1. 保存查看2. jupyter内置inline渲染3. jupyter浏览器4. matplot修改后端5. SSH X11转发[※]6. 参考 0. 摘要 vscode登录远程服务器进行开发遇到图形显示需求时,该怎么处理?一般有几种方式: 保存下来查看jupyter内置的inline图…...

996引擎 - 红点系统

996引擎 - 红点系统 总结NPC 红点(TXT红点)Lua 红点1. Red_Point.lua2. UI_Ex.lua参考资料以下内容是在三端 lua 环境下测试的 总结 红点系统分几个部分组成。 M2中设置变量推送。 配置红点表。 Envir\Data\cfg_redpoint.xls 2.1. UI元素中找到ID填写 ids 列。 主界面挂载…...

Springboot List集合的校验方式

pom.xml 引入 <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.2.0.Final</version></dependency><dependency><groupId>org.springframework.b…...

基于图像识别的医学影像大数据诊断系统的设计与实现

标题:基于图像识别的医学影像大数据诊断系统的设计与实现 内容:1.摘要 随着医学影像技术的快速发展&#xff0c;医学影像数据量呈爆炸式增长&#xff0c;传统的人工诊断方式在处理海量数据时效率低下且容易出现误差。本研究的目的是设计并实现一个基于图像识别的医学影像大数据…...

黑马node.js教程(nodejs教程)——AJAX-Day01-04.案例_地区查询——查询某个省某个城市所有地区(代码示例)

文章目录 代码示例效果 代码示例 axiosTest.html <!DOCTYPE html> <!-- 文档类型声明&#xff0c;告诉浏览器这是一个HTML5文档 --> <html lang"en"> <!-- HTML根元素&#xff0c;设置文档语言为英语 --><head> <!-- 头部区域&am…...

PySide(PyQt),使用types.MethodType动态定义事件

以PySide(PyQt)的图片项为例&#xff0c;比如一个视窗的场景底图是一个QGraphicsPixmapItem&#xff0c;需要修改它的鼠标滚轮事件&#xff0c;以实现鼠标滚轮缩放显示的功能。为了达到这个目的&#xff0c;可以重新定义一个QGraphicsPixmapItem类&#xff0c;并重写它的wheelE…...

c语言基础编程入门练习题

[编程入门]成绩评定 题目描述 给出一百分制成绩&#xff0c;要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以及90分以上为A&#xff0c;80-89分为B&#xff0c;70-79分为C&#xff0c;60-69分为D&#xff0c;60分以下为E。 输入格式 一个整数0&#xff0d;100…...

汽车安全确认等级-中国等保

1、概念解析 网络安全保证等级&#xff08;Cybersecurity Assurance Level&#xff09;通常指在不同标准或框架下&#xff0c;根据系统或数据的敏感性、重要性以及潜在风险划分的等级&#xff0c;用于指导组织采取相应的安全防护措施。以下是几个常见的网络安全保证等级体系及…...

Quartus + VScode 实现模块化流水灯

文章目录 一、通过VScode编写Verilog代码二、模块化编程三、代码示例 一、通过VScode编写Verilog代码 1、下载Vscode 2、下载相关插件 搜索Verilog就会弹出有如图所示的插件&#xff0c;下载并安装 3、创建Quartus项目 4、创建完成后点击Tools&#xff0c;选择Options 然后在…...

从两指到三指:Robotiq机器人自适应夹持器技术解析

工业自动化离不开高效工具的支持。Robotiq机器人工具凭借其模块化设计和智能化编程技术&#xff0c;提升了设备的灵活性和操作效率。Robotiq机器人工具精准的传感器和自适应夹持器技术&#xff0c;能够满足多样化的应用需求&#xff0c;为制造业、物流和科研等领域提供可靠的解…...

网络安全应急入门到实战

奇安信&#xff1a;95015网络安全应急响应分析报告&#xff08;2022-2024年&#xff09;官网可以下载 https://github.com/Bypass007/Emergency-Response-Notes 应急响应实战笔记 网络安全应急响应技术实战指南 .pdf 常见场景 第4章 勒索病毒网络安全应急响应 第5章 挖矿木…...

Flutter IconButton完全指南:高效使用与性能优化秘籍

目录 一、引言 二、IconButton 的基本用法 三、 进阶技巧 3.1 自定义形状与背景 3.2 带文本的 IconButton&#xff08;使用 Column 组合&#xff09; 3.3 自定义交互反馈 3.4 动态图标切换 3.5 组合式按钮&#xff08;图标 文字&#xff09; 四、高级应用 4.1 与主题…...

跨国生产制造企业:如何破解远距离数据传输难题?

在全球制造业数字化转型的背景下&#xff0c;跨国生产制造企业的文件传输需求正呈现指数级增长。无论是设计图纸、生产计划、质量控制数据&#xff0c;还是供应链协同信息&#xff0c;跨国文件传输已成为制造业高效运营的核心环节。 然而&#xff0c;制造业文件大数据传输具有文…...

大模型如何赋能安全防御?威胁检测与漏洞挖掘的“AI革命”

&#x1f680; 引言&#xff1a;大模型是“安全守护神”还是“双刃剑”&#xff1f; 当黑客用AI生成恶意代码&#xff0c;安全团队也能用大模型“魔法打败魔法”&#xff01; 划重点&#xff1a;大模型不仅是“生产力工具”&#xff0c;更是安全防御的“智能武器库”&#xff0…...

uniapp常用组件

写在前面 今天将uniapp中的组件都过了一遍&#xff0c;上手难度不大&#xff0c;但是还是遇到了一些问题&#xff1a; HBuilder实在是太难用&#xff0c;不管是插件生态还是设计之类的&#xff0c;总之就是用的哪哪不顺手虽然打开内置浏览器是挺方便的&#xff0c;但是不知道…...

Oracle OCP认证没落了吗?

Oracle OCP认证没落了吗? Oracle的OCP认证是数据库领域必考的一个认证&#xff0c;但随着国产化的发展&#xff0c;国内很多企业开发了自己的数据库产品&#xff0c;这种情况对很多人造成了错误的认识&#xff1a;OCP被淘汰了吗?不然&#xff0c;从行业需求、技术趋势、认证体…...

洛谷 P3986 斐波那契数列

P3986 斐波那契数列 题目描述 定义一个数列&#xff1a; f ( 0 ) a , f ( 1 ) b , f ( n ) f ( n − 1 ) f ( n − 2 ) f(0) a, f(1) b, f(n) f(n - 1) f(n - 2) f(0)a,f(1)b,f(n)f(n−1)f(n−2) 其中 a, b 均为正整数&#xff0c;n ≥ 2。 问有多少种 (a, b)&…...

使用fastapi部署stable diffusion模型

使用vscode运行stable diffusion模型&#xff0c;每次加载模型都需要10分钟&#xff0c;为算法及prompt调试带来了极大麻烦。使用jupyter解决自然是一个比较好的方案&#xff0c;但如果jupyter由于种种原因不能使用时&#xff0c;fastapi无疑成为了一个很好的选择。 参考github…...

PyTorch使用(3)-张量类型转换

文章目录 张量类型转换1. 张量转换为 numpy 数组1.1. 默认行为&#xff1a;共享内存1.2. 避免内存共享1.2.1. 使用 .copy()1.2.2. 使用 torch.clone() .numpy() 1.3. 处理 GPU 张量1.4. 分离梯度跟踪1.5. 代码示例1.6. 关键注意事项1.7. 总结 2. 标量张量和数字的转换2.1. tor…...

基于FPGA的DDS连续FFT 仿真验证

基于FPGA的 DDS连续FFT 仿真验证 1 摘要 本文聚焦 AMD LogiCORE IP Fast Fourier Transform (FFT) 核心,深入剖析其在 FPGA 设计中的应用。该 FFT 核心基于 Cooley - Tukey 算法,具备丰富特性,如支持多种数据精度、算术类型及灵活的运行时配置。文中详细介绍了其架构选项、…...

【Spring 默认是否管理 Request 和 Session Bean 的生命周期?】

要测试 Spring 默认是否管理 Request 和 Session 作用域的 Bean 的生命周期&#xff0c;可以通过以下步骤实现&#xff1a; 验证 Spring 是否创建了 Bean&#xff1a;检查 Spring 容器是否成功加载并管理了 Request 和 Session 作用域的 Bean。验证 Bean 的生命周期回调方法是…...

Git的基本指令

一、回滚 1.git init 在项目文件夹中打开bash生成一个.git的子目录&#xff0c;产生一个仓库 2.git status 查看当前目录下的所有文件的状态 3.git add . 将该目录下的所有文件提交到暂存区 4.git add 文件名 将该目录下的指定文件提交到暂存区 5.git commit -m 备注信…...

【微信小程序(云开发模式)变通实现DeepSeek支持语音】

整体架构 前端&#xff08;微信小程序&#xff09;&#xff1a; 使用微信小程序云开发能力&#xff0c;实现录音功能。将录音文件上传到云存储。调用云函数进行语音识别和 DeepSeek 处理。界面模仿 DeepSeek&#xff0c;支持文本编辑。 后端&#xff08;云函数 Node.js&#…...

前端使用 crypto-js库AES加解密

前端使用 crypto-js库AES加解密 为什么需要前端加密&#xff1f; 现在项目使用http协议&#xff0c;且登录界面的用户登录密码是明文传输&#xff0c;项目真正上线后&#xff0c;存在信息泄露风险。 所以准备用前端框架加密处理用户输入的密码再传输。 crypto-js 库 crypto…...

七天MySQL密集学习计划

七天MySQL密集学习计划 第1天&#xff1a;MySQL基础和环境搭建 上午&#xff08;理论安装&#xff09; 数据库基本概念MySQL是什么关系型数据库基础安装MySQL Windows/Mac下安装步骤MySQL Workbench安装 基本配置和连接 下午&#xff08;基础操作&#xff09; 数据库和表的…...

Python程序常用的配置文件格式及例子(上)

Python 中常用的配置文件格式有多种&#xff0c;每种格式都有其特点和适用场景。以下是常见的配置文件类型及简要说明&#xff1a; 1. INI 格式 特点&#xff1a;简单键值对&#xff0c;支持分节&#xff08;Section&#xff09;。文件扩展名&#xff1a;.ini, .cfgPython 库&…...

Go语言对于MySQL的基本操作

一.下载依赖 终端中输入&#xff1a; go get -u github.com/go-sql-driver/mysql 导入包 import ("database/sql"_ "github.com/go-sql-driver/mysql" ) 二.案例 package main//go get-u github.com/go-sql-driver/mysql 获取驱动 import ("databa…...

一键批量txt转DWG,DWG转txt——插件实现 CAD c#二次开发

如下图&#xff0c;我们有大量dwg需要转为txt格式&#xff0c;或txt格式坐标需要转为dwg格式&#xff0c;此插件可一键完成一个文件夹下所有文件的转换。 插件使用方式 命令行输入&#xff1a; netload 加载此dll插件&#xff0c; 输入&#xff1a; dwg2txt 可将dwg转为t…...

SpringBoot 集成 Minio (附带工具类)

Minio 官方文档&#xff1a; https://www.minio.org.cn/docs/minio/container/index.html MinIO是一个对象存储解决方案&#xff0c;它提供了与Amazon Web Services S3兼容的API&#xff0c;并支持所有核心S3功能。 MinIO有能力在任何地方部署 - 公有云或私有云&#xff0c;裸…...

图论——Prim算法

53. 寻宝(第七期模拟笔试) 题目描述 在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。 不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通…...

Linux系统上后门程序的原理细节,请仔细解释一下

在Linux系统上&#xff0c;后门程序通常通过隐蔽的方式绕过正常的安全机制&#xff0c;允许攻击者未经授权访问系统。以下是其工作原理的详细解释&#xff1a; 1. 隐蔽性 隐藏进程&#xff1a;后门程序常通过修改进程列表或使用rootkit技术隐藏自身&#xff0c;避免被ps、top…...

Cursor与Blender-MCP生成3D模型

随着DeepSeek的热度&#xff0c;各行各业接入AI智能&#xff0c;当然作为一个深受3D爱好者喜爱的软件——Blender&#xff0c;也接入了AI智能&#xff0c;通过Blender-MCP&#xff0c;开启一场Blender的智能化模型创建的世界之旅。 目录 1.准备工作2.环境配置2.1 Mac安装2.2 W…...

Object 转 JSONObject 并排除null和““字符串

public static JSONObject objToJSONObject(Object obj) throws Exception{//创建一个 HashMap 对象 map&#xff0c;用于存储对象的属性名和属性值。//key 是属性名&#xff08;String 类型&#xff09;&#xff0c;value 是属性值&#xff08;Object 类型&#xff09;Map<…...

物联网为什么用MQTT不用 HTTP 或 UDP?

先来两个代码对比&#xff0c;上传温度数据给服务器。 MQTT代码示例 // MQTT 客户端连接到 MQTT 服务器 mqttClient.connect("mqtt://broker.server.com:8883", clientId) // 订阅特定主题 mqttClient.subscribe("sensor/data", qos1) // …...

LeetCode135☞分糖果

关联LeetCode题号135 本题特点 贪心两次遍历&#xff0c;一次正序遍历&#xff0c;只比较左边&#xff0c;左边比右边大的情况 i-1 i一次倒序遍历&#xff0c;只比较右边的&#xff0c;右边比左边大 i1 i 本题思路 class Solution:def candy(self, ratings: List[int]) -&g…...

YOLO魔改之频率分割模块(FDM)

目标检测原理 目标检测是一种将目标分割和识别相结合的图像处理技术,旨在从图像中定位并识别特定目标。深度学习方法,如Faster R-CNN和YOLO系列,已成为主流解决方案。这些方法通常采用两阶段或单阶段策略,通过卷积神经网络(CNN)提取特征并进行分类和定位。 在小目标检测中…...

AI学习——卷积神经网络(CNN)入门

作为人类&#xff0c;我们天生擅长“看”东西&#xff1a;一眼就能认出猫狗、分辨红绿灯、读懂朋友的表情……但计算机的“眼睛”最初是一片空白。直到卷积神经网络&#xff08;CNN&#xff09;​的出现&#xff0c;计算机才真正开始理解图像。今天&#xff0c;我们就用最通俗的…...