Git学习笔记
Git学习笔记
目录
版本控制
基本使用方式
-
Git Config
-
Git Remote
-
Git Add
-
Objects
-
Refs
-
Annotation Tag
-
追溯历史版本
-
修改历史版本
-
Git GC
-
Git Clone & Pull & Fetch
-
Git Push
-
常见问题
不同的工作流
创建Github仓库实操
业界绝大多数公司都是基于Git进行代码管理,目前绝大多数开源社区项目都是基于Git维护的
版本控制
版本控制类型 | 代表性工具 | 解决的问题 |
---|---|---|
本地版本控制 | RCS | 本地代码的版本控制 |
集中式版本控制 | SVN | 提供一个远端服务器来维护代码版本,本地不保存代码版本,解决多人协作问题 |
分布式版本控制 | Git | 每个仓库都能记录版本历史,解决只有一个服务器保存版本的问题 |
本地版本控制
- 最初方式:通过本地复制文件夹来完成版本控制,一般可以通过不同的文件名来区分版本
- 解决方案:开发了一些本地的版本控制软件,最流行的是RCS
- 基本原理:本地保存所有变更的补丁集,可以理解成所有的Diff,通过这些补丁,我们可以计算出每个版本的实际文件内容
- 缺点:RCS这种本地版本控制存在最致命的缺陷就是只能在本地使用,无法进行团队协作,使用场景有限
集中版本控制
- 基本原理:提供一个远端服务器来保护文件,所有用户的提交都提交到服务器中。增量保存每次提交的Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突
- 优点:学习简单,容易操作。支持二进制文件,对大文件支持更友好
- 缺点:本地不存储版本管理的概念,所有提交都只能连上服务器后才可以提交。分支上的支持不够好,对于大型项目团队合作比较困难。用户本地不保存所有版本的代码,如果服务端故障容易导致历史版本的丢失
分布式版本控制
- 基本原理:每个库都存有完整的提交历史,可以直接在本地进行代码提交。每次提交记录的都是完整的文件快照,而不是记录增量。通过Push等操作来完成和远端代码的同步
- 优点:分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体。分支管理功能强大,方便团队合作,多人协同开发。校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失
- 缺点:相对SVN更复杂,学习成本更高。对于大文件的支持不是特别好,(git-lfs工具可以弥补这个功能)
基本使用方式
Git基本命令
- 配置
- git config
- git remote
- 提交代码
- git add
- git commit
- 远端同步
- 拉取代码
- clone
- pull
- fetch
- 推送代码
- push
- 拉取代码
Git目录介绍
项目初始化
创建一个demo文件夹
mkdir demo
进入demo文件夹
cd demo
项目初始化
git init
输入git init后会返回
提示:使用 'master' 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中
提示:配置使用初始分支名,并消除这条警告,请执行:
提示:
提示: git config --global init.defaultBranch <名称>
提示:
提示:除了 'master' 之外,通常选定的名字有 'main'、'trunk' 和 'development'。
提示:可以通过以下命令重命名刚创建的分支:
提示:
提示: git branch -m <name>
已初始化空的 Git 仓库于 /home/../.../demo/.git/
其他参数
git init后的分支是master分支,可以使用–initial-branch参数调整初始化的分支,如main分支
--initial-branch
–bare参数会创建一个裸仓库(纯Git目录,没有工作目录),一般服务器上的仓库都是–bare的形式创建出来的,本地仓库一般使用git init方式创建
--bare
–template可以通过模板来创建预先构建好的自定义git目录,它可以指定一些git目录的文件
--template
查看目录文件,因为版本不同返回的信息也可能不同
tree .git
里面有HEAD、config、hooks、objects、refs文件夹
HEAD表示当前指向的分支
config指的是当前Git仓库的配置
hooks会配置一些hook
objects存储的是一些文件信息
refs会存储一些分支信息
Git Config
Git配置分为三个级别:–system、–global和–local,分别是系统、全局和本地,每个级别的配置可能重复,但是低级别的配置会覆盖高级别的配置
级别由高到低:–system>–glocal>–local
常见Git配置
用户名和邮箱配置
配置用户名
git config --global user.name "你的用户名"
配置邮箱
git config --global user.email 你的邮箱
查看用户名
git config --global user.name
查看邮箱
git config --global user.email
InsteadOf配置
可以做一些url替换,比如把ssh协议替换为http协议,或者http协议替换为ssh协议
git config --global url.git@github.com:.insteadOf https://github.com/
Git命令别名配置
该命令可以简化一些命令的写法,下面命令是把commit --amend --no-edit命令起个cin的别名,以后直接输入cin就相当于commit --amend --no-edit命令
git config --global alias.cin "commit --amend --no-edit"
Git Remote
查看Remote
git remote -v
添加Remote
添加ssh协议
git remote add origin_ssh git@github.com:git/git.git
添加http协议
git remote add origin_http https://github.com/git/git.git
然后使用git remote -v查看会发现返回一下信息
origin_http https://github.com/git/git.git (fetch)
origin_http https://github.com/git/git.git (push)
origin_ssh git@github.com:git/git.git (fetch)
origin_ssh git@github.com:git/git.git (push)
也可以输入cat .git/config查看添加的配置,返回以下内容
[core]repositoryformatversion = 0filemode = truebare = falselogallrefupdates = true
[remote "origin_ssh"]url = git@github.com:git/git.gitfetch = +refs/heads/*:refs/remotes/origin_ssh/*
[remote "origin_http"]url = https://github.com/git/git.gitfetch = +refs/heads/*:refs/remotes/origin_http/*
查看remote帮助文档
git remote -h
同一个Origin设置不同的Push和Fetch的URL,从一个没有写权限的开源库中Fetch代码然后Push到有写权限的自己的个人仓库里
git remote add origin git@github.com:git/git.git
git remote set-url --add --push origin git@github.com:my_repo/git.git
查看remote设置内容
git remote -v
返回以下内容,表示设置好了同一个Origin配置不同的Push和Fetch的URL
origin git@github.com:git/git.git (fetch)
origin git@github.com:my_repo/git.git (push)
origin_http https://github.com/git/git.git (fetch)
origin_http https://github.com/git/git.git (push)
origin_ssh git@github.com:git/git.git (fetch)
origin_ssh git@github.com:git/git.git (push)
也可以通过cat .git/config命令查看,返回以下内容,同时也可以直接vim .git/config打开config文件在里面进行直接修改
[core]repositoryformatversion = 0filemode = truebare = falselogallrefupdates = true
[remote "origin_ssh"]url = git@github.com:git/git.gitfetch = +refs/heads/*:refs/remotes/origin_ssh/*
[remote "origin_http"]url = https://github.com/git/git.gitfetch = +refs/heads/*:refs/remotes/origin_http/*
[remote "origin"]url = git@github.com:git/git.gitfetch = +refs/heads/*:refs/remotes/origin/*pushurl = git@github.com:my_repo/git.git
HTTP Remote
本地与remote进行通信一般有两种协议:HTTP和SSH,这两种协议都需要对身份进行认证
一般不推荐用HTTP连接git,因为存在安全问题,一般都是使用SSH连接
URL:https://github.com/git/git.git
免密配置
- 内存:指定cache时间为3600秒,相当于把密码存在内存里,3600秒后销毁
git config --global credential.helper 'cache --timeout=3600'
- 硬盘:直接把密码存储在硬盘里,是永久存储
git config --global credential.helper "store --file /path/to/credential-file" # 不指定目录的情况下默认是~/.git-credentials
将密钥信息存在指定文件中,具体格式:
${scheme}://${user}:${password}@github.com
SSH Remote
URL:git@github.com:git/git.git
免密配置
SSH可以通过公私钥的机制,将生成的公钥存放在服务端,从而实现免密访问
目前的Key类型有四种:DSA、RSA、ECDSA、ED25519
默认使用的是RSA,由于一些安全问题,现在已经不推荐使用DSA和RSA,优先推荐使用ED25519,如果使用DSA或RSA也可能因为版本原因导致无法从远端拉取代码
ssh-keygen -t ed25519 -C "youremail@example.com" # 密钥默认存在 ~/.ssh/id_ed25519.pub中
输入以上命令后也会返回密钥存到的目录,需要自己指定密码或为空密码
Generating public/private ed25519 key pair.
Enter file in which to save the key (这里就是密钥存到的目录地址):
Created directory ''.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in xxx
Your public key has been saved in 这里就是密钥存到的目录地址
The key fingerprint is:
SHA256:
The key's randomart image is:
+--[ED25519 256]--+
+----[SHA256]-----+
然后直接访问密钥存到的地址,就会给你返回公钥,把公钥存到github上
cat 密钥存到的目录地址
在github中先点击个人头像,找到settings,然后在左边一栏找到SSH and GPG keys,在SSH keys旁边点击New SSH key,设置Name并把公钥内容复制进去即可
在利用SSH访问的时候需要指定SSH key,通过修改SSH key去指定需要的公私钥
Git Add
首先在文件夹里创建readme.md
touch readme.md
然后修改readme.md内容
vim readme.md # 改什么内容随意
查看到当前readme是没有提交的状态
git status# 返回
位于分支 master尚无提交未跟踪的文件:(使用 "git add <文件>..." 以包含要提交的内容)readme.md提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
然后把readme加入暂存区
git add .
再查看readme状态
git status# 返回
位于分支 master尚无提交要提交的变更:(使用 "git rm --cached <文件>..." 以取消暂存)新文件: readme.md
Git Commit
Git Add只是把文件加入了暂存区,Git Commit是真正把文件提交到git目录里面
git commit -m "add readme"# 返回
[master (根提交) 55f60a4] add readme1 file changed, 1 insertion(+)create mode 100644 readme.md
提交了一份文件后会额外产生另外两个文件,一个是表示它是一个目录树类型的文件,存储了提交时的目录信息,另一个会存提交的文件是什么、它的目录树是什么以及作者和提交者和一些相关信息
查看最新的commit
git log
Objects
commit/tree/blob在git里面都统一称为Object,除此之外还有个tag的object
- Blob:存储文件的内容
- Tree:存储文件的目录信息
- Commit:存储提交信息,一个Commit可以对应唯一版本的代码
首先,通过Commit寻找到Tree信息,每个Commit都会存储对应的Tree ID
git cat-file -p commit的信息
然后,通过Tree存储的信息,获取到对应的目录树信息
git cat-file -p 目录树的信息
最后,从tree中获取的blob的ID,通过blob id获取对应的文件内容
git cat-file -p 文件名称
Refs
查看commit id
cat .git/refs/heads/master
创建一个新的refs,新建一个分支
git checkout -b test
查看test的内容会发现和刚才master里存的内容是一样的
refs的内容就是对应的Commit ID
因此把ref当做一个指针,指向对应的Commit ID来表示当前ref对应的版本
在refs/heads前缀表示的是分支,除此之外还有其他种类的ref,比如refs/tags前缀表示的是标签
- Branch:可以创建一个新分支,分支一般用于开发阶段,是可以不断添加Commit进行迭代的
git checkout -b 分支名称
- Tag:标签一般表示的是一个稳定的版本,指向的Commit一般不会变更,要发布版本就使用tag
git tag v0.0.1cat .git/refs/tags/v0.0.1 # 返回的和刚才master的是一样的
Annotation Tag
附注标签是一种特殊的tag,可以给tag提供一些额外的信息,比如这次发布新增了什么内容
创建附注标签
git tag -a v0.0.2 -m "add feature 1"
查看内容,发现不是以前git log内的内容
cat .git/refs/tags/v0.0.2
查看该tag object的内容
git cat-file -p 上一条代码的返回值
返回内容中,object表示它真正指向的commit,还有tag名字,以及谁打的附注标签和标签的内容
追溯历史版本
- 获取当前版本的代码:通过ref指向的commit可以获取唯一的代码版本
- 获取历史版本的代码:commit里面会存有parent commit字段,通过commit的串联获取历史版本代码
修改readme内容
vim readme.md
保存提交新版本readme,object中新增三个名称
git add .
git commit -m "update readme"
查看当前指向的版本,发现ref指向新的commit
git log
查看当前版本内容,然后可以通过返回内容中的parent获取历史版本代码
git cat-file -p 上一条命令第一行的commit内容
修改历史版本
commit --amend
通过这个命令可以修改最近的一次commit信息,修改后commit id会改变,会在分支内新生成一个commit信息,但不会生成另外两个blob和tree信息
git commit --amendgit loggit cat-file -p 814b74542d4164fdc391291e793a7bc5585ea2f9
rebase
通过git rebase -i HEAD~3可以实现对最近的三个commit进行修改:
- 合并commit
- 修改具体的commit message
- 删除某个commit
filter --branch
该命令可以指定删除所有提交中的某个文件或全局修改邮箱地址等操作
Objects
修改commit后发现git object发生了变化:新增一个commit object,但是之前的commit object并没有被删除
没有ref指向的object称为悬空的object
删除悬空的object
git fsck --lost-found
Git GC
- GC:通过git gc命令,可以删除一些不需要的object,以及会对object进行一些打包压缩来减少仓库的体积
- Reflog:reflog是用于记录操作日志,防止误操作后数据丢失,通过reflog来找到丢失的数据,手动将日志设置为过期,如果不设置为过期在日志内还能看见以前的commit的引用,因此不能通过gc的命令来删掉
- 指定时间:git gc prune=now指定的是修剪多久之前的对象,默认是两周前
清除历史记录
git reflog expire --expire=now --all
执行git gc
git gc --prune=now
这些命令会把过期和不需要的文件删除,以及把object打包成pack,把refs打包成packed-refs,之前的内容没有丢,只是进行了打包压缩
Git Clone & Pull & Fetch
- Clone:拉取完整的仓库到本地目录,可以指定分支、深度
- Fetch:将远端某些分支最新代码拉取到本地,不会执行merge操作,会修改refs/remote内的分支信息,如果需要和本地代码合并需要手动操作
- Pull:拉取远端某分支,并和本地代码进行合并,操作等于git fetch + git merge,也可以通过git pull --rebase完成git fetch + git rebase操作,可能存在冲突,需要解决冲突
Git Push
Push是将本地代码同步至远端的方式
- 常用命令:一般使用git push origin master命令即可完成,origin就是remote里面设置的源的名字
- 冲突问题:
- 如果本地的commit记录和远端的commit历史不一致,则会产生冲突,比如git commit --amend或git rebase都有可能导致这个问题
- 如果该分支就自己一个人使用,或者团队内确认过可以修改历史则可以通过git push origin master -f来完成强制推送,一般不推荐主干分支进行该操作,正常都应该解决冲突后再进行推送
- 推送规则限制:可以通过保护分支来配置一些保护规则,防止误操作或者一些不合规的操作出现,导致代码丢失
常见问题
- Q:为什么明明配置了Git配置,但依然没有办法拉取代码
- A:免密认证没有配置
- A:insteadOf配置没有配,配的SSH免密配置,但是使用的还是HTTP协议访问
- Q:为什么Fetch了远端分支,但是本地当前分支历史没有变化
- A:Fetch会把代码拉到本地的远端分支,但是并不会合并到当前分支,所以当前分支历史没有变化,需要手动执行merge或rebase操作进行合并
不同的工作流
类型 | 代表平台 | 特点 | 合入方式 |
---|---|---|---|
集中式工作流 | Gerrit/SVN | 只依托于主干分支进行开发,不存在其他分支 | Fast-forward |
分支管理工作流 | Github/Gitlab | 可以定义不同特性的开发分支、上线分支,在开发分支完成开发后再通过MR(Merge Request)/PR(Pull Request)合入主干分支 | 自定义,Fast-forward或Three-way Merge都可以 |
集中式工作流
只依托于master分支进行研发活动
工作方式:
- 获取远端master代码
- 直接在master分支完成修改
- 提交前拉取最新的master代码和本地代码进行合并(使用rebase),如果有冲突需要解决冲突
- 提交本地代码到master
Gerrit
Gerrit是由Google开发的一款代码托管平台,主要特点是能够很好的进行代码评审,在aosp(android open source project)中使用的很广,开发流程是一种集中式工作流
基本原理
- 依托于Change ID概念,每个提交生成一个单独的代码评审
- 提交上去的代码不会存储在真正的refs/heads/下的分支中,而是存在于/refs/for/的引用下
- 通过refs/meta/config下的文件存储代码的配置,包括权限、评审等配置,每个Change都必须要完成Review后才能合并
优点
- 提供强制的代码评审机制,保证代码质量
- 提供更丰富的权限功能,可以针对分支做细粒度的权限管控
- 保证master的历史整洁性
- aosp多仓的场景支持更好
缺点
- 开发人员较多的情况下,更容易出现冲突
- 对于多分支的支持较差,想要区分多个版本的线上代码时,更容易出现问题
- 一般只有管理员才能创建仓库,比较难以在项目之间形成代码复用,比如fork操作就不支持
分支管理工作流
分支管理工作流 | 特点 |
---|---|
Git Flow | 分支类型丰富,规范严格 |
Github Flow | 只有主干分支和开发分支,规则简单 |
Gitlab Flow | 在主干分支和开发分支之上构建环境分支、版本分支,满足不同发布或环境的需要 |
Git Flow
Git Flow是早期出现的分支管理策略
包含五种类型分支
- Master:主干分支
- Develop:开发分支
- Feature:特性分支
- Release:发布分支
- Hotfix:热修复分支
优点
如果能够按照定义的标准严格执行,代码会很清晰,并且很难出现混乱
缺点
流程过于复杂,上线节奏比较慢,由于太复杂,研发容易不按照标准执行,从而导致代码出现混乱
Github Flow
Github的工作流,只有一个主干分支,基于Pull Request往主干分支中提交代码
团队合作方式
- owner创建好仓库后,其他用户通过fork的方式来创建自己的仓库,并在fork的仓库上进行开发
- owner创建好仓库后,统一给团队内成员分配权限,直接在同一个仓库内进行开发
Gitlab Flow
Gitlab推荐的工作流是在GitFlow和Github Flow上做出优化,既保持了单一主分支的简便,又可以适应不同的开发环境
原则:upstream first(上游优先)
只有在上游分支采纳的代码才可以进入到下游分支,一般上游分支是master
代码合并
Fast-forward:不会产生一个merge节点,合并后保持一个线性历史,如果target分支有了更新,则需要通过rebase操作更新source branch后才可以合入
Three-way Merge:三方合并,会产生一个新的merge节点
如何选择合适的工作流
选择原则:没有最好的,只有最合适的
针对小型团队合作,推荐使用Github工作流即可
- 尽量保证少量多次,最好不要一次性提交上千行代码
- 提交Pull Request后最少需要保证有CR(Code Review)后再合入
- 主干分支尽量保持整洁,使用fast-forward合入方式,合入前进行rebase
大型团队合作根据自己的需要指定不同的工作流,不需要局限在某种流程中
常见问题2
- 在Gerrit平台上使用Merge的方式合入代码
- Gerrit是集中式工作流,不推荐使用Merge方式合入代码,应该是在主干分支开发后直接Push
- 不了解保护分支,Code Review、CI等概念,研发流程不规范
- 保护分支:防止用户直接向主干分支提交代码,必须通过PR来进行合入。
- Code Review和CI:都是合入前的检查策略,Code Review是人工进行检查,CI则是通过一些定制化的脚本来进行一些校验
- 代码历史混乱,代码合并方式不清晰
- 不理解Fast-forward和Three-way Merge的区别,本地代码更新频繁地使用Three-way方式,导致生成过多的Merge节点,使提交历史变得复杂不清晰
创建Github仓库实操
在Github界面点击个人头像,找到Your repositories,然后点击右上角New,修改Repository name,然后点击最下面Create
创建好仓库后,在Quick setup内点击SSH,并把连接复制下来,在linux内创建文件夹
git clone SSH连接
然后就可以在文件夹内编写内容,编写完成后进行暂存、提交
git add .
git commit -m "注释"
git push origin main
新建feature分支并对readme进行修改
git checkout -b feature
然后push到feature分支内
git add .
git commit -m "注释"
git push origin feature
输入后会返回一条remote的feature的pull request链接,打开链接进行Create pull request就创建好了
然后把main分支代码拉到本地,查看日志会发现生成了一个merge节点
git checkout main
git pull origin main
git log
在GitHub仓库的settings左栏的Branches界面可以添加Branch protection rules,点击Add rule即可选择要添加的规则
使用Fast-forward合入方式,把test分支合入到main分支
先在test分支内提交文件
git add .
git commit -m "test"
切换到main分支
git checkout main
使用fast-forward把test分支合入到main分支,查看日志发现最新的commit是没有merge节点的
git merge test --ff-onlygit log
使用Three-way Merge合入方式,把test分支合入到main分支
先在test分支内提交文件
git add .
git commit -m "test"
切换到main分支
git checkout main
使用Three-way Merge把test分支合入到main分支,同时会生成一个Merge节点,查看日志发现最新的commit有Merge节点
git merge test --no-ffgit log
相关文章:
Git学习笔记
Git学习笔记 目录 版本控制 本地版本控制 集中版本控制 分布式版本控制 基本使用方式 Git Config Git Remote Git Add Objects Refs Annotation Tag 追溯历史版本 修改历史版本 Git GC Git Clone & Pull & Fetch Git Push 常见问题 不同的工作流 集…...
HTML5 Canvas实现的跨年烟花源代码
以下是一份基于HTML5 Canvas实现的跨年烟花源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">…...
javaEE初阶————多线程初阶(2)
今天给大家带来第二期啦,保证给大家讲懂嗷; 1,线程状态 NEW安排了工作还未开始行动RUNNABLE可工作的,或者即将工作,正在工作BLOCKED排队等待WAITING排队等待其他事TIMED_WAITING排队等待其他事TERMINATED工作完成了 …...
linux下的NFS和FTP部署
目录 NFS应用场景架构通信原理部署权限认证Kerberos5其他认证方式 命令serverclient查看测试系统重启后自动挂载 NFS 共享 高可用实现 FTP对比一些ftp服务器1. **vsftpd (Very Secure FTP Daemon)**2. **ProFTPD (Professional FTP Daemon)**3. **Pure-FTPd**4. **WU-FTPD (Was…...
《Java核心技术II》可中断套接字
4.2.4 可中断套接字 SocketChannel可以中断套接字 SocketChannel channel.open(new InetSocketAddress(host,port)); 通道(channel)并没有与之相关联的流,实际上,所拥有的read和write方法都是通过Buffer对象实现的。 如果不想处理缓冲区,…...
电梯系统的UML文档05
Dispatcher 不控制实际的电梯组件,但它在软件系统中是重要的。每一个电梯有一个ispatcher,主要功能是计算电梯的移动方向、移动目的地以及保持门的打开时间。它和系统中除灯控制器以外的几乎所有控制对象交互。 安全装置也是一个环境对象,它…...
浅谈云计算19 | OpenStack管理模块 (上)
OpenStack管理模块(上) 一、操作界面管理架构二、认证管理2.1 定义与作用2.2 认证原理与流程2.2.1 认证机制原理2.2.2 用户认证流程 三、镜像管理3.1 定义与功能3.2 镜像服务架构3.3 工作原理与流程3.3.1 镜像存储原理3.3.2 镜像检索流程 四、计算管理4.…...
1.5 GPT 模型家族全解析:从 GPT-1 到 GPT-4 的演进与创新
GPT 模型家族全解析:从 GPT-1 到 GPT-4 的演进与创新 随着人工智能技术的飞速发展,GPT(Generative Pre-trained Transformer)模型家族已经成为了现代自然语言处理(NLP)领域的标杆。从初代的 GPT-1 到最新的 GPT-4,每一代模型的发布都标志着人工智能技术的一个飞跃,并推…...
C#如何调用执行命令行窗口(CMD)
一、引言 在 C# 的编程世界里,我们常常会遇到需要与操作系统底层进行交互的场景。这时,调用命令行窗口(CMD)就成为了一个强大的工具。无论是自动化日常任务,还是执行外部程序和批处理文件,通过 C# 调用 CM…...
归子莫的科技周刊#2:白天搬砖,夜里读诗
归子莫的科技周刊#2:白天搬砖,夜里读诗 本周刊开源,欢迎投稿。 刊期:2025.1.5 - 2025.1.11。原文地址。 封面图 下班在深圳看到的夕阳,能遇到是一种偶然的机会,能拍下更是一种幸运。 白天搬砖,…...
Spring Boot + Apache POI 实现 Excel 导出:BOM物料清单生成器(支持中文文件名、样式美化、数据合并)
目录 引言 Apache POI操作Excel的实用技巧 1.合并单元格操作 2.设置单元格样式 1. 创建样式对象 2. 设置边框 3. 设置底色 4. 设置对齐方式 5. 设置字体样式 6.设置自动换行 7. 应用样式到单元格 3. 定位和操作指定单元格 4.实现标签-值的形式 5.列宽设置 1. 设…...
OpenVela——专为AIoT领域打造的开源操作系统
目录 一、系统背景与开源 1.1. 起源 1.2. 开源 二、系统特点 2.1. 轻量化 2.2. 标准兼容性 2.3. 安全性 2.4. 高度可扩展性 三、技术支持与功能 3.1. 架构支持 3.2. 异构计算支持 3.3. 全面的连接套件 3.4. 开发者工具 四、应用场景与优势 4.1. 应用场景 4.2. …...
02UML图(D1_结构图)
目录 学习前言 ---------------------------------- 讲解一:类图 一、类图的组成结构 1. 类(Class) 1.1. 类的成员变量的表示方式 1.2. 类的成员方法的表示方式 2. 接口(Interface) 3. 包(Package) 二、UML类…...
二十三种设计模式-装饰器模式
一、定义与核心思想 装饰器模式是一种结构型设计模式,其核心思想是动态地给一个对象添加一些额外的职责。通过这种方式,可以在不改变原有对象结构的基础上,灵活地增加新的功能,使得对象的行为可以得到扩展,同时又保持…...
SSM课设-酒店管理系统功能设计
【课设者】SSM课设-酒店管理系统 分为用户端管理员端 技术栈: 后端: Spring Spring MVC MyBatis Mysql JSP 前端: HtmlCssJavaScriptAjax 功能: 用户端主要功能包括: 登录注册 客房预订 客房评论 首页 管理员端主要功能包括: 会员信息管理 客房信息…...
R语言的文件操作
R语言的文件操作 引言 在数据科学和分析的过程中,文件操作是不可或缺的一部分。R语言作为一种强大的统计计算和图形作图的编程语言,提供了丰富的文件操作函数,使得用户能够方便地读取和保存数据。本文将详细介绍R语言中的文件操作ÿ…...
[javaWeb]初识Web
将该图片在浏览器中打印出来 代码: <html> <head> <title>HTML初识</title> </head> <body> <h1>猫猫</h1> <img src "img/1.jpg"> </body> &l…...
基于微信小程序的摄影竞赛系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
.netframwork模拟启动webapi服务并编写对应api接口
在.NET Framework环境中模拟启动Web服务,可以使用几种不同的方法。一个常见的选择是利用HttpListener类来创建一个简单的HTTP服务器,或者使用Owin/Katana库来自托管ASP.NET Web API或MVC应用。下面简要介绍Owin/Katana示例代码。这种方法更加灵活&#x…...
Go语言之路————条件控制:if、for、switch
Go语言之路————if、for、switch 前言ifforswitchgoto和label 前言 我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go,到后面能正常完成工作上的业务开发的过程࿰…...
54,【4】BUUCTF WEB GYCTF2020Ezsqli
进入靶场 吓我一跳,但凡放个彭于晏我都不说啥了 提交个1看看 1 and 11 1# 还尝试了很多,不过都被过滤了,头疼 看看别人的WP 竟然要写代码去跑!!!,不会啊,先用别人的代码吧…...
在线图片压缩工具
在线图片压缩工具,无需登录,无需成本,用完就走。 包括中文和英文版本。 官网地址: https://compress.openai2025.com/ 效果:...
快手极速版如何查找ip归属地?怎么关掉
在数字化时代,个人隐私的保护成为了广大用户关注的焦点。快手极速版作为一款备受欢迎的短视频应用,其IP归属地的显示与关闭功能自然也成了用户热议的话题。本文将详细介绍如何在快手极速版中查找IP归属地以及如何关闭IP属地显示,帮助用户更好…...
精准掌握:Nginx匹配规则及其优先级解析
Nginx作为一款高性能的HTTP和反向代理服务器,其配置文件的匹配规则及优先级设置对于实现精确的请求路由和资源分配至关重要。本文将深入探讨Nginx的匹配规则及其优先级,帮助读者更好地理解和应用这些配置。 一、Nginx匹配规则概述 Nginx的匹配规则主要…...
在VS2022中用C++连接MySQL数据库读取数据库乱码问题
1.正确安装mysql 安装之后的配置文件 2.在VS2022中进行相关配置 (1)右键项目,打开属性 注意是右键项目,不是.cpp文件 (2)配置属性-> VC目录 -> 包含目录 ->添加头文件路径(如图&am…...
RocketMQ源码分析之事务消息分析
rocketMQ事务消息原理概述 RocketMQ采用两阶段提交(2PC)的思想来实现事务消息,当事务消息失败或者超时,同时采用补偿的方式处理这个问题。这两个阶段分别为正常事务消息的发送与提交以及事务消息的补偿。我们看看官方文档给的事务…...
2025.1.19机器学习笔记:PINN文献精读
第三十周周报 一、文献阅读题目信息摘要Abstract创新点物理背景网络框架实验实验一:直道稳定流条件实验二:环状网络中的非稳定流条件 结论缺点及展望 二、代码实践总结 一、文献阅读 题目信息 题目:《Enhanced physics-informed neural net…...
大文件上传服务-后端V1V2
文章目录 大文件上传概述:minio分布式文件存储使用的一些技术校验MD5的逻辑 uploadV1 版本 1uploadv2 版本 2 大文件上传概述: 之前项目做了一个文件上传的功能,最近看到有面试会具体的问这个上传功能的细节,把之前做的项目拿过来总结一下,自己写的一个…...
docker 基础语法学习,K8s基础语法学习,零基础学习
下面是关于Docker和Kubernetes的基础语法学习资料,包括一些关键概念和示例代码。 Docker 基础语法 1. 安装 Docker 首先,你需要安装 Docker。以下是不同操作系统上的安装指南: Windows/Mac: 下载并安装 Docker Desktop。 Linux: 根据你的…...
【网络协议】RFC3164-The BSD syslog Protocol
引言 Syslog常被称为系统日志或系统记录,是一种标准化的协议,用于网络设备、服务器和应用程序向中央Syslog服务器发送日志消息。互联网工程任务组(IETF)发布的RFC 3164,专门定义了BSD Syslog协议的规范和实现方式。通…...
MongoDB深度解析与实践案例
MongoDB深度解析与实践案例 在当今大数据与云计算盛行的时代,NoSQL数据库以其灵活的数据模型、水平扩展能力和高性能,成为处理海量数据的重要工具之一。MongoDB,作为NoSQL数据库的杰出代表,凭借其面向文档的存储结构、强大的查询语言以及丰富的生态系统,赢得了众多开发者…...
C语言从零到精通:常用运算符完全指南,掌握算术、逻辑与关系运算
系列文章目录 01-C语言从零到精通:常用运算符完全指南,掌握算术、逻辑与关系运算 文章目录 系列文章目录前言一、C语言的起源与应用领域1.1 C语言的起源1.2 C语言的应用领域1.2.1 操作系统开发1.2.2 嵌入式系统1.2.3 编译器开发1.2.4 游戏开发与图形处理…...
ArkUI概述
鸿蒙操作系统(HarmonyOS)是华为公司推出的一款面向未来、面向全场景的分布式操作系统。它不仅能够支持各种不同的设备,从手机、平板到智能穿戴和智能家居产品,而且为开发者提供了一套统一的开发环境和工具链。对于想要深入鸿蒙开发…...
浅谈计算机网络03 | 现代网络组成
现代网络组成 一 、网络生态体系1.1网络生态系统的多元主体1.2 网络接入设施的多样类型 二、现代网络的典型体系结构解析三、高速网络技术3.1 以太网技术3.2 Wi-Fi技术的深度剖析3.2.1 应用场景的多元覆盖3.2.2 标准升级与性能提升 3.3 4G/5G蜂窝网的技术演进3.3.1 蜂窝技术的代…...
在线图片马赛克处理工具
在线图片马赛克处理工具,无需登录,无需费用,用完就走。 包括中文和英文版本 官网地址: https://mosaic.openai2025.com...
文件上传 分片上传
分片上传则是将一个大文件分割成多个小块分别上传,最后再由服务器合并成完整的文件。这种做法的好处是可以并行处理多个小文件,提高上传效率;同时,如果某一部分上传失败,只需要重传这一部分,不影响其他部分…...
网络安全---CMS指纹信息实战
CMS简介 CMS(Content Management System)指的是内容管理系统,如WordPress、Joomla等。CMS系统非常常见,几乎所有大型网站都使用CMS来管理其网站的内容。由于常见CMS的漏洞较多,因此黑客将不断尝试利用这些漏洞攻击CMS…...
Ubuntu 24.04 LTS 系统语言英文改中文
Ubuntu 24.04 LTS 修改软件源 Ubuntu 更改软件源 修改语言 无需输入命令,为Ubuntu 24.04系统添加中文智能拼音输入法 在 setting 的 system 中按下图操作 点击“Apply Changes”。需要管理员密码,安装完成后,退出登录,重新登…...
信创在医疗领域的应用:开启医疗信息化新时代
信创在医疗领域的应用:开启医疗信息化新时代 信创在医疗领域的应用:开启医疗信息化新时代信创医疗自助一体机杭医基于信创底座的健康医疗大数据平台厦门大学附属成功医院基于海光CPU的信创改造中科可控基于海光CPU的智慧医疗解决方案 信创在医疗领域的应…...
力扣-数组-303 区域和检索-数组不可变
解析 题目有点费解,大致应该是给出区间内的和,然后维护一个前缀和,为了防止越界,先填一个0进去,在构建的时候也要注意此时构建的dp的下标是i1,所以加的前缀和的下标是i。 代码 class NumArray { public:…...
【CSS】---- CSS 实现超过固定高度后出现展开折叠按钮
1. 实现效果 2. 实现方法 使用 JS 获取盒子的高度,来添加对应的按钮和样式;使用 CSS 的浮动效果,参考CSS 实现超过固定高度后出现展开折叠按钮;使用容器查询 – container 语法;使用 clamp 函数进行样式判断。 3. 优…...
二十项零信任相关的前沿和趋势性技术-MASQUE
影响力评级:较低 市场渗透率:不到目标受众的 1% 成熟度:孵化 定义:基于QUIC加密的多路复用应用程序底层 (MASQUE) 是一个 IETF 标准草案,可实现流量的安全传输和代理。 MASQUE全称为:Multiplexed Appli…...
【Docker】使用Dev Container进行开发
工作区 Dev Container 设置 新建一个文件夹 ./devcontainer 然后下面放 devcontainer.json 然后安装 vscode dev container 插件,然后 CtrlShiftP 启动 Container {"name": "PyTorch-Julia Development","image": "x66ccff/p…...
搭建一个基于Spring Boot的数码分享网站
搭建一个基于Spring Boot的数码分享网站可以涵盖多个功能模块,例如用户管理、数码产品分享、评论、点赞、收藏、搜索等。以下是一个简化的步骤指南,帮助你快速搭建一个基础的数码分享平台。 — 1. 项目初始化 使用 Spring Initializr 生成一个Spring …...
在线json格式化工具
在线json格式化工具,包括中文和英文版本,无需登录,无需费用,用完就走。 官网地址: https://json.openai2025.com 效果如下:...
leetcode300.最长递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1&…...
【个人学习记录】软件开发生命周期(SDLC)是什么?
软件开发生命周期(Software Development Life Cycle,SDLC)是一个用于规划、创建、测试和部署信息系统的结构化过程。它包含以下主要阶段: 需求分析(Requirements Analysis) 收集并分析用户需求定义系统目标…...
CTE与临时表:优劣势对比及使用场景分析
在数据库开发中,尤其是在复杂查询和优化中,**公共表表达式(CTE)和临时表(Temporary Table)**是两种常用的工具。尽管它们的功能有些相似,都是为了处理中间结果集,但它们的优劣势和使…...
Kali环境变量技巧(The Environment Variable Technique Used by Kali
Kali环境变量技巧 朋友们好,我们今天继续更新《黑客视角下的Kali Linux的基础与网络管理》中的管理用户环境变量。为了充分利用我们的黑客操作系统Kali Linux,我们需要理解和善于使用环境变量,这样会使我们的工具更具便利,甚至具…...
Ubuntu 24.04 LTS linux 文件权限
Ubuntu 24.04 LTS 文件权限 读权限 :允许查看文件的内容。写权限 (w):允许修改文件的内容。执行权限 (x):允许执行文件(对于目录来说,是进入目录的权限)。 文件权限通常与三类用户相关联: 文…...