企业开发工具git的使用:从入门到高效团队协作
前言:本文介绍了Git的安装、本地仓库的创建与配置,以及工作区、暂存区和版本库的区分。详细讲解了版本回退、撤销修改等操作,并深入探讨了分支管理,包括分支的创建、切换、合并、删除及冲突解决。此外,还介绍了远程操作,如远程仓库的创建与克隆,分布式版本控制的理解。最后,文章总结了系统开发环境和Git分支设计规范,强调了不同分支在开发、测试、预发布和生产环境中的作用。通过本文,您可以全面掌握Git的核心功能及其在团队协作中的应用。
目录
认识git
git安装
创建本地仓库
配置本地仓库
工作区、暂存区、版本库
版本回退
撤销修改
删除文件
分支管理
分支管理的理解
分支的创建、切换、合并
删除分支
合并冲突
bug分支
强制删除分支
远程操作
理解分布式版本控制
远程仓库创建
克隆远程仓库
编辑
git标签管理
多人协作1(单分支)
多人协作2(多分支)
系统开发环境
Git分支设计规范
本地操作
git安装
安装:
linux Centos:
sudo yum install git -y
linux Ubuntu:
sudo apt-get install git -y
查看版本:
git --version
创建本地仓库
git并不是对任意位置的文件都能维护,我们需要创建本地仓库,如下:
创建目录gitcode:
mkdir gitcode
初始化
git init
git init:初始化一个新的 Git 仓库。它的作用是将当前目录转换为一个 Git 仓库(或创建一个空的 Git 仓库),从而允许 Git 开始跟踪该目录下的文件变更。
初始化完成后,可以发现目录下多了一个隐藏目录.git
注意:不要手动修改.git目录里的内容。
配置本地仓库
创建完仓库后注意name 和 email必须配置,要不然后续会出现各种问题。如下:
git config user.name 用户名
git config user.name 电子邮件
查看配置结果:
git config -l
删除配置:
git config --unser user.name
git config --unser user.email
让配置文件在所有仓库中都生效(加--global选项即可),如下:
git config --global user.name 用户名
git config --global user.email 电子邮件
删除配置(加--global选项)
git config --global --unser user.name
git config --global --unser user.email
工作区、暂存区、版本库
如上我们在新建目录gitcode,并用git init指令初始化得到.git目录。其中gitcode目录下称为工作区,而.git目录下就是版本库。
我们在对文件进行操作是在工作区的,但并未得到git的管理,还需要把它放到.git里。
注意:不能对.git目录直接操作,会导致其内部结构错乱。应使用相关指令进行操作。
- ⼯作区:是在电脑上你要写代码或⽂件的⽬录。
- 暂存区:英⽂叫 stage 或 index。⼀般存放在 .git ⽬录下的 index ⽂件(.git/index)中,我们把暂存区有时也叫作索引(index)。
- 版本库:⼜名仓库,英⽂名 repository 。⼯作区有⼀个隐藏⽬录 .git ,它不算⼯作区,⽽是 Git 的版本库。这个版本库⾥⾯的所有⽂件都可以被 Git 管理起来,每个⽂件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
.git里面还有一个对象库,修改的工作区内容会写入对象库的一个新的git对象中。
使用指令:
- git add 文件名
把工作区的文件存储到暂存区,add后面可跟多个文件,后面跟 .(点)表示所有文件。
使用指令:
- git commit -m "xxxx"
把暂存区数据推送到版本库。其中xxxx表示你对此次修改的描述。
示例:
- git log:查看提交记录,按时间从近到远。
- git log --pretty=oneline:加选项--pretty=oneline,更简洁美观的显示,如下:
其中黄色高亮的地方为<commit-id>是 Git 提交的哈希值,用来标识文件的唯一性。
使用指令:git cat-file -p <commit-id>,用于查看 Git 对象的原始内容,其中 -p
表示 "pretty-print"(格式化输出)。
修改文件
Git追踪管理的其实是修改,而不是整个文件。
修改文件readme,添加文本hello git
使用git status查看工作状态,如下:
Git能追踪到文件readme被修改,并显示出“建议进行 git add和git commit”的字眼。
- git diff 文件名:查看暂存区和工作区的文件差异,如下:
- a:改动前
- b:改动后
- ---:改动前
- +++:改动后
指令:
- git diff HEAD -- 文件名:查看版本库和工作区的文件差异。
接下来进行add和commit,同时过程状态的变化:
版本回退
指令:git reset [--soft | --mixed | hard ] [HEAD]
- soft:只回退版本库内容。
- mixed(默认选项):回退版本库和暂存区内容。
- hard(慎用):回退所有区域的内容。
- HEAD:当前版,也可以填写指定的<commit-id>。
现有两个版本的readme内容,老版本hello git,新版本hello git和hello word,下面简写为git和world:
以--hard选项为例 测试:
那么如果我们回退后,后悔了想要回到刚才的状态怎么办?
再次通过git log查<commit-id>是查不到的,如下:
我们使用指令:git reflog即可查看,如下:
里面记录你做过的各种操作,其中黄色高亮的为<commit-id>,“缩短版”的,但依旧能对得上。如下:
版本回退过程是非常快的,为什么回退那记录?
git版本库中主分支master指向当前版本的索引,即<commit id>,要进行版本回退,只需要改变master的指向即可。
撤销修改
写了一半写不下去了,想重新开始写该怎么办?总不能一一删除重新写吧,我们更想要得到的是在最初开始写的状态。
而且我们写的代码可能已经推到暂存区,或版本库了,要怎么把它撤销?
解决方法:
场景一:
- 手动删(不推荐)
- git指令:git checkout -- 文件名
场景二:
- 指令git reset HEAD(回退到版本库当前版本)再用git checkout -- 文件名。
- 直接用git reset --hard HEAD。
场景三:
- 指令:git reset --hard HEAD^
对于版本选项:
- commit id:指定版本
- HEAD:当前版本
- HEAD^:上一个版本
- HEAD^^:上上个版本
- ......
注意:一旦代码推送到远程仓库就不能再撤销了,撤销的目的就是不影响远程仓库。远程仓库下文会讲解。
撤销修改:对提交过程的撤回。即工作区->暂存区->版本库这个过程的撤回。主要是把撤销回到工作区。
删除文件
新增文件或删除文件也是一种修改,要删除暂存区或版本库文件,只需要删除工作区文件,然后进行add和commit即可。
可简化为两步:
- git rm 文件名:工作区,暂存区文件都被删除。
- git commit -m “xxxx”:版本库文件删除。
分支管理
分支管理的理解
Git 的杀手锏之⼀:分⽀。分⽀就是科幻电影⾥⾯的平⾏宇宙,当你正在电脑前努⼒学习 C++ 的时候,另⼀个你正在另⼀个平⾏宇宙⾥努⼒学习 JAVA。如果两个平⾏宇宙互不⼲扰,那对现在的你也没啥影响。不过,在某个时间点,两个平⾏宇宙合并了,结果,你既学会了 C++ ⼜学会了 JAVA!
一个团队要开发一个项目,每个让可以延伸出一条分支,各自开发者负责自己的功能,最后进行测试再把它们进行合并在一起。
主分支master:是git最原始的分支,是整个git分支的跟。
分支的创建、切换、合并
- git branch:查找分支。
其中我们会发现master前面有一个*,表示head指针指向master分支,也就是当前正在master分支下工作。
- head指针:在开发过程中会有很多分支,head可以指向任意分支,head指向的分支为当前正在工作的分支。即*
使用cat查看HEAD内容,如下:
创建分支
- git branch 分支名
示例:
查看.git结构,如下新增dev:
图解:
注意:创建新分支(dev分支)的“根”是当前所在的分支。新分支的内容是基于最新提交的内容。
- git checkout 分支名:切换分支
然后在dev分支下工作,最后合并到主分支。
合并分支:
- git merge 分支名
注意:不能在dev分支下合并dev分支。只能在dev分支下合并master,或在master下合并dev。
删除分支
合并后dev分支使命就结束了,最好把它删除。
- git branch -d 分支名:删除分支,注意不能在dev分支上删dev分支。
合并冲突
如果我们在基于a分支新增分支b,然后在b上修改,同时a分支也把数据修改,此时再把两者合并时就会产生冲突。
如上图,合并时会发生冲突,bbb和ccc只能保留一个,谁去谁留由程序员手动修改来决定。
测试:
- 指令:git checkout -b dev1
创建并同时切换到分支dev1。
打开冲突文件file,可以发现git给我们添加<<<<<HEAD,=========,>>>>>>>dev这样的字眼,用来把两个文件新增内容区分开:
现在需要合并,可以在master分支上删除ccc,然后进行add,commit,再进行合并。或者在dev1分支上删除bbb,然后进行add,commit,再合并。
注意:添加的这些提示字眼也要删除。
merge冲突需要手动解决,然后重新提交合并。
- git log --graph --abbrev-commit:图示显示提交过程
合并模式
如果我们创建分支dev2并且不产生冲突,进行合并,如下:
Fast-forward代表“快进模式”,Fast-forword模式(即ff)不能通过图示区分是merge提交还是正常提交,如下:
建议在合并时,不使用fast-forword模式,即添加--no-ff选项,并且添加描述信息,-m选项。
- git merge --no-ff -m “xxxxx” 分支名
分支策略
保证主分支的稳定性
多人开发
bug分支
master出bug怎么办?master不是100%没bug。为保险起见不要直接在master主分支上直接修改。
首先使用指令:git stash
这是一个非常有用的 Git 命令,它允许你临时保存工作目录和暂存区的修改,而无需提交这些更改。当你需要快速切换分支但又不想提交未完成的工作时,stash 就特别有用。
怎么理解stash呢?
首先要明白,一个文件无论在任何分支下进行修改,只要没有进行add和commit,就不属于任何分支,而是属于工作区,并未涉及版本库。那么内容还不够完善我们并不想进行add或commit,又想让它属于某个分支要怎么办?使用git stash把数据保留在当前分支。
好的,言归正传,假设我们已经基于master分支创建新的分支dev3,并且在dev3分支中进行了开发,但突然发现原来分支中master有bug,该怎么解决?
- 保存数据:首先使用git stash指令保存当前分支的数据。
- 修复bug:切回到master分支,在此之上创建新的分支,假设为 fix_bug,在fix_bug分支上把bug修复,然后合并回master。
- 回到dev3上继续开发(git stash pop:恢复最近的stash),开发完成进行add和commit。
- 因为在dev3开发期间master已经修改(bug修复),所以dev3与master合并时会出现冲突。
- 冲突解决:为了保证master主分支的稳定性,把master合并到dev3中,在dev3中解决冲突(即删除bug代码)。
- 冲突解决后dev3进行add和commit,再次进行合并。
关于stash的简单使用:
- git stash:把当前工作区数据保存到stash中。
- git stash list:查看stash中有那些内容。
- git stash pop:恢复最近的stash。
在解决冲突时可能会误操作,弄出bug!所以在dev3上合并。
测试后再合并到master。
强制删除分支
比如在写某个功能时创建了一个分支,但写到一半时(此时没有进行合并)发现,这个功能根本没必要写,把分支删除吧。
此时使用指令git branch -d无法删除,该指令只适用于合并后对分支删除,没合并会失败。
- git branch -D:强行删除。
远程操作
理解分布式版本控制
我们⽬前所说的所有内容(⼯作区,暂存区,版本库等等),都是在本地!也就是在你的笔记本或者计算机上。⽽我们的 Git 其实是分布式版本控制系统!什么意思呢?
可以简单理解为,我们每个⼈的电脑上都是⼀个完整的版本库,这样你⼯作的时候,就不需要联⽹了,因为版本库就在你⾃⼰的电脑上。既然每个⼈电脑上都有⼀个完整的版本库,那多个⼈如何协作呢?⽐⽅说你在⾃⼰电脑上改了⽂件A,你的同事也在他的电脑上改了⽂件A,这时,你们俩之间只需把各⾃的修改推送给对⽅,就可以互相看到对⽅的修改了。
但是这样存在一个问题,要是自己电脑或对方电脑坏了怎么办,数据不就找不回来了嘛。
在实际中使⽤分布式版本控制系统的时候,其实很少在两⼈之间的电脑上推送版本库的修改,因为可能你们俩不在⼀个局域⽹内,两台电脑互相访问不了。也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有⼀台充当“中央服务器”的电脑,但这个服务器的作⽤仅仅是⽤来⽅便“交换”⼤家的修改,没有它⼤家也⼀样⼲活,只是交换修改不⽅便⽽已。有了这个“中央服务器”的电脑,这样就不怕本地出现什么故障了(⽐如运⽓差,硬盘坏了,上⾯的所有东西全部丢失,包括git的所有内容)
中央服务器:24小时开机。
主要流行的有国外的GitHub和国内的gitee(码云),下面我以gitee为例,讲解如何使用。
远程仓库创建
- 首先注册或登录gitee
- 创建仓库:
新建仓库的界面:
创建仓库并打开,我们可以发现它比本地仓库多了三个文件,.gitfnore,README.en.md,README.md,如下:
.gitgnore文件:用来过滤不需要的文件,我们打开查看:
其中#表示注释,*.swf表示过滤所有.swf后缀的文件。
我们可以手动对.gitgnore文件进行编辑,如果添加!a.swf表示a.swf文件不可被忽略。因为我们通常都不会把文件一个一个的推送到远程,而是批量的推送,所以有些不重要的,无关的文件就会被推送上去,有了.gitgnore文件后起到了过滤的效果。
如果你的文件已经被 .gitignore
忽略,但仍然想强制添加到 Git 中,可以使用 git add -f
(或 --force
)命令。
- git check-ignore -v 文件名:检查一个文件是否已经被忽略
Readme:管理者(我们)来编辑Readme文件,填写一些项目的介绍等,让读者快速了解项目的大体结构和功能,提供两个模板:README.md为中文版,README.en.md为英文版。
issue模板:开发者(用户)在使用你的服务或使用你的代码过程中可能会发现一些bug,或者提出一些优化建议,Issue 模板 的主要作用是规范用户提交 Issue 的格式和内容,帮助项目维护者更高效地收集、分类和处理问题或建议。
pull request模板:一个团队成员(或贡献者)在开发项目过程中,会基于你提供的主分支去创建一些子分支,进行功能开发,完成功能开发后会向你请求合并。Pull Request模板的作用是规范贡献者提交代码合并请求的格式和内容,帮助项目维护者高效审查代码、减少沟通成本,并提升协作质量。
Issues为例:
仓库成员管理:
成员角色 | 权限 |
---|---|
访客(登录用户) | 对于公有仓库:创建 Issue、评论、Clone 和 Pull 仓库、打包下载代码、Fork 仓库、 Fork 仓库提交 Pull Request、下载附件 |
报告者 | 继承访客的权限。 私有仓库:不能查看代码、不能下载代码、不能 Push 、不能 Fork 、 不能提交 Pull Request、可下载附件,不能上传附件,不能删除附件 |
观察者 | 继承报告者权限 私有仓库:创建 Wiki、可以 Clone 下载代码、可以 Pull、不能 Fork |
开发者 | 创建 Issue、评论、Clone 和 Pull 仓库、Fork 仓库、打包下载代码、创建 Pull Request、 创建分支、推送分支、删除分支、创建 Issue 标签(里程碑)、 创建 Wiki、可上传附件,可删除自己上传的附件,不能删除他人上传的附件、 |
管理员 | 创建 Issue、评论、Clone 和 Pull 仓库、打包下载代码、创建 Pull Request、 创建分支、推送分支、删除分支、创建 Issue/Pull Request 标签(里程碑)、创建 Wiki、 添加仓库成员、强制推送分支、编辑仓库属性、可上传附件,可删除自己或他人上传的附件、 不能转移/清空/删除仓库 |
仓库成员权限说明 - Gitee.com
克隆远程仓库
克隆远程仓库(Clone a Remote Repository) 是指将网络上的 Git 仓库(如 Gitee、GitHub、GitLab 等平台上的项目)完整复制到本地计算机的操作。
https模式
这里介绍两种方式:
- ssh:需要公钥加密,然后克隆。
- https:直接克隆即可
https模式:
打开xshell,创建或选择一个目录,执行以下指令:
git clone 远端仓库链接
注意:不能在本地git仓库里执行这个命令。
fetch和push 表示拥有拉权限和推权限。
origin是一个默认的远程仓库别名(Remote Alias),它指向你克隆(git clone
)的原始远程仓库地址。它是 Git 用来标识远程仓库的快捷方式,方便后续操作(如推送、拉取代码等)。当你执行 git clone
时,Git 会自动将远程仓库地址命名为 origin
。
ssh模式
和https同样的方法,进行克隆:
如下,我们是无法进行克隆的,因为没有公钥。
需要把本地服务器公钥放到git上进行管理。
打开gitee设置->打开ssh公钥->设置公钥。
获取公钥:打开本地主目录(如linux的root目录下)->在文件.ssh下看有没有id_rsa(私钥)和id_rsa.pub(公钥),如果没有先使用指令生成公钥,如下:
- ssh-keygen -t rsa -C "电子邮件"
执行命令后一直回车即可。
注意:电子邮件要和gitee的保持一致。看邮箱:打开gitee设置->邮箱管理。
然后复制id_rsa.pub文件的内容,粘贴到gitee公钥配置的位置,点击确定生成公钥。完成以上操作后再进行克隆。
多人协作时可配置多个公钥。
ssh模式的好处:
-
SSH 使用密钥对认证(公钥+私钥),只要本地私钥配置正确且添加到远程仓库(如 GitHub、GitLab),克隆或推送时无需重复输入账号密码。
-
HTTPS 克隆可能需要每次输入密码(除非配置凭据缓存或使用 Personal Access Token)。
-
SSH 通过非对称加密通信,防止中间人攻击(如果服务器指纹受信任)。
-
HTTPS 虽然也加密,但若使用密码认证且未配置二次验证,可能存在风险(例如密钥泄露)。
远程推送操作
把本地版本库的文件推送到远端:
- git push origin <本地分支> : <远端分支>
把远端的数据拉取到本地:
- git pull origin <远端分支> : <本地分支>
注1:要成功推送,必须保证本地的数据要新于远端的数据,如果不够新,则先使用git pull拉取。其次就算没有最新代码也pull一下,是一个好习惯。
注2:配置 user.name和user.email和远端一样。
注3:pull不仅拉取,还顺便进行了合并。
推拉操作
配置命令别名
- git config --global alias.别名 原名
--global选项:全局生效。
所有git命令都能配置别名。
例如:
git标签管理
- 给最新提交版本打标签:git tag 标签名
- 给指定版本打标签:git tag 标签名 <commit-id>
- 看有那些标签:git tag
- 查看指定标签的详细信息:git show 标签名
- 给标签加描述:git tag 标签名 -m “xxxx” [<commit-id>]
- 删除标签:git tag -d 标签名
推送标签
- 推送指定标签:git push origin 标签名
- 推送所有标签:git push origin --tags
删除标签有两种方法:1.本地删除然后推送到远端。2.远端删除。
以方法1为例,假设要删除标签v1.0,:
1.本地删除:
- git tag -d v1.0
2.删除结果推送到远端
- git push origin : v1.0
多人协作1(单分支)
目标:master分支下file.txt文件新增代码"aaa", "bbb"
实现:开发者1新增"aaa",开发者2新增"bbb"
条件在同一分钟下协作完成。
一、远端操作:新建一个分支,名为dev
二、本地操作:
开发者1:
- 克隆远程仓库。
- 创建本地分支dev。
- vim创建并打开文件file.txt,添加"aaa"。
- 进行add,commit和push,推送到远程。
第2部,在创建本地分支dev时可以顺便与远程的dev分支做连接。使用指令:git checkout -b dev origin/dev
- checkout:创建分支
- -b:切换到创建的分支
- dev:分支名
- origin/dev:与远程分支dev建立连接
建立连接有什么用呢?建立连接后推送时直接使用git push即可,拉取时直接使用git pull,而不需要使用指令git push origin <本地分支> : <远端分支>。
刚才是创建分支的同时建立连接,如果创建完分支后才想起来要建立连接怎么办呢?
使用指令:git branch --set-upstream-to=origin/dev dev
git branch -a:查看所有分支情况,即本地分支和远程分支。如下:
如果没有显示对应的远程分支,使用git pull指令会把远程分支同步到本地。
git branch -vv:查看本地分支与远程分支的连接情况。如下:
开发者2:
- 克隆远程仓库。
- 创建本地分支dev。
- vim创建并打开文件file.txt,添"bbb"。
- 进行add,commit和push,推送到远程。
对于第二部的细节与以上所讲相同。
对于第四部,如果开发者1先推送了file.txt,开发者2再推送就会发生冲突,即与远端的file.txt发生冲突。如何处理冲突?
把远端的文件pull拉取下来,然后修改file.txt,让本地的file.txt同时有aaa和bbb。然后重头开始执行第四部。
三、最后把远程dev合并到master,两种方法:
方法1:
申请并填写合并申请单:
对于管理者,进行代码测试和审核,然后合并:
方法二:在本地合并后推送到远程的master分支(不推荐)。
最后dev分支用完就可以删了。
多人协作2(多分支)
目标:远端master分支下新增function1和function2。
实现:开发者1新增function1,开发者2新增function2。
条件:在不同分支下协作完成。
该协作方式更为灵活,有各自的分支实现对应的功能。
一、远程操作:在远程创建dev1和dev2分支分别给开发者1和开发者2使用。
二、本地操作:
开发者1:
- 如果没有克隆仓库先克隆。
- 创建自己的本地dev1分支并与远程dev1分支连接。
- 创建并编辑文件function1。
- 进行add,commit和push
开发者2:
- 如果没有克隆仓库先克隆。
- 创建自己的本地dev2分支并与远程dev2分支连接。
- 创建并编辑文件function2。
- 进行add,commit和push
注意:无论是开发者1还是开发者2在push之前都建议执行指令git pull,保证本地仓储数据和远程仓库同步。
三、远程操作:申请合并单把dev1和dev2合并到master主分支。
如果合并过程有冲突,我们在的次分支下解决冲突,再合并到master分支,如下:
系统开发环境
- 开发环境:开发环境是程序猿们专⻔⽤于⽇常开发的服务器。为了开发调试⽅便,⼀般打开全部错误报告和测试⼯具,是最基础的环境。
- 测试环境:⼀个程序在测试环境⼯作不正常,那么肯定不能把它发布到⽣产机上。该环境是开发环境到⽣产环境的过渡环境。
- 预发布环境:该环境是为避免因测试环境和线上环境的差异等带来的缺陷漏测⽽设⽴的⼀套环境。其配置等基本和⽣产环境⼀致,⽬的是能让我们发正式环境时更有把握!所以预发布环境是你的产品质量最后⼀道防线,因为下⼀步你的项⽬就要上线了。要注意预发布环境服务器不在线上集成服务器范围之内,为单独的⼀些机器。
- ⽣产环境:是指正式提供对外服务的线上环境,例如我们⽬前在移动端或PC端能访问到的APP都是⽣产环境。开发人员不能直接把代码部署到用户能访问到的服务器,而是有自己的服务器。即环境隔离。
Git分支设计规范
Git分支有很多模型,其中Git Flow模型被广泛使用,如下:
分⽀ | 名称 | 适⽤环境 |
master | 主分⽀ | ⽣产环境 |
release | 预发布分⽀ | 预发布/测试环境 |
develop | 开发分⽀ | 开发环境 |
feature | 需求开发分⽀ | 本地 |
hotfix | 紧急修复分⽀ | 本地 |
注:以上表格中的分⽀和环境的搭配仅是常⽤的⼀种,可视情况⽽定不同的策略。
图示:
- master分⽀:master 为主分⽀,该分⽀为只读且唯⼀分⽀。⽤于部署到正式发布环境,⼀般由合并release 分⽀得到。主分⽀作为稳定的唯⼀代码库,任何情况下不允许直接在 master 分⽀上修改代码。 产品的功能全部实现后,最终在master分⽀对外发布,另外所有在master分⽀的推送应该打标签(tag)做记录,⽅便追溯。master分⽀不可删除。
- release分⽀:release 为预发布分⽀,基于本次上线所有的 feature 分⽀合并到 develop 分⽀之后,基于 develop 分⽀创建。可以部署到测试或预发布集群。命名以 release/ 开头,建议的命名规则: release/version_publishtime 。release 分⽀主要⽤于提交给测试⼈员进⾏功能测试。发布提测阶段,会以 release 分⽀代码为基准进⾏提测。如果在 release 分⽀测试出问题,需要回归验证 develop 分⽀看否存在此问题。release 分⽀属于临时分⽀,产品上线后可选删除。
- develop分⽀:develop 为开发分⽀,基于master分⽀创建的只读且唯⼀分⽀,始终保持最新完成以及 bug 修复后的代码。可部署到开发环境对应集群。可根据需求⼤⼩程度确定是由 feature 分⽀合并,还是直接在上⾯开发(⾮常不建议)。
- feature 分⽀:feature 分⽀通常为新功能或新特性开发分⽀,以 develop 分⽀为基础创建 feature 分⽀。命名以 feature/ 开头,建议的命名规则: feature/user_createtime_feature 。新特性或新功能开发完成后,开发⼈员需合到 develop 分⽀。⼀旦该需求发布上线,便将其删除。
- hotfix 分⽀:hotfix 分⽀为线上 bug 修复分⽀或叫补丁分⽀,主要⽤于对线上的版本进⾏ bug 修复。当线上出现紧急问题需要⻢上修复时,需要基于 master 分⽀创建 hotfix 分⽀。命名以 hotfix/ 开头,建议的命名规则: hotfix/user_createtime_hotfix 当问题修复完成后,需要合并到 master 分⽀和 develop 分⽀并推送远程。⼀旦修复上线,便将其删除。
非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!
相关文章:
企业开发工具git的使用:从入门到高效团队协作
前言:本文介绍了Git的安装、本地仓库的创建与配置,以及工作区、暂存区和版本库的区分。详细讲解了版本回退、撤销修改等操作,并深入探讨了分支管理,包括分支的创建、切换、合并、删除及冲突解决。此外,还介绍了远程操作…...
【git config --global alias | Git分支操作效率提升实践指南】
git config --global alias | Git分支操作效率提升实践指南 背景与痛点分析 在现代软件开发团队中,Git分支管理是日常工作的重要组成部分。特别是在规范的开发流程中,我们经常会遇到类似 feature/user-management、bugfix/login-issue 或 per/cny/dev …...
VR 互动实训与展示,借科技开启沉浸式体验新篇
对于企业而言,产品设计与展示是极为关键的环节,这直接关系到能否成功吸引客户,以及精准获取市场反馈。在当下科技飞速发展的时代,VR 互动实训为这一至关重要的环节注入了全新活力,带来了前所未有的体验。以某智能家居企…...
一文了解VR拍摄制作
虚拟现实(VR)技术通过计算机技术模拟环境,使用户能够身临其境地沉浸在虚拟世界中进行交互体验。 在VR拍摄中,主要利用这一技术来创建360度全景视频或图片,让观众能够全方位地感受拍摄场景。这种拍摄方式不仅改变了我们…...
【内测征集】LarkVR 播控系统上新:VR 应用一站式专业播控与管理工具
Paraverse平行云自主研发的LarkXR实时云渲染平台,作为行业领先的企业级云渲染解决方案,在国际市场占据重要地位。公司自2016年创立以来,始终引领3D/XR云化技术的创新发展,目前已在全球范围内为超过10,000名开发者和1,000家企业客户…...
Windows逆向工程提升之二进制分析工具:HEX查看与对比技术
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 十六进制查看工具 应用于逆向工程的知识点 编辑 二进制对比工具 应用于逆向工程的知识点 十六进制查看工具 十六进制查看器是逆向工程的基础工具,它可以以十六进制格式…...
电脑A和电脑B都无法ping通电脑C网络,电脑C可以ping通电脑A和B,使用新系统测试正常,排除硬件问题。
主要硬件:研华AIMB-705主板、i5-6500 C机在防火墙高级设置里启用以下两项规则后,A/B机可正常访问C机网络。(直接关闭防火墙也可解决此问题) 文件和打印机共享 (回显请求 - ICMPv4-In) 核心网络诊断 - ICMP 回显请求 (ICMPv4-In)…...
【VMware】虚拟机运行 Linux Ubuntu、MAC 安装和配置
文章目录 一、VMware Workstation Pro 下载二、VMware Workstation Pro 安装三、Ubuntu Linux虚拟机镜像下载安装与配置 1、Ubuntu系统镜像下载 2、创建虚拟机(VMware)及硬件配置 3、编辑虚拟机设置 4、安装Ubuntu系统及系统…...
遨游科普:三防平板是什么?有什么作用?
在数字化与智能化浪潮席卷全球的今天,电子设备的可靠性已成为衡量其价值的核心标准之一。三防平板,这一“硬核”的工业设备,正凭借其卓越的环境适应能力,从专业领域走向大众视野,成为极端场景下不可或缺的数字化工具。…...
电脑闪屏可能的原因
1. 显示器 / 屏幕故障 屏幕排线接触不良:笔记本电脑屏幕排线(屏线)松动或磨损,导致信号传输不稳定,常见于频繁开合屏幕的设备。屏幕面板损坏:液晶屏内部灯管老化、背光模块故障或面板本身损坏,…...
VR 互动实训的显著优势
(一)沉浸式学习,提升培训效果 在 VR 互动实训中,员工不再是被动的知识接受者,而是主动的参与者。以销售培训为例,员工戴上 VR 设备,就能置身于逼真的销售场景中,与虚拟客户进行面对…...
2025.05.19【Connectedscatter】连接散点图详解
How to add a legend to base R plot The legend() function allows to add a legend. See how to use it with a list of available customization. Image on the chart background The rasterImage function allows to add an image on the background of the chart. 文章目…...
C++之函数模板类模板
模板 1.泛型编程2. 函数模板函数模板概念函数模板的实例化模板参数的匹配原则 3.类模板类模板的定义格式类模板的实例化 4.模板的优缺点 C 模板是一种强大的泛型编程工具,它允许你编写与类型无关的代码,提高代码复用性。 1.泛型编程 先看一个我们之前经…...
《告别低效签约!智合同如何用AI重构商业“契约时代”》——解析智能合约技术的爆发与行业变革
在数字化浪潮奔涌的当下,合同作为商业活动的核心枢纽,正经历着智能化的深度变革。智合同-合同智能应用这一创新模式,犹如一颗璀璨的新星,在商业领域的天空中绽放出独特光芒,深刻改变着人们对合同管理与应用的认知和实践…...
Axure难点解决分享:垂直菜单展开与收回(4大核心问题与专家级解决方案)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:垂直菜单展开与收回 主要内容:超长菜单实现、展开与收回bug解释、Axure9版本限制等问题解…...
PCB设计教程【入门篇】——电路分析基础-基本元件(电阻电容电感)
前言 本教程基于B站Expert电子实验室的PCB设计教学的整理,为个人学习记录,旨在帮助PCB设计新手入门。所有内容仅作学习交流使用,无任何商业目的。若涉及侵权,请随时联系,将会立即处理 目录 前言 1.PCB原理图的作用…...
909. 蛇梯棋
https://leetcode.cn/problems/snakes-and-ladders/description/?envTypestudy-plan-v2&envIdtop-interview-150思路:题目要求我们使用最小的步数走到终点(注意不能走回头路,传送不算),那我们的想法就很明确了&am…...
Redis学习打卡-Day4-Redis实现消息队列
Redis 基于阻塞队列实现秒杀的优化 新增秒杀优惠券的同时,将优惠券信息保存到 Redis 中。基于 Lua 脚本,判断秒杀库存、一人一单,决定用户是否抢购成功。如果抢购成功,将优惠券id和用户id封装后存入阻塞队列。开启独立线程任务&a…...
探索C++面向对象:从抽象到实体的元规则(上篇)
前引:在计算机科学的浩瀚星空中,面向对象编程(OOP) 无疑是照亮现代软件开发的核心范式。而 C 作为一门兼具高性能与抽象能力的系统级语言,其类与对象的语法设计更是开发者构建复杂系统的“元规则”。你是否曾困惑于 封…...
华为鸿蒙电脑发布,企业运营效率可以提高吗?
今日,科技圈迎来重磅消息,华为于19日在成都正式发布两款鸿蒙电脑,标志着鸿蒙操作系统首次登陆电脑端,这是中国国产操作系统的重大里程碑,更是中国电子信息产业自主可控进程中的关键一步。 鸿蒙操作系统作为首个统一移动…...
遨游科普:三防平板是什么?应用在什么场景?
在数字化转型的浪潮中,智能终端设备正从消费级市场向工业级场景深度渗透。传统平板电脑虽能满足日常需求,却难以应对极端环境下的挑战——暴雨、沙尘、震动、高温或低温等恶劣条件,往往成为数据采集、实时通讯和作业效率的“绊脚石”。在此背…...
图像中紫边出现原因
一、紫边 在实景调试中,我们经常会遇到高亮场景下的物体边缘分布有明显的紫边(purple fringe)现象, 就如下图所示: 对于紫边的成因,通常认为是镜头色差(镜头对不同光谱光线的折射程度不同,导致不…...
中服云生产线自动化智能化调度生产系统:打造智能制造新标杆
前言 在当今制造业竞争日益激烈的背景下,实现生产线的自动化与智能化已成为企业提升竞争力的关键。作为国内技术领先的工业物联网平台、数字孪生、自动控制技术厂商,中服云凭借其深厚的技术积累和创新能力,打造了一套完整的生产线自动化智能…...
【电动汽车充电系统核心技术全解:从can通讯高压架构到800V超充未来】
标题:电动汽车充电系统核心技术全解:从高压架构到800V超充未来 目录 前言:开篇暴击:中国电动车年产670万辆背后,充电技术如何破局一、充电系统架构解剖:四大核心模块如何“打配合”?二、CAN总线…...
uniapp-商城-62-后台 商品列表(分类展示商品的布局)
每一个商品都有类别,比如水果,蔬菜,肉,粮油等等,另外每一个商品都有自己的属性,这些都在前面的章节进行了大量篇幅的介绍。这里我们终于完成了商品类的添加,商品的添加,现在到了该进…...
在嵌入式系统中, 一般链路层断开多久,断开TCP为好
一、典型场景与推荐策略 1. 实时性优先(工业控制、自动化设备) 需求:快速释放资源,避免因等待重传浪费内存或阻塞任务。 策略: 立即断开:在lwip_netif_link_callback中检测到链路断开后直接关闭TCP连接&a…...
解决 MySQL 错误 1356 (HY000)
当你遇到 ERROR 1356 (HY000): View mysql.user references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them 错误时,通常是由于 MariaDB 或 MySQL 版本更新导致的视图引用问题。 示例 UPDATE mysql.user SET H…...
【数据仓库面试题合集④】SQL 性能调优:面试高频场景 + 调优策略解析
随着业务数据规模的持续增长,SQL 查询的执行效率直接影响到数据平台的稳定性与数据产出效率。因此,在数据仓库类岗位的面试中,SQL 性能调优常被作为重点考察内容。 本篇将围绕常见 SQL 调优问题,结合实际经验,整理出高频面试题与答题参考,助你在面试中游刃有余。 🎯 高…...
机器学习第十七讲:PCA → 把100维数据压缩成3D视图仍保持主要特征
机器学习第十七讲:PCA → 把100维数据压缩成3D视图仍保持主要特征 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:超详细手把手指南 主…...
一个由微软开源的 Python 工具,用于将多种文件格式转换为 Markdown 格式
📚 Markitdown 由微软开源的 Python 工具,用于将多种文件格式转换为 Markdown 格式 支持:PDF、PowerPoint、Word、Excel、图像、音频、HTML、文本格式(CSV、JSON、XML)、ZIP 文件的转换。 它旨在提供一个简单且灵活的…...
Python多进程、多线程、协程典型示例解析
一、multiprocessing(多进程) 1. 模块简介 作用:创建多个独立运行的进程(每个进程有独立内存空间)适用场景:数学计算、图像处理等CPU密集型任务核心原理:绕过Python的GIL锁,真正利…...
httpx[http2] 和 httpx 的核心区别及使用场景如下
httpx[http2] 和 httpx 的核心区别在于 HTTP/2 协议支持,具体差异及使用场景如下: 1. 功能区别 命令/安装方式协议支持额外依赖适用场景pip install httpx仅 HTTP/1.1无通用请求,轻量依赖pip install httpx[http2]支持 HTTP/2需安装 h2>3…...
[强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程-下
[强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程-下 2.6 矩阵-向量形式2.7 求解状态值2.7.1 方法1:解析解2.7.2 方法2:数值解2.7.3 示例 2.8 动作值2.8.1 示例2.8.2 基于动作值的贝尔曼方程 本人为强化学习小白,为了在后续科研的过程…...
c/c++数据类型转换.
author: hjjdebug date: 2025年 05月 18日 星期日 20:28:52 CST descrip: c/c数据类型转换. 文章目录 1. 为什么需要类型转换?1.1 发生的时机:1.2 常见的发生转换的类型: 2. c语言的类型转换: (Type) value2.1 c语言的类型变换是如何实现的? 规则是什么? 3. c 的static_cast…...
大语言模型训练数据格式:Alpaca 和 ShareGPT
在大规模语言模型(LLM)的开发中,训练数据的质量和格式起着至关重要的作用。为了更好地理解和构建高质量的数据集,社区发展出了多种标准化的数据格式。其中,Alpaca 和 ShareGPT 是两种广泛使用的训练数据格式࿰…...
C++(23):容器类<vector>
目录 一、核心概念 二、基本语法 1. 头文件 2. 声明与初始化 三、常用操作 四、具体实例 1、size()、front()、back() 2、push_back()、pop_back()、capacity() 3、reserve() 一、核心概念 Vectors 包含着一系列连续存储的元素,其行为…...
Nginx配置中include mime.types的作用及正确配置mime类型
部署应用后发现页面没有正确加载CSS样式文件,通过检查nginx配置文件,发现nginx有一项配置include mime.type没有正确配置导致。 http {log_format main $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent &q…...
C++ 之 继承
1.继承的概念及定义 1.1继承的引入 我们设计一个person类,类中包含姓名、年龄、身高....等数据成员 我们再设计一个student类,类中也需要包含姓名、年龄、身高...等数据成员 我们再设计一个teacher类,类中也需要包含姓名、年龄、身高...等数…...
基于CNN的猫狗识别(自定义CNN模型)
目录 一,数据集介绍 1.1 数据集下载 1.2 数据集简介 二,模型训练 2.1 用到的模块 2.2 设置随机种子 2.3 图像的预处理 2.4 CNN模型层结构 2.5 初始化 2.6 训练和验证 三,模型测试 3.1 定义相同预处理 3.2 定义相同的层结构 3.3…...
互联网大厂Java面试场景:从Spring Boot到分布式缓存技术的探讨
互联网大厂Java面试场景:从Spring Boot到分布式缓存技术的探讨 场景描述 互联网大厂某次Java开发岗面试,主考官是一位严肃的技术专家,而应聘者则是搞笑的程序员“码农明哥”。面试围绕音视频场景的技术解决方案展开,探讨从Sprin…...
linux本地部署ollama+deepseek过程
1.Tags ollama/ollama GitHub 选择一个版本下载,我下的是0.5.12 2.tar解压该文件 3.尝试启动ollama ollama serve 4.查看ollama的版本 ollama -v 5.创建一个系统用户 ollama,不允许登录 shell,拥有一个主目录,并且用…...
【数据结构与算法】ArrayList 与顺序表的实现
目录 一、List 接口 1.1 List 接口的简单介绍 1.1 常用方法 二、顺序表 2.1 线性表的介绍 2.2 顺序表的介绍 2.3 顺序表的实现 2.3.1 前置条件:自定义异常 2.3.2 顺序表的初始化 2.3.2 顺序表的实现 三、ArrayList 实现类 3.1 ArrayList 的两种使用方式 3.2 Array…...
Vue 3.0 中的slot及使用场景
1. 基本概念 在 Vue 中, slot 用于定义组件中的插槽位置,外部的内容会被插入到组件内部的这个位置。插槽的内容是动态的,可以根据需要进行传递和渲染。它允许开发者在组件外部传递任意内容,并在组件内部进行渲染,主要…...
go语言协程调度器 GPM 模型
go语言协程调度器 GPM 模型 下面的文章将以几个问题展开,其中可能会有扩展处: 什么是调度器?为什么需要调度器? 多进程/多线程时cpu怎么工作? 进程/线程的数量多多少?太多行不行?为什么不行&…...
Python打卡 DAY 29
知识点回顾 1. 类的装饰器 2. 装饰器思想的进一步理解:外部修改、动态 3. 类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工…...
C++控制结构详解:if-else、switch、循环(for/while/do-while)
1. 引言 在C编程中,控制结构用于控制程序的执行流程。它们决定了代码在什么条件下执行、如何重复执行某段代码,以及如何选择不同的执行路径。C提供了多种控制结构,主要包括: 条件语句:if-else、switch-case循环语句&…...
APP手机端测试覆盖点
通过上图,我们覆盖了完整的一个APP,需要进行哪些测试...
C++:⾯向对象的三⼤特性
面向对象的三大特性: 继承:允许一个类(子类 / 派生类)继承另一个类(父类 / 基类)的属性和方法,实现代码复用和层次化设计。 封装:将数据(成员变量)和操作数据…...
三、高级攻击工具与框架
高级工具与框架是红队渗透的核心利器,能够实现自动化攻击、权限维持和隐蔽渗透。本节聚焦Metasploit、Cobalt Strike及企业级漏洞利用链,结合实战演示如何高效利用工具突破防御并控制目标。 1. Metasploit框架深度解析 定位:渗透测试的“瑞…...
玄机-第二章日志分析-redis应急响应
前言 记录记录 关于redis的一些手法 redis未授权访问漏洞利用redis写webshell利用“公私钥” 认证获取root权限利用crontab反弹shellredis日志: /var/log/redis.log 1. 通过本地 PC SSH到服务器并且分析黑客攻击成功的 IP 为多少,将黑客 IP 作为 FLAG 提交; cd /var/log 查看…...