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

git使用教程(超详细)-透彻理解git

一.核心基础

核心概念有六个

首先请把与svn有关的一切概念暂时从你的脑海中移除掉,我们要重新认识本文所讲述的所有概念。


1.worktree

worktree是一个目录,你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个branch(分支)关联。在常规情使用的况下,我们感知不到有这样一个关系存在,因为当我们clone一个git仓库时,默认的就已经把worktree关联到head指向的分支上了。请看下图

4debbaca904d44a486d5f8aecea3ef97.png

我在master分支的时候worktree是关联到master上的,我在wtr分支上的时候它就关联到wtr上了。

2.stage

这里我们先来看一下stage这个单词的根本含义,是指一个可以展现、进行或体验某些事件或活动的场所或状态。说白了就是舞台,供一些演员在上面表演用的。基于这层意思,worktree就是台下,stage就是台上,worktree里面的文件就是演员了,我们对演员的塑造就相当于我们对文件的增、删、改。我们对一个文件修改满意了,就可以把它丢到台上去。然而我们还可以继续在台下对这个文件进行修改,而不影响台上的文件,直到我们再次把这个文件丢到台上去。

使用  git add .     将台下所有修改丢到台上去

使用  git add xxxx   将某一个具体的文件的修改丢到台上去

3.commit

commit是一次交付,只有台上(stage)的内容才有资格交付。所有的commit都保存在git仓库中。这里有一个非常重要的观念需要明确一下,千万不要把commit的归属与branch(分支)联系在一起,commit不属于任何分支,在git中,分支的概念的基础是commit,没有commit就没有分支。现在我们来看一下commit中都包含了哪些内容,你就明白了。

commit的内容如下:

  1. commitID:在整个的git仓库中唯一标识一个commit。
  2. 父commitID: 在进行commit的时候,它的上一个commit的ID,就像区块链一样,每一个commit都有一个基础的commit。
  3. changes:本次commit的修改,也就是在进行commit时stage中的内容,说的再深入点就是本次commit与其父commit对比产生的变化的内容。
  4. 描述:包括作者、时间以及在commit时你通过-m 输入的描述信息。等等吧。

综上所述,一个commit就是一个完整的交付链或者是叫做提交历史,因为每一个commit都可以通过其父commitID往前追溯。这样来看,在某种意义上,是否每一个commit都可以成为一个分支呢?下面我们来说一下branch。

4.branch(分支)

分支,我们对分支最直观的感受就是,一个时间线上分布着这个分支的所有commit。而究其根本,在git中分支就两个作用。

一.   维护一个本分支当前最新的commit的ID,因为我通过一个commit就完全可以确定一个时间线了。这样我就只需要用一个分支文件记录当前最新的commitID即可。

bb21008efbdb428d94b86bcd60b45c8b.png

看看我的wtr分支上的最新提交是95e5137afceffdbf172dbcc8ce590695bba8e3d3

而分支文件refs/heads/wtr里记录的也是这个commit。

二.   当进行一次commit时,把分支文件中记录的commitID作为本次commit的父commitID。然后把本次commit的ID更新的分支文件中去。

这就是分支,他是我们维护交付链的工具。而不是commit的载体。

5.head

当前分支指针,它指向的是一个具体的分支文件。git永远把head指向的分支作为当前分支。

c56b3c9aa5294315b421b0620878afd8.png

HEAD文件里只记录了一个分支文件的地址。

6.git仓库

弄明白了上面5个概念,那么git仓库就很容易理解了。就是用于存储stage、commit、branch、head等等这些数据的地方。


二.git的基础行为

1. git init 仓库初始化

将一个目录初始化为一个git仓库,通常用于创建本地仓库。例如:

6e98f7f45d1041f39b0490cd1df4fed0.png

我将/d/workspace/gitdoc/gitrepos这个目录初始化成了一个git仓库,这个目录可以是个空目录也可以是一个有内容的目录(如果你想把目录下的内容都纳入到git仓库中去管理)。

我们也可以使用  git init --bare 来创建一个不带工作区和stage的仓库,这一般用来在服务器上创建一个共享仓库,因为不需要在这个仓库里工作,所以不带工作区和stage,它只是用来共享用的。如下

82d1c073bde740dc959b8f3f5207cc44.png

我把我的私服上的/home/gitdoc/reps.git  这个目录初始化成了一个共享仓库。我就可以在我本地使用git clone命令将其克隆下来了。

2. git clone 克隆

把一个远程仓库克隆到本地。一般是初次下载仓库时用这个命令。如下:

b18f89f9e4a54936a22c04aaeb83c95b.png

我从我的私服上克隆一个空的仓库。

3. git add  加入stage

现在我们在刚才克隆的空仓库中创建三个文件file1、file2、file3.然后执行git status看一下效果。

52dd1608582748b69fc1135963ba4b10.png

git status命令是显示git仓库当前的状态信息的。

我们可以看到3个文件是红色的,并且明确告诉你没有被git跟踪,这里我们就可以理解为这三个文件都在台下呢。现在我们先执行  git  add  file1  来看看效果。

0acbfb2af90d49608492f7ce5479bed6.png

可以看到file1已经被丢到台上了,现在如果执行git commit命令,就只会把file1打包交付。

好现在我们再执行   git add  .   看看有什么效果。

289462d39c29482bb0e3d1b1ffdcc6be.png

我们可以看到file1  和file2 都被丢到台上了。这个命令就是把台下的所有内容都丢到台上去。

这里需要说明一下台上的内容到底是什么,台上的内容就是,台上的文件与本分支当前的commit做对比产生的变化的内容。它并不是整个文件的内容,这里需要注意一下。

4. git commit  交付

就是把当前的stage中的内容打包成一个commit,存储到git仓库中去。也就是存放到 .git/objects目录下。我们现在执行   git commit  -m "本次提交的描述"  看看什么效果。

405db5ee78794cdeb5ce63161030dec9.png

使用git log 查看交付记录。这里我们看到成功创建了一个commitID为e94210ba5933b364d12f35b7841d1cbad3d963b8的commit。

f3dcd0cab98748f3906fad51651222a6.png

我们可以看到.git/objects/e9/4210ba5933b364d12f35b7841d1cbad3d963b8,这个文件也被创建出来了。

5. git branch 分支管理

git branch可以列出本地仓库的分支列表,我们执行一下看看有什么效果。

beec917de3064369a3e1a8211ddf3343.png

可以看到,我目前只有一个分支master。现在我们再创建一个dev分支,执行命令git branch dev

7e52388696644c3287a210fb61777176.png

可以看到我们的分支列表中多了一个dev分支,但是我们当前还是再master分支上。我们可以执行git checkout dev来切换到dev分支。

c5e60d073b634b708254bce49f8f992f.png

可以看到我们的分支已经切换了,并且当前分支head指针的内容也更新了。

然后我们再dev分支上把file1文件修改一下再次提交。

f6d4f6523c644172b9fc414743320cdc.png

我们可以看到master分支还指向e94210ba5933b364d12f35b7841d1cbad3d963b8这个commit上。dev已经指向新的commit了。

6.git push 推送

推送就是向远程仓库推送一些东西,都可以是什么东西呢?

1. 推送commit,这是我们最经常推送的东西,我们现在切换回master分支,然后执行git push

663b9db1b9d74f06b98a34dcfc44bb6f.png

这里我们实际上只把第一次提交的commit(e94210ba5933b364d12f35b7841d1cbad3d963b8)推送到了远程仓库了。

2. 推送分支,当我们想把本地分支推送到远程库上时使用的,下面我们来把dev分支推送到远程库里,执行 git push origin dev。这里的origin先不要管,下面会有讲解。

06534eed67b840f791f4e8e1426e250b.png

git branch -r 是查看远程仓库的分支列表,可以看到,我们推送分支之前,远程库只有一个分支,推送后有两个分支了。

上面那个origin是远程仓库的名字,使用git clone的仓库会默认把你克隆的远程库命名为origin。然而在git中,一个本地仓库是可以关联n多个远程库的,每一个远程库都是一个名字对应一个url。

使用 git remote -v  查看本地仓库关联的所有远程库

497d9dd909c34d1b94d8c91184c61005.png

使用 git remote add 远程库名字  url  可以关联一个远程库。

6850b410b5954fd9b89f0e1fe38703a4.png

当然,如果你想要往指定的远程库上推送东西的话,git push 后面就要加 远程库的名字了。

7.git merge 合并

我们对合并传统的理解是把两个分支合并到一起,但在git中,我们不能简单的这么去理解merge。上文中我们说过,在git里的一个commit就是一个完整的交付历史,甚至一个commit就可以代表一个分支。

那么在git中,merge的作用其实就是把两个commit的内容合并到一起(注意,在合并中,commit代表的是一段交付链)。现在我们假设有两个commit,A 和 B,我们当前分支指向的是commit A,我们要合并commit B。那么会产生两个情况。

第一种情况,commit B可以通过其父commit直接追溯到commit A,如下图

64d48c669cc84208ab6f258c8ca4730e.png

这种情况下的merge有两个选择,一选择是直接把当前分支的commitID更新为commitB,这就是merge的fast-forward模式。第二个选择是为这次merge创建一个新的commit。

第二种情况,commit B无法追溯到 commitA的情况,如下

a6f6dab2c5cc4ed883e41db2e514c94d.png

commitB的交付链条里无法找到 commit A,也就是无法追溯到当前分支的最新commit。但是他们两个继续往前追溯,一定只能找到一个共同的祖先的,如下

f287d8a51ab94c6a84f2af3891245900.png

这时merge的任务就是,把自这个共同祖先往上的两个交付链合并到一起,并为这次合并创建一个新的commit,这种情况下是无法进行fast-forward模式合并的。合并后的效果如下

cba904f7459240f497afff0815e85a2a.png

命令使用:git merge  分支名称 或者 commitID,

c0c89b85acb24f60a21877f728f59622.png

f4c5ad943924448bbb111b792fb4c127.png

8.git fetc  获取

从远程仓库获取更新,如果有的话,获取到的新内容不会应用到当前的worktree上。

现在我们切换到一个新的目录里,重新克隆一下我们的远程仓库。然后我们修改file1,然后创建一个commit,并push到远程仓库,然后回到原先的本地仓库里执行git fetch看看是什么效果。

3107a04ddb4b48a293f506b38dbdc877.png

可以看到有内容被取下来了,但是我本地仓库的commit历史没有变化。现在我们执行一下git merge看看效果。

3e785de29e384e40bb419ebe2f78ff72.png

可以看到,我们本地的提交历史发生了变化。这里的merge并没有加任何参数,不加参数的merge实际上是默认的把fetch到的最新的commitID作为目标commit进行合并了,如果没有冲突的话,那就是一次fast-forward的合并,如果有冲突的话,解决冲突后会创建一个新的commit。

9.git pull 拉取

就是git fetch 加 git merge的组合。明白了上面的merge 和fetch,这个行为就没有什么好讲解的了。


三.git的多人协作

在一个项目中多人协作的基础是共享交流。git通过分支管理、远程仓库操作、commit来支持这两个基础,然而原生的git对其支持也就仅限于此,对于一个小型团队也足够用了。然后对于大型团队的多人协作就有些力不从心了。大型团队意味着大型项目,它主要面临一下几个问题。

1.团队人员多

团队人员众多就意味着人员分散、沟通成本高、工作成果的管理成本高。

2.项目复杂

功能模块多,版本的迭代管理面困难。

3.文档管理

对于大型项目来讲,文档是非常重要的内容,他是这个项目能正常运作的重要基础。

4.交流

在大型项目中我们经常要对一些议题、功能模块进行讨论

所以在大型项目中我们还要求git至少具备人员管理、文档管理的支持。还要对人员交流、版本迭代有更强大的支持。原生的git还无法做到这一点,所以就有了github、gitcode、gitee、gitea、gitlab这些产品出现。下面我们会分别介绍Gitflow、Githubflow、Gitlabflow。


四.Gitflow  工作流

Gitflow 是一种流行的 Git 分支管理工作流程,由 Vincent Driessen 提出,专门为团队协作开发而设计,特别适合拥有较长开发周期的项目。它通过明确的分支策略,使开发、发布和维护的过程更加清晰和规范。

Gitflow 的核心概念

Gitflow 主要依赖以下几个分支来组织代码:

  1. 主分支(main

    • 存储的是已经发布到生产环境的稳定代码。
    • 每个版本的发布都在此分支打标签(tag)。
  2. 开发分支(develop

    • 用于开发的主分支,团队成员日常开发的代码最终都会合并到这个分支。
    • 此分支上的代码反映当前的最新开发状态。
  3. 功能分支(feature/*

    • 每个新功能都有一个独立的分支,从 develop 分支创建。
    • 功能开发完成后,合并回 develop 分支。
    • 命名通常以 feature/功能名称 命名。
  4. 发布分支(release/*

    • develop 分支创建,用于准备即将发布的版本。
    • 可以在此分支上进行最后的测试、修复 bug、完善文档等。
    • 完成后合并到 maindevelop,并打上版本标签。
  5. 热修复分支(hotfix/*

    • 用于修复生产环境中的紧急问题,从 main 分支创建。
    • 修复完成后,合并到 maindevelop,并打上版本标签。

Gitflow 的工作流程

  1. 初始化仓库

    • 主分支和开发分支初始化:maindevelop
  2. 开发新功能

    • develop 创建 feature/功能名称 分支。
    • feature 分支上完成开发后,合并回 develop
  3. 准备发布

    • develop 上的功能足够多并且稳定时,从 develop 创建 release 分支。
    • release 分支上完成必要的修复和优化,最后合并到 maindevelop
  4. 生产环境问题修复

    • main 上的代码发现问题时,从 main 创建 hotfix 分支。
    • 修复完成后,合并到 maindevelop

Gitflow 的优点

  • 清晰的分支管理:每种任务都有明确的分支,减少了代码冲突的风险。
  • 支持并行开发:多个功能可以在各自的分支上独立开发。
  • 易于追踪版本历史:版本管理有条理,通过标签标记版本。

Gitflow 的缺点

  • 操作复杂:分支和合并的数量较多,增加了操作成本。
  • 不适合持续交付:如果需要频繁发布,Gitflow 可能显得繁琐。
  • 对小型项目过于重型:小型团队或短开发周期可能不需要如此复杂的分支策略。

适用场景

Gitflow 非常适合如下场景:

  • 团队开发的大型软件项目。
  • 具有固定的发布周期。
  • 需要严格版本控制的项目。

五.Github Flow  github工作流

GitHub Flow 是一种简单、轻量的工作流,旨在帮助开发团队高效地协作和发布高质量的软件。它特别适用于持续部署和发布的项目,以下是 GitHub Flow 的关键步骤和特点:

核心步骤

  1. 创建分支(Branching)

    • 每个新功能、修复或改进都从主分支(mainmaster)创建一个新的分支。
    • 分支命名通常清晰描述工作内容,例如 feature/user-authenticationfix/login-bug
  2. 提交更改(Committing Changes)

    • 在分支上开发时,将小而独立的更改提交到分支。
    • 提交信息应简洁且有意义,便于追踪。
  3. 创建拉取请求(Pull Request, PR)

    • 当工作完成后,提交代码并在 GitHub 上发起一个拉取请求。
    • 拉取请求描述应包含代码更改的背景、目的以及测试细节。
  4. 代码审查(Code Review)

    • 团队成员可以在拉取请求中提供反馈,确保代码质量和一致性。
    • 如果需要,可以多次更新分支来响应反馈。
  5. 合并分支(Merging)

    • 拉取请求通过审查并经过自动化测试后,可以将分支合并回主分支。
    • 在合并前,通常会运行所有必要的 CI/CD 测试。
  6. 部署(Deploying)

    • 每次合并到主分支后,代码应该是可以部署到生产环境的。
    • GitHub Flow 鼓励频繁的小规模部署,以减少风险。

关键原则

  • 保持主分支稳定: 主分支始终是可部署的,因此任何工作都应在分支上完成。
  • 频繁部署: GitHub Flow 的设计支持持续集成和持续部署(CI/CD)。
  • 小而快速的迭代: 小的、更频繁的更改降低了回滚的风险并提高了团队效率。

六.GitLab Flow  gitlab工作流

GitLab Flow 是一种灵活的工作流模型,结合了 GitHub FlowGit Flow 的优点,适合复杂的开发场景,例如包含多环境部署的项目。GitLab Flow 更加强调环境管理(如开发、测试、生产)和持续集成/持续部署(CI/CD)的最佳实践。

以下是 GitLab Flow 的核心内容和工作步骤:

核心概念

  1. 环境驱动开发:
    支持多环境(如开发、测试、生产),代码通过分支或标签逐步推进到不同的环境。

  2. 简单分支模型:
    避免复杂的分支设计,通常使用少量分支,比如 main(或 master)、feature 分支、release 分支和 production 分支。

  3. 持续集成和部署(CI/CD):
    每次代码提交后触发自动化测试和部署,确保高效交付和生产环境稳定。

  4. 合并请求(Merge Request):
    所有更改都通过合并请求进行协作和代码审查,确保代码质量。

  5. 基于需求的分支策略:
    根据项目需求选择不同的分支模型,例如:

    • 单环境项目:简单分支策略。
    • 多环境项目:分支对应环境。

核心步骤

  1. 创建分支:
    根据工作任务,从主分支(mainmaster)创建一个新的分支。常见分支类型包括:

    • Feature 分支: 用于开发新功能,命名如 feature/add-authentication
    • Bugfix 分支: 用于修复问题,命名如 bugfix/fix-login-error
  2. 开发和提交更改:
    在分支上完成开发,每次提交(commit)都应与单一变更对应,确保改动清晰可追踪。

  3. 发起合并请求(Merge Request):
    当分支开发完成后,发起合并请求将分支合并到目标分支(如 maindevelop),在请求中描述改动内容和测试方法。

  4. 代码审查和测试:
    团队成员审查代码并运行 CI 测试,确保代码符合质量标准并不会破坏现有功能。

  5. 合并到主分支:
    通过审查后,分支合并到主分支或目标分支。

    • 对于多环境项目,可将代码从 main 分支逐步合并到 stagingproduction 分支。
  6. 部署:

    • 单环境项目: 合并到主分支后直接部署到生产环境。
    • 多环境项目: 使用 CI/CD 管道部署到不同环境(如 staging 测试,production 发布)。

分支模型类型

  1. 简单分支模型(适合单环境项目):

    • 主分支(mainmaster):生产环境代码。
    • 功能分支(feature):用于开发。
  2. 多环境分支模型(适合复杂项目):

    • Main 分支: 稳定代码,用于最终发布。
    • Production 分支: 与生产环境同步。
    • Staging 分支: 用于测试环境。
    • Feature/Bugfix 分支: 用于开发。
  3. 版本发布模型:

    • 使用 release-x.y.z 分支管理版本发布。
    • 通过标签(Tag)标记版本号。

七.附录:

1.Git介绍

Git 是一个开源的分布式版本控制系统,用于高效地管理代码和文件的更改。它由 Linus Torvalds 于 2005 年开发,最初是为 Linux 内核的开发而设计的。Git 因其强大的功能、灵活性和性能而广泛用于软件开发、项目协作和版本管理。

2.Git 的核心命令

基础命令

命令描述
git init初始化一个新的 Git 仓库
git clone克隆远程仓库到本地
git status查看当前分支的状态
git add添加文件到暂存区
git commit提交暂存区的更改到仓库
git log查看提交历史

分支与合并

命令描述
git branch列出、创建或删除分支
git checkout切换到指定分支
git merge合并指定分支到当前分支
git rebase变基操作,重新整理提交历史

同步与远程操作

命令描述
git remote管理远程仓库
git fetch下载远程仓库的最新数据
git pull获取并合并远程分支的更改
git push将本地分支的更改推送到远程仓库

Git 的高级功能

  • Rebase(变基): 重新整理分支的提交历史,使开发历史更清晰。

  • Cherry-pick(挑选提交): 将特定的提交应用到当前分支,而不是合并整个分支。

  • Stash(暂存): 保存当前未提交的更改以便稍后恢复。

  • Tag(标签): 创建对重要版本的标记,如发布版本。

分布式版本控制系统

 Git 的分布式版本控制系统(Distributed Version Control System,DVCS)是其最显著的特性之一。这种系统设计使每个开发者都拥有完整的项目副本,不依赖中央服务器,赋予了 Git 强大的灵活性和可靠性。

分布式版本控制系统是一种允许多个开发者独立工作且不依赖于单点服务器的版本控制方法。与集中式版本控制系统(如 SVN、Perforce)不同,分布式系统在每台开发者的计算机上都保存完整的代码库,包括项目的所有历史记录。

分布式 vs 集中式

特性集中式版本控制系统分布式版本控制系统
依赖中央服务器强依赖:所有操作都需要服务器弱依赖:本地操作独立完成
数据完整性如果服务器崩溃,可能导致丢失每个用户都有完整备份
性能网络操作缓慢本地操作快速
离线工作不支持支持

Git 的分布式架构

仓库结构

Git 仓库分为两部分:

  • 本地仓库(Local Repository): 包含完整的项目代码和历史记录,存储在开发者的计算机上。
  • 远程仓库(Remote Repository): 通常托管在服务器(如 GitHub、GitLab)上,用于共享和协作。

本地和远程的关系

  • 本地仓库可以独立操作:提交(git commit)、创建分支(git branch)、回退(git reset)等。
  • 远程仓库用于团队协作,通过 git pushgit pull 进行同步。

本文完结。欢迎点赞受收藏留言讨论。

相关文章:

git使用教程(超详细)-透彻理解git

一.核心基础 核心概念有六个 首先请把与svn有关的一切概念暂时从你的脑海中移除掉,我们要重新认识本文所讲述的所有概念。 1.worktree worktree是一个目录,你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个…...

Bugku---misc---隐写2

题目出处:首页 - Bugku CTF平台 ✨打开发现是一张图片,于是查看属性,放在010查看,这都是基本步骤了,发现里面有一个flag.rar!!!拿binwalk分析也确实存在 ✨于是按照压缩包的起始位置…...

数据仓库工具箱—读书笔记01(数据仓库、商业智能及维度建模初步)

数据仓库、商业智能及维度建模初步 记录一下读《数据仓库工具箱》时的思考,摘录一些书中关于维度建模比较重要的思想与大家分享🤣🤣🤣 博主在这里先把这本书"变薄"~有时间的小伙伴可以亲自再读一读,感受一下…...

将 Ubuntu 22.04 LTS 升级到 24.04 LTS

Ubuntu 24.04 LTS 将支持 Ubuntu 桌面、Ubuntu 服务器和 Ubuntu Core 5 年,直到 2029 年 4 月。 本文将介绍如何将当前 Ubuntu 22.04 系统升级到最新 Ubuntu 24.04 LTS版本。 备份个人数据 以防万一,把系统中的重要数据自己备份一下~ 安装配置SSH访问…...

Springboot3.x配置类(Configuration)和单元测试

配置类在Spring Boot框架中扮演着关键角色,它使开发者能够利用Java代码定义Bean、设定属性及调整其他Spring相关设置,取代了早期版本中依赖的XML配置文件。 集中化管理:借助Configuration注解,Spring Boot让用户能在一个或几个配…...

Python:类方法、实例方法与静态方法深度解析(补)

目录 一.实例变量 二.类变量 三.实例方法 四.类方法 五.静态方法 六.小结 总结 今天看程序时,发现自己好像忘了这三者的区别,所以重新写了一篇深度解析,希望之前看博客没看懂的小伙伴可以通过这个博客分清楚这三个方法。跟的是麦叔的课…...

Certimate:简化 SSL 证书管理的开源工具

引言 SSL(Secure Sockets Layer)证书对于保护网站和用户数据至关重要。然而,管理多个 SSL 证书可能变得繁琐和复杂。为了解决这个问题,Certimate 应运而生。Certimate 是一款开源的 SSL 证书管理工具,旨在简化 SSL 证书的申请、部署和续期流程。它特别适合需要管理多个域…...

rabbitMq举例

新来个技术总监,把 RabbitMQ 讲的那叫一个透彻,佩服! 生产者 代码举例 public String sendMsg(final String exchangeName,final String routingKey,final String msg) {} /*** 发送消息* param exchangeName exchangeName* param routin…...

人工智能增强的音频和聊天协作服务

论文标题:AI-enabled Audio and Chat Collaboration Services 中文标题:人工智能增强的音频和聊天协作服务 作者信息: Emil P. Andersen, Norwegian Defence Research Establishment (FFI), Kjeller, NorwayJesper R. Goksr, Sindre E. Ha…...

ctr: content digest XXX not found

1、问题描述 ctr 推送镜像到本地仓库报错 ctr: content digest sha256:b96e30ccb0a1e225493e53d4f81cb2c27183406e5f902ed43c4bf15dc6f21c9c: not found 2、问题原因 本人的平台是M1,正常情况下载镜像会自动按平台寻找版本,但是由于我下载的镜像版本没…...

java内存模型

文章目录 1.java内存模型2.重排序3.内存屏障3.1四类内存屏障指令 4.happens-before4.1 规则5.volatile5.1特性5.2规则5.3 内存语义5.4 内存屏障插入策略 1.java内存模型 java内存模型(JMM)定义了线程和主内存之间的抽象关系:线程之间的共享变…...

Java Object类与Objects类

1. Object 类 (1) Object类是Java中所有类的祖宗类,因此,Java中所有类的对象都可以直接使用Object类中提供的一些方法(public class Object)。 . (2) Object类常见方法 方法说明public String toString()返回对象的字符串形式public boolean eq…...

【目标检查】YOLO系列之:Triton 推理服务器Ultralytics YOLO11

Triton 推理服务器 1、引言2、Triton服务器2.1 什么是Triton Inference Server2.2 将YOLO11 导出为ONNX 格式2.3 设置Triton 模型库2.3.1 创建目录结构2.3.2 将导出的ONNX 模型移至Triton 资源库 2.4 运行Triton 推断服务器2.4.1 使用 Docker 运行Triton Inference Server2.4.2…...

力扣69. x 的平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1:…...

关于目标检测YOLO 各版本区别v1-v11/vX/vR

概述 YOLO(You Only Look Once,你只看一次)是一系列开创性的实时目标检测模型,它们彻底改变了计算机视觉领域。由Joseph Redmon开发,后续版本由不同研究人员迭代,YOLO模型以其在图像中检测对象的高速度和准…...

求成绩的平均值,统计低于平均分的人数

【问题描述】编写函数double average(double score[ ], int n,int *m)对存放在实型数组中考试成绩进行求平均分和低于平均分的人数,要求在主函数里面进行班级人数和成绩的输入,调用average函数进行计算成绩平均值和低于平均分的人数后,返回主…...

SGD、BGD、MBGD 之间的区别

文章目录 SGD(Stochastic Gradient Descent,随机梯度下降)BGD(Batch Gradient Descent,批量梯度下降)MBGD(Mini-Batch Gradient Descent,小批量梯度下降) 前置&#xff1…...

Android -- WebView之loadData加载html字符串显示网页

目录 前言1. loadUrl 加载网页地址2. loadData 加载Html字符来显示网页3. loadDataWithBaseURL4. 总结 前言 最近在给一个老项目做64位so文件的适配,当应用发布到应用市场上后,用户反馈64位手机上的网页加载不出内容,但32位的手机上是正常…...

单片机:实现数码管00盗99显示(附带源码)

单片机实现数码管00到99显示 在嵌入式开发中,数码管是最常用的显示设备之一,特别适合用于显示数字信息。本项目的目标是利用8051单片机控制数码管实现数字显示,从00到99的循环显示。我们将通过按键或定时器来控制数字的增减,并通…...

大厂面试智力题大全(详细解题思路,持续更新)

目录 八个球有一个比较重,问称几次可以把较重的球拎出来,具体称重的方法是怎样的? 64 匹马 8 个赛道,找出前四名,最少赛多少场(腾讯) 一个城市的加油站数量 5L的水桶和3L的水桶怎么量出4L的水 有一堆粗细不均匀的绳子,燃烧完一个绳子需要2小时,如何用这些绳子凑出…...

使用 acme.sh 签发和自动续期 ssl https 证书

acme.sh 是一个热度非常高的签发和自动续期 https 证书的工具,虽然官网上提供了充分的操作说明,但是不够简洁,本文以在 nginx 中签发和配置http 为例,列出必要的几个简单步骤。 安装 因为网络原因,github 大部分人是…...

YOLOv9改进,YOLOv9引入DLKA-Attention可变形大核注意力,WACV2024,二次创新RepNCSPELAN4结构

摘要 作者引入了一种称为可变形大核注意力 (D-LKA Attention) 的新方法来增强医学图像分割。这种方法使用大型卷积内核有效地捕获体积上下文,避免了过多的计算需求。D-LKA Attention 还受益于可变形卷积,以适应不同的数据模式。 理论介绍 大核卷积(Large Kernel Convolu…...

docker安装mysql8

上一篇提到了docker安装mysql5.7和mysql8有所不同,这一篇说一下mysql8的安装 1、宿主机创建映射目录 mkdir -p /data/mysql8/log mkdir -p /data/mysql8/data mkdir -p /data/mysql8/conf这里我放在了/data/mysql8目录下 2、拉取mysql镜像 docker pull mysql:8.…...

【云原生知识】Kubernets实践-前端服务如何访问后端服务

文章目录 概述步骤1:部署后端服务步骤2:配置Nginx步骤3:创建Nginx服务总结 如何确保 Nginx 能持续访问后端服务?相关文献 概述 假设你正在使用Kubernetes作为容器云平台,以下是如何配置Nginx以及相关服务,…...

M3DM的autodl环境构建过程笔记

文章目录 在3D-ADS环境https://blog.csdn.net/tfxzgp/article/details/144259472基础上构建(失败的记录,不用看)更换镜像重来(成功)安装缺少的包修改models.py中的RGB和点云backbone的路径修改main.py路径参数运行 在3D-ADS环境https://blog.…...

jmeter CLI Mode 传参实现动态设置用户数

一.需求 CLI 运行模式下每次运行想要传入不同的用户数,比如寻找瓶颈值的场景,需要运行多次设置不同的用户数。 二.解决思路 查看官方API Apache JMeter - Users Manual: Getting Started api CLI Mode 一节中提到可以使用如下参数做属性的替换&#…...

Mac系统下 jdk和maven 安装教程

一、jdk安装教程 1、先去官网选择对应版本下载 官网网址:Java SE | Oracle Technology Network | Oracle 中国 这里我选择的是jdk8的版本,如果你们想下载更高的版本就选择其他版本,目前大部分公司和教程使用jdk8的版本比较多。 点击macos&a…...

pyfink1.20版本下实现消费kafka中数据并实时计算

1、环境 JDK版本:1.8.0_412python版本:3.10.6apache-flink版本:1.20.0flink版本:1.20kafka版本:kafka_2.12-3.1.1flink-sql-connector-kafka版本:3.3.0-1.202、执行python-flink脚本 从kafka的demo获取消…...

【经验分享】私有云运维的知识点

最近忙于备考没关注,有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源,但我以交流、交换为主,笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟,为了避免更多人花没必要的钱,所以决定公…...

影像组学+病理组学+深度学习人工智能应用

影像组学 基础学习内容: 特征提取:使用pyradiomics进行形状、纹理、小波变换等特征提取。特征筛选:应用ICC、相关系数、mRMR、Lasso等方法。建模:使用LR、SVM、RF、XGBoost、LightGBM等机器学习算法。模型评估:通过A…...

how to write 述职pptx as a tech manager

As a technical manager, crafting an effective 述职 (performance review) PPT requires you to highlight your leadership, team accomplishments, technical contributions, challenges faced, and future plans. Heres a structured approach to design your PPT: 1. Cov…...

用户发送请求后服务端i/o工作过程

华子目录 服务端i/o介绍磁盘i/o机械磁盘的寻道时间、旋转延迟和数据传输时间常见的机械磁盘平均寻道时间值常见磁盘的平均延迟时间每秒最大IOPS的计算方法 网络i/o网络I/O处理过程磁盘和网络i/o 一次完整的请求在内部的执行过程 服务端i/o介绍 i/o在计算机中指Input/Output&am…...

功能篇:springboot实现防盗链功能

防盗链(Hotlink Protection)是一种防止其他网站直接链接到你网站的资源(如图片、视频等),从而节省带宽和保护内容的有效手段。在Spring Boot应用程序中实现防盗链功能,可以通过多种方式来达成,例…...

MySQL迁移SQLite

将 MySQL 的表结构和数据迁移到 SQLite,可以通过以下步骤实现。这个过程主要包括导出 MySQL 数据库到 SQL 文件,然后将其导入到 SQLite 数据库中。 步骤 1: 导出 MySQL 数据库 首先,需要将 MySQL 数据库导出为一个 SQL 文件。可以使用 mysq…...

嵌入式面试知识点总结 -- 面试篇

1、请你做个简单的自我介绍 把所有工作内容,分类整理出和岗位匹配的能力关键字,然后围绕关键字展开讲。每段经历要用数据来支撑。 例如: 面试官你好,我叫XXX,毕业于XXX,很荣幸参加此次面试。 围绕面试岗位…...

华为OD机试真题---观看文艺汇演问题

华为OD机试中的“观看文艺汇演问题”是一道考察算法与数据结构能力的题目。以下是对该题目的详细解析: 一、题目描述 为了庆祝某个重要节日(如中国共产党成立100周年),某公园将举行多场文艺表演。很多演出都是同时进行的&#x…...

类OCSP靶场-Kioptrix系列-Kioptrix Level 2

一、前情提要 二、实战打靶 1. 信息收集 1.1. 主机发现 1.2. 端口扫描 1.3.目录遍历 2.漏洞发现 2.1. 登录框测试 2.2. 发现命令执行 2.3 构造命令执行利用payload 3.提权 3.1. 搜索提权exp 3.2. 查看exp信息 3.3. Privilege Escalation的exp利用 exp_9542 一、前…...

openlane

openlane数据集,lane3d_1000里训练集157807张图片,测试集39981张图,md太多了...

修改vscode设置的原理

转载请标明出处:小帆的帆的专栏 修改vscode设置 首先需要理解的是,vscode的系统设置和插件设置都是通过settings.json文件管理的。 vscode中有三个Settings,三个Settings分别对应三个settings.json文件 Default Settings:默认…...

解决docker环境下aspose-words转换word成pdf后乱码问题

描述 环境&#xff1a;docker 部署工具&#xff1a;Jenkins 需求&#xff1a;本地上传的word文档需要转换成pdf 问题&#xff1a;转换之后的pdf文档出现小框框&#xff08;乱码&#xff09; 转换成PDF的操作 pom&#xff1a; <dependency><groupId>org.apach…...

2024年12月16日Github流行趋势

项目名称&#xff1a;PDFMathTranslate 项目维护者&#xff1a;Byaidu reycn hellofinch Wybxc YadominJinta项目介绍&#xff1a;基于 AI 完整保留排版的 PDF 文档全文双语翻译&#xff0c;支持 Google/DeepL/Ollama/OpenAI 等服务&#xff0c;提供 CLI/GUI/Docker。项目star数…...

ElasticSearch 常见故障解析与修复秘籍

文章目录 一、ElasticSearch启动服务提示无法使用root用户二、ElasticSearch启动提示进程可拥有的虚拟内存少三、ElasticSearch提示用户拥有的可创建文件描述符太少四、ElasticSearch集群yellow状态分析五、ElasticSearch节点磁盘使用率过高&#xff0c;read_only状态问题解决六…...

用 Python Turtle 绘制经典汤姆猫:重温卡通角色的经典魅力

用 Python Turtle 绘制经典汤姆猫&#xff1a;重温卡通角色的经典魅力 &#x1f438; 前言 &#x1f438;&#x1f41e;往期绘画>>点击进所有绘画&#x1f41e;&#x1f40b; 效果图 &#x1f40b;&#x1f409; 代码 &#x1f409; &#x1f438; 前言 &#x1f438; 汤…...

数据结构Day4: 链表函数封装 ; 思维导图

目录 作业&#xff1a;实现链表剩下的操作&#xff1a; 任意位置删除 按位置修改 按值查找返回地址 反转 销毁 运行结果 思维导图 作业&#xff1a;实现链表剩下的操作&#xff1a; 1>任意位置删除 2>按位置修改 3>按值查找返回地址 4>反转 5>销毁 任意…...

用 Python Turtle 绘制一只可爱的小狗:用代码捕捉狗狗的萌态

用 Python Turtle 绘制一只可爱的小狗&#xff1a;用代码捕捉狗狗的萌态 &#x1f438; 前言 &#x1f438;&#x1f41e;往期绘画>>点击进所有绘画&#x1f41e;&#x1f40b; 效果图 &#x1f40b;&#x1f409; 代码 &#x1f409; &#x1f438; 前言 &#x1f438; …...

人工智能浪潮来袭:2024年技术革命与产业变革深度解析@附64页PDF文件下载

随着2024年的到来&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度、广度和深度改变着我们的生产和生活方式。在这篇深度解析中&#xff0c;我们将带您一探AI技术的最新发展、产业应用的现状以及未来的安全治理趋势。 技术革命&#xff1a;AI技术的新范…...

python 下载 b站视频 和音频

video_bvid&#xff1a; import os import requests import json import re from bs4 import BeautifulSoup import subprocess # from detail_video import video_bvid# video_bvid 是一个从外部得到的单个视频ID video_bvid BV1cx421Q7veclass BilibiliVideoAudio:def __in…...

【蓝桥杯选拔赛真题93】Scratch青蛙过河 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析

目录 Scratch青蛙过河 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 Scr…...

flink sink kafka的事务提交现象猜想

现象 查看flink源码时 sink kafka有事务提交机制&#xff0c;查看源码发现是使用两阶段提交策略&#xff0c;而事务提交是checkpoint完成后才执行&#xff0c;那么如果checkpoint设置间隔时间比较长时&#xff0c;事务未提交之前&#xff0c;后端应该消费不到数据&#xff0c…...

Oracle 临时表空间管理与最佳实践

Oracle 临时表空间管理与最佳实践 内容摘要 本文深入探讨了Oracle数据库中临时表空间的管理和最佳实践。主要内容包括&#xff1a; 临时表空间的概述及其在Oracle 19c多租户架构中的特点临时表空间组的优势及其创建方法非临时表空间组的临时表空间日常维护操作命令临时表空间…...