Git学习笔记

Git学习笔记

目录

版本控制
基本使用方式
不同的工作流
创建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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/3020.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Block总结】掩码窗口自注意力 (M-WSA)

摘要 论文链接&#xff1a;https://arxiv.org/pdf/2404.07846 论文标题&#xff1a;Transformer-Based Blind-Spot Network for Self-Supervised Image Denoising Masked Window-Based Self-Attention (M-WSA) 是一种新颖的自注意力机制&#xff0c;旨在解决传统自注意力方法在…

卷积神经05-GAN对抗神经网络

卷积神经05-GAN对抗神经网络 使用Python3.9CUDA11.8Pytorch实现一个CNN优化版的对抗神经网络 简单的GAN图片生成 CNN优化后的图片生成 优化模型代码对比 0-核心逻辑脉络 1&#xff09;Anacanda使用CUDAPytorch2&#xff09;使用本地MNIST进行手写图片训练3&#xff09;…

怎么在iPhone手机上使用便签进行记录?

宝子们&#xff0c;在这个快节奏的时代&#xff0c;灵感的火花总是一闪而过&#xff0c;待办事项也常常让人应接不暇。好在咱们的 iPhone手机便签超给力&#xff0c;能满足各种记录需求&#xff01;今天就来给大家分享一下&#xff0c;如何在 iPhone 手机上巧用便签&#xff0c…

基于微信小程序的摄影竞赛系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【从零开始使用系列】StyleGAN2:开源图像生成网络——环境搭建与基础使用篇(附大量测试图)

StyleGAN2 是英伟达团队 NVIDIA 提出的生成对抗网络&#xff08;GAN&#xff09;的一种改进版本。 它通过创新的网络架构&#xff0c;能够生成细节丰富、逼真的图像&#xff0c;特别在高频细节&#xff08;如皮肤纹理、光照等&#xff09;的表现上表现卓越。与传统 GAN 相比&am…

redis(2:数据结构)

1.String 2.key的层级格式 3.Hash 4.List 5.Set 6.SortedSet

LabVIEW 程序中的 R6025 错误

R6025错误 通常是 运行时库 错误&#xff0c;特别是与 C 运行时库 相关。这种错误通常会在程序运行时出现&#xff0c;尤其是在使用 C 编译的程序或依赖 C 运行时库的程序时。 ​ 可能的原因&#xff1a; 内存访问冲突&#xff1a; R6025 错误通常是由于程序在运行时访问无效内…

前端【2】html添加样式、CSS选择器

一、为html添加样式的三种方法 1、内部样式 2、外部样式 3、行内样式 二、css的使用--css选择器 1、css基本选择器 元素选择器 属性选择器 id选择器 class/类选择器 通配符选择器 2、群组选择器-多方面筛选 3、关系选择器 后代选择器【包含选择器】 子元素选择器…

【Elasticsearch】全文搜索与相关性排序

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

【算法】枚举

枚举 普通枚举1.铺地毯2.回文日期3.扫雷 二进制枚举1.子集2.费解的开关3.Even Parity 顾名思义&#xff0c;就是把所有情况全都罗列出来&#xff0c;然后找出符合题目要求的那一个。因此&#xff0c;枚举是一种纯暴力的算法。一般情况下&#xff0c;枚举策略都是会超时的。此时…

51单片机——DS18B20温度传感器

由于DS18B20数字温度传感器是单总线接口&#xff0c;所以需要使用51单片机的一个IO口模拟单总线时序与DS18B20通信&#xff0c;将检测的环境温度读取出来 1、DS18B20模块电路 传感器接口的单总线管脚接至单片机P3.7IO口上 2、DS18B20介绍 2.1 DS18B20外观实物图 管脚1为GN…

云手机技术怎么实现的?

前言 随着亚矩阵云手机在跨境电商、海外社媒矩阵搭建、出海运营、海外广告投放、国内新媒体矩阵运营、品牌应用矩阵运营等领域内的普及和使用&#xff0c;云手机的理念已经被越来越多人所接受和认同。今天我们就一起来浅析一下&#xff0c;到底云手机的技术是怎么实现的&#…

HTML中link的用法

一点寒芒先到&#xff0c;随后&#xff0c;抢出如龙&#xff01; 对于本人而言&#xff0c;这篇笔记内容有些扩展了&#xff0c;有些还未学到的也用上了&#xff0c;但是大概可以使用的明白&#xff0c;坚持下去&#xff0c;相信一定可以建设一个稳固的根基。 该文章为个人成…

闪豆多平台视频批量下载器

1. 视频链接获取与解析 首先&#xff0c;在哔哩哔哩网页中随意点击一个视频&#xff0c;比如你最近迷上了一个UP主的美食制作视频&#xff0c;想要下载下来慢慢学。点击视频后&#xff0c;复制视频页面的链接。复制完成后&#xff0c;不要急着关闭浏览器&#xff0c;因为接下来…

Vulnhub DC-8靶机攻击实战(一)

导语   Vulnhub DC-8靶机教程来了,好久没有更新打靶的教程了,这次我们在来更新一期关于Vulnhub DC-8的打靶训练,如下所示。 安装并且启动靶机 安装并且启动靶机,如下所示。 开始信息采集 进入到Kali中,通过如下的命令来查找到靶机的IP地址。 arp-scan -l根据上面的结…

JWT在线解密/解码 - 加菲工具

JWT在线解密/解码 首先进入加菲工具 选择 “JWT 在线解密/解码” https://www.orcc.online 或者直接进入JWT 在线解密/解码 https://www.orcc.online/tools/jwt 进入功能页面 使用 输入对应的jwt内容&#xff0c;点击解码按钮即可

换了城市ip属地会变吗?为什么换了城市IP属地不变

当我们跨越城市的界限&#xff0c;从一个地方迁移到另一个地方时&#xff0c;许多日常使用的网络服务和应用程序都会感知到这种变化&#xff0c;其中一个显著的现象就是IP属地的变化。IP属地&#xff0c;即IP地址所在的地理位置信息&#xff0c;它通常与互联网服务提供商&#…

如何在谷歌浏览器中设置自定义安全警告

随着网络环境的日益复杂&#xff0c;浏览器的安全问题也愈发引人关注。谷歌浏览器作为一款广泛使用的浏览器&#xff0c;其自定义安全警告功能为用户提供了更加个性化和安全的浏览体验。本文将详细介绍如何在谷歌浏览器中设置自定义安全警告&#xff0c;帮助用户更好地保护自己…

深度学习中的卷积和反卷积(四)——卷积和反卷积的梯度

本系列已完结&#xff0c;全部文章地址为&#xff1a; 深度学习中的卷积和反卷积&#xff08;一&#xff09;——卷积的介绍 深度学习中的卷积和反卷积&#xff08;二&#xff09;——反卷积的介绍 深度学习中的卷积和反卷积&#xff08;三&#xff09;——卷积和反卷积的计算 …

Mongodb相关内容

Mongodb相关内容 1、Windows平台安装2、Linux平台安装3、基本常用命令文档更新删除文档分页查询索引 pymongo操作 客户端下载&#xff1a;https://download.csdn.net/download/guoqingru0311/90273435 1、Windows平台安装 方式一&#xff1a; 方式2&#xff1a; 方式3&#…