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

Git——本地使用详解

目录

  • Git
    • 1、开始版本控制
      • 1.1、初始化Repository
      • 1.2、使目录脱离Git控制
    • 2、把文件交给Git管控
      • 2.1、创建文件后交给Git
      • 2.2、git add之后再次修改文件
      • 2.3、git add "--all"与"."参数区别
      • 2.4、把暂存区的内容提交到存储库里存档
    • 3、工作区、暂存区与存储库
      • 3.1、二段式提交
      • 3.2、跳过add直接commit
    • 4、查看Commit记录
      • 4.1、使用git log命令
      • 4.2、查询历史记录常用条件
    • 5、删除或变更文件名
      • 5.1、删除文件
        • 1、直接删除
        • 2、使用Git命令删除
        • 3、使文件脱离Git控制
      • 5.2、变更文件名
        • 1、直接改名
        • 2、使用Git命令改名
      • 5.3、文件的名称不重要
    • 6、修改Commit记录
    • 7、追加文件到最近一次的Commit
    • 8、新增目录
    • 9、有些文件不想放在Git中
    • 10、查看特定文件的Commit记录
    • 11、查看某行代码是谁写的
    • 12、意外删除文件或目录
      • 12.1、恢复被删除的文件或目录
      • 12.2、Git恢复文件的原理
    • 13、拆掉Commit重做(git reset)
      • 13.1、拆掉重做
      • 13.2、Reset模式
      • 13.3、Reset实际意义
    • 14、恢复使用hard模式Reset的Commit
      • 14.1、退回Reset前
      • 14.2、使用Reflog
    • 15、HEAD
      • 15.1、HEAD简介
      • 15.2、切换分支的时候
    • 16、只Commit一个文件的部分内容

Git

1、开始版本控制

1.1、初始化Repository

新建一个目录,并使用git init命令初始化Repository:

mkdir mygit
git init

git init命令会在mygit目录中创建一个.git目录。

1.2、使目录脱离Git控制

Git的版控很单纯,全都是靠.git目录在做事。如果这个目录不想被版控,或者只想给客户不含版控记录的内容,只要把.git目录移除,Git就对这个目录失去控制权了。

2、把文件交给Git管控

2.1、创建文件后交给Git

创建一个内容为"hell, git"的文件,并命名为welcome.html:

echo "hello, git" > welcome.html

使用git status命令查看状态:
在这里插入图片描述

这个welcome.html文件当前的状态是Untracked files,即这个文件尚未被加到Git版控系统中,还未正式被Git“追踪”,只是刚刚加入这个目录而已。

使用git add命令,把welcome.html文件交给Git,让Git开始追踪它:

git add welcome.html

再次使用git status命令查看当前的状态:
在这里插入图片描述

从以上信息可以看出,文件状态已从Untracked变成new file。这表示该文件已经被安置到暂存区(Staging Area)。

2.2、git add之后再次修改文件

设想一下下面这样一种情境:

  1. 新增了一个文件abc.txt。
  2. 执行git add abc.txt命令,把文件加至暂存区。
  3. 编辑abc.txt文件。
echo "hello world" > abc.txt
git add abc.txt
echo "hw" > abc.txt

完成编辑后,可能想要进行Commit,把刚刚改动的内容保存下来。这是新手很容易犯的错误之一,以为执行Commit命令就能把所有的异动都保存下来,事实上这样的想法是不正确的。执行git status命令,看一下当前的状态:
在这里插入图片描述

可以发现,abc.txt文件变成了两个,步骤(2)的确把abc.txt文件加入暂存区了,但在步骤(3)中又编辑了该文件。对Git来说,编辑的内容并没有“再次被加入暂存区,所以此时暂存区中的数据还是步骤(2)中加进来的那个文件。

如果确定这个改动是你想要的,那就再次使用git add abc.txt命令,把abc.txt文件加入暂存区。

2.3、git add “–all"与”."参数区别

Git 1.x:

参数新增文件改动文件删除文件
--all
.

Git 2.x:

参数新增文件改动文件删除文件
--all
.

也就是说,在Git 2.x之后,这两个参数在功能上就没什么区别了。

2.4、把暂存区的内容提交到存储库里存档

如果仅是通过git add命令把异动加到暂存区,还不算是完成整个流程。如果想让暂存区的内容永久保存下来,就要使用git commit命令。

git commit -m "init commit"

在后面加上-m "init commit"是要说明“这次的Commit做了什么事”,只要使用简单、清楚的文本说明即可,中英文都可以,重点是要说清楚,能让自己和别人很快明白就行。

在这里插入图片描述

在执行git commit命令时,如果没有在后面加上信息参数,默认会弹出一个黑色的画面,也就是编辑器——Vim。让我们输入提交信息:

在这里插入图片描述

另外,如果没有内容,也可以Commit,只要加上--allow-empty参数。

git commit --allow-empty -m "empty commit"

3、工作区、暂存区与存储库

3.1、二段式提交

在Git中,针对工作目录、暂存区以及存储库3个主要区域,可以通过不同的Git命令,把文件移往不同的区域,如图所示:

在这里插入图片描述

3.2、跳过add直接commit

如果觉得先add再commit有点烦琐,可以在Commit时多加一个-a参数,缩短这个流程:

echo "ccc" > c.txt
git commit -a -m "quick commit test."

这样即使没有先add,也可以完成Commit。但要注意的是,这个-a参数只对已经存在于Repository区域的文件有效,对新加入(也就是Untracked files)的文件是无效的。

在这里插入图片描述

4、查看Commit记录

4.1、使用git log命令

git log

在这里插入图片描述

越新的信息会显示在越上面。从上面这段信息中大致可以看出以下内容:

  1. Commit的作者是谁
  2. 什么时候Commit的
  3. 每次的Commit大概做了些什么事

在使用git log命令时,如果加上额外参数,可以看到不一样的输出格式。例如,加上--oneline–-graph参数:

git log --oneline --graph

在这里插入图片描述

输出的结果就会更为精简,可以一次性看到更多的Commit。

4.2、查询历史记录常用条件

想要找某个人或某些人的Commit:

# 使用 --author参数
git log --oneline --author="ActonZhang"# 使用 | 表示或者,注意使用时需要加上\进行转义
git log --oneline --author="ActonZhang\|Tom"

想要找Commit信息中是否包含有某些关键字:

# 使用 --grep 参数
git log --oneline --grep="second"

想要找Commit文件中的内容:

# 使用 -S 参数
git log -S "hw"

想要找某一段时间内的Commit:

# 使用 --since --until --after 参数
# 查询今天上午9点到下午11点之间的Commit
git log --oneline --since="9am" --until="11pm"# 查询2017年1月之后,每天上午9点到下午11点之间的Commit
git log --oneline --since="9am" --until="11pm" --after="2017-01"

5、删除或变更文件名

在Git中,无论是删除文件还是变更文件名,对Git来说都是一种“改动”。

5.1、删除文件

1、直接删除

可以使用系统命令rm或资源管理器之类的工具来删除文件。例如:

rm -rf welcome.html

删除后查看状态:
在这里插入图片描述

可以看到welcome.html文件当前的状态是deleted。如果确定这是你想做的,就可以把这次的“改动”加到暂存区,然后Commit即可:

git add welcome.html
git commit -m "delete welcome."

如果“把删除文件加到暂存区”让你觉得不好理解,就把“删除文件”也当作一种“改动”就行了。

2、使用Git命令删除

可以先执行rm命令删除,然后再执行git add命令加入暂存区的两段式动作,也可以直接使用git rm命令来完成:

git rm abc.txt 

这时候查看状态会发现,“它就直接在暂存区了,不需要再add一次,可以少做一个步骤:
在这里插入图片描述

随后直接Commit即可:

git commit -m "delete abc.txt"
3、使文件脱离Git控制

不论是执行rm命令,还是执行git rm命令,都会真的把这个文件从工作目录中删除。如果不是真的想把这个文件删除,只是不想让这个文件再被Git控制了,可以加上-- cached参数:

git rm b.txt --cached 

查看状态,b.txt的状态从原本已经在Git目录中的tracked变成Untracked了:

在这里插入图片描述

随后直接Commit即可:

git commit -m "untrack b.txt"

5.2、变更文件名

1、直接改名

与删除文件一样,变更文件名也是一种“改动”,所以在操作上也是差不多的:

mv a.txt aa.txt

查看状态,会看到两个状态的改变,虽然只是更改文件名,但对Git来说会被认为是两个动作,一个是删除a.txt文件,另一个是新增aa.txt文件(变成Untracked状态)。
在这里插入图片描述

git add aa.txt
git commit -m "rename a.txt to aa.txt"

在这里插入图片描述

git rm a.txt
git commit -m "delete a.txt"
2、使用Git命令改名
git mv aa.txt aaa.txt

在这里插入图片描述

git commit -m "rename aa.txt to aaa.txt"

5.3、文件的名称不重要

Git是根据文件的“内容”来计算SHA-1的值,所以文件的名称不重要,重要的是文件的内容。当更改文件名时,Git并不会为此做出一个新的Blob对象,而只是指向原来的那个Blob对象。但因为文件名变了,所以Git会为此做出一个新的Tree对象。

6、修改Commit记录

要改动Commit记录,有以下几种方式。

  1. 把.git目录整个删除(不建议)
  2. 使用git rebase命令来改动历史记录
  3. 先把Commit用git reset命令删除,整理后再重新Commit
  4. 使用--amend参数改动最后一次的Commit

这里采用第四种方式,先提交一个空Commit记录:

git commit --allow-empty -m "WTF"

在这里插入图片描述

要改动最后一次的Commit信息,只需直接在Commit命令后面加上--amend参数即可:

git commit --amend --allow-empty -m "heiheihei..."

在这里插入图片描述

虽然只是修改记录的信息,其他什么都没有改,但对Git来说,因为Commit的内容改变了,所以Git会重新计算并产生一个新的Commit对象,这其实是一次全新的Commit(只是看起来不像新的)。例如,上面这个例子中,改动前的Commit对象的SHA-1值在改完信息之后变了。虽然Commit的时间与文件的内容看起来并没有被改动,但它仍是一次全新的Commit。

7、追加文件到最近一次的Commit

可以采用下面这两种方式来完成:

  1. 使用git reset命令把最后一次的Commit删除,加入新文件后再重新Commit
  2. 使用--amend参数进行Commit

此处采用第二种方式,假设有一个Untracked的b.txt文件,想把它加入到最近一次的Commit中:
在这里插入图片描述

# 先加入暂存区
git add b.txt# 加入到最近一次Commit,--no-edit参数表示不需要编辑Commit信息
git commit --amend --no-edit

像这样改动历史记录的操作,尽量不要应用在已经Push出去的Commit上。

8、新增目录

# 新建目录
mkdir images# 查看状态
git status

在这里插入图片描述

发现Git的状态依旧没有变化,因为Git在计算、产生对象时,是根据“文件的内容”进行计算的,所以只是新增一个目录的话,Git是无法处理它的。

如果想要新增目录,只要在空目录中随便放一个文件就行了。如果当前还没有文件可以放,或者不知道该放什么文件,通常可以放一个名为“.keep”或“.gitkeep”的空文件,让Git能“感应”到这个目录的存在:

touch images/.keep
git status

在这里插入图片描述

可以发现,Git已经感知到这个目录的存在了(其实是感应到里面那个.keep文件的存在),接下来按照一般的流程进行add和commit即可。

git add .
git commit -m "add dir"

9、有些文件不想放在Git中

如果不想把文件放在Git中,只需在项目目录中放一个.gitignore文件,并且设置想要忽略的规则即可。如果这个文件不存在,就手动新增它:

touch .gitignore

然后编辑这个文件的内容:

# 忽略所有后缀是.yml的文件
*.yml

只要.gitignore文件存在,即使这个文件没有被Commit或Push上Git服务器,也会有效果。但通常建议将这个文件Commit进项目并且push上Git服务器,以便让一起开发项目的所有人可以共享相同的文件。

在新增文件时,只要符合.gitignore文件中的规定,这个文件就会被忽视。

touch secret.yml
git status

在这里插入图片描述

secret.yml这个文件虽然确实存在这个目录中,但Git已经“感应”不到它了,即它被Git无视了。

虽然.gitignore文件列出了一些忽略的规则,但其实这些忽略的规则也是可以被忽略的。只需在执行git add命令时加上-f参数:

git add -f 文件名称

如果想清除那些已经被忽略的文件,可以使用git clean命令并配合-X参数:

git clean -fX

10、查看特定文件的Commit记录

git log可以查看整个项目的Commit记录,但如果只想查看单一文件的记录,可在git log后面接上那个文件名:

git log b.txt

在这里插入图片描述

这样就能看到这个文件Commit的历史记录。如果想查看这个文件每次的Commit做了什么改动,可以再给它加上一个-p参数:

git log -p b.txt

在这里插入图片描述

11、查看某行代码是谁写的

可使用git blame命令找出来:

git blame user.sql

在这里插入图片描述

这样就可以很清楚地看出来哪一行代码是谁在什么时候写的,而最前面看起来像乱码的文本,正是每次Commit的识别代码,表示这一行代码是在哪一次的Commit中加进来的。

如果文件太大,也可以加上-L参数,只显示指定行数的内容:

git blame -L 10,15 user.sql

在这里插入图片描述

12、意外删除文件或目录

12.1、恢复被删除的文件或目录

先删除user.sql文件:

rm -rf user.sql

查看状态:

git status

在这里插入图片描述

查看文件列表:

ls -al

在这里插入图片描述

如果要把user.sql挽救回来,可以使用git checkout命令:

git checkout user.sql# 如果要恢复多个文件,可以使用.
git checkout .

查看状态:
在这里插入图片描述
查看文件列表:
在这里插入图片描述

这个技巧不仅可以将删除的文件挽救回来,当改动某个文件后反悔了,也可以用它把文件恢复到上一次Commit的状态。

不是所有情况下都能恢复被删除的文件的。因为整个Git的记录都是放在根目录下的.git目录中,如果这个目录被删除了,也就意味着历史记录也被删除了,那么删除的文件也就不能恢复了。

12.2、Git恢复文件的原理

当使用git checkout命令时,Git会切换到指定的分支,但如果后面接的是文件名或路径,Git则不会切换分支,而是把文件从.git目录中复制一份到当前的工作目录。

更精准地说,这个命令会把暂存区(Staging Area)中的内容或文件拿来覆盖工作目录中(Working Directory)的内容或文件。因此,在上面执行git checkout user.sqlgit checkout .命令时,会把user.sql文件或者当前目录下的所有文件恢复到上一次Commit的状态。

如果在执行这个命令时多加了一个参数:

git checkout HEAD~2 user.sql

那么距离现在两个版本以上的那个user.sql文件就会被用来覆盖当前工作目录中的user.sql文件,但要注意,这同时也会更新暂存区的状态。

git checkout HEAD~2 .

这个命令的意思就是“用距离现在两个版本以上的文件来覆盖当前工作目录中的文件,同时更新暂存区中的状态”。

13、拆掉Commit重做(git reset)

13.1、拆掉重做

先查看当前的Git记录:

git log --oneline

在这里插入图片描述

如果想拆掉最后一次的Commit,可以采用“相对”或“绝对”的做法。

“相对”的做法是这样的:

git reset 7d66c8c^
# 最后的那个“^”符号代表的是“前一次”,所以7d66c8c^是指7d66c8c这个Commit的前一次;
# 如果是7d66c8c^^,则是往前两次……以此类推。
# 不过如果要倒退5次,通常不会写作7d66c8c^^^^^,而是写成7d66c8c~5”

因为刚好HEAD与master当前都是指向7d66c8c这个Commit,而且7d66c8c不太好记,所以上面这行通常会改写成:

git reset master^
# 或
git reset HEAD^

以这个例子来说,这两个命令会得到一样的结果。

"绝对"的方式如下:

如果很清楚要把当前的状态退回到哪个Commit,可以直接指明:

git reset dbca90c

它就会切换到dbca90c这个Commit的状态,因为dbca90c刚好就是7d66c8c的前一次Commit。以这个例子来说,也会达到与“拆掉最后一次的Commit”一样的效果。

13.2、Reset模式

git reset命令可以搭配参数使用。常用参数有3个,分别是--mixed--soft以及--hard。搭配不同的参数,执行结果会有些微差别:

  • mixed模式--mixed是默认的参数,如果没有另外加参数,git reset命令将使用--mixed模式。该模式会把暂存区的文件删除,但不会影响工作目录的文件。也就是说,Commit拆出来的文件会留在工作目录,但不会留在暂存区。
  • soft模式:这种模式下的Reset,其工作目录与暂存区的文件都不会被删除,所以看起来就只有HEAD的移动而已。因此,Commit拆出来的文件会直接放在暂存区。
  • hard模式:在这种模式下,无论是工作目录还是暂存区的文件,都会被删除。
模式工作目录暂存区
mixed不变被删除
soft不变不变
hard被删除被删除

如果上面的说明让你不容易想象到底发生了什么事,那么只要记住这些不同的模式,就能决定“Commit拆出来的那些文件何去何从:

模式Commit拆出来的文件
mixed放回工作目录
soft放回暂存区
hard直接删除

13.3、Reset实际意义

Reset通常翻译为“重新设置”,但在Git中,将Reset解释为“前往”或“变成”更为贴切,即go to或become的意思。当执行以下命令时:

git reset HEAD~2

该命令可能会被解读成“请帮我拆掉最后两次的Commit”,但其实用“拆”这个动词只是为了便于理解而已,事实上并没有真的把Commit“拆掉”(放心,所有的Commit都还在)。

准确地说,上面这个命令应该解读成“我要前往两个Commit之前的状态”或“我要变成两个Commit之前的状态”,而随着使用不同的参数模式,原本的这些文件就会移去不同的区域。

因为实际上git reset命令也并不是真的删除或重新设置Commit,只是“前往”到指定的Commit。那些看起来好像不见的东西只是暂时看不到了,但随时都可以再救回来。

14、恢复使用hard模式Reset的Commit

14.1、退回Reset前

查看Commit记录:

git log --oneline

在这里插入图片描述

首先要树立一个观念,不管用什么模式进行Reset,Commit就是Commit,并不会因为Reset就马上消失。假设先用默认模式的git reset命令倒退一步:

git reset HEAD~1

这时Commit看起来就会少一个,同时拆出来的文件会被放置在工作目录中:

在这里插入图片描述
在这里插入图片描述

如果想要退回刚刚Reset的这个步骤,只要Reset回一开始那个Commit的SHA-1 7d66c8c即可:

git reset 7d66c8c --hard

刚刚看起来拆掉的Commit就又回来了。这里使用了--hard参数,可以强迫放弃Reset之后改动的文件。

14.2、使用Reflog

如果一开始没有记录Commit的SHA-1值也没关系,可以利用Git中的Reflog命令保留一些记录。再次借用上一个例子,但这次改用--hard模式进行Reset:

git reset HEAD~1 --hard 

查看状态:
在这里插入图片描述
查看文件列表:
在这里插入图片描述

查看Commit记录:
在这里插入图片描述

可以发现,不仅Commit不见了,文件也消失了。

接着可以使用Reflog命令来看一下记录:

git reflog 

在这里插入图片描述

当HEAD移动时(如切换分支或者Reset都会造成HEAD移动),Git就会在Reflog中留下一条记录。

所以如果想要取消这次的Reset,就可以“Reset到它Reset前的那个Commit”(很像绕口令)。在这个例子中就是7d66c8c,所以只要这样:

git reset 7d66c8c --hard

就可以把刚刚hard reset的东西再次救回来了。

git log命令如果加上-g参数,也可以进行Reflog。

15、HEAD

15.1、HEAD简介

HEAD是一个指标,指向某一个分支,通常可以把它当作“当前所在分支”来看待。在.git目录中有一个名为HEAD的文件,其中记录的就是HEAD的内容。来看一下它到底长什么样:

cat .git/HEAD

在这里插入图片描述

从这个文件可以看出,HEAD当前正指向master分支。如果有兴趣再深入看一下refs/heads/master的内容就会发现,其实所谓的master分支也不过就是一个40个字节的文件罢了:

cat .git/refs/heads/master

在这里插入图片描述

15.2、切换分支的时候

假设当前项目包括3个分支,而当前正在master分支上:

$ git branch 
cat 
dog 
* master

接下来试着切换到cat分支:

$ git checkout cat 
Switched to branch 'cat'

这时看一下刚刚那个HEAD文件的内容:

$ cat .git/HEAD 
ref: refs/heads/cat

HEAD的内容变成refs/heads/cat了。再试着切换到dog分支:

$ git checkout dog 
Switched to branch 'cat'

再确认一下HEAD的内容:

$ cat .git/HEAD 
ref: refs/heads/dog

它又改成指向dog分支了。也就是说,HEAD通常会指向当前所在的分支。不过HEAD也不一定总是指向某个分支,当HEAD没有指向某个分支时便会造成detached HEAD的状态。

在切换分支的同时,HEAD的内容会改变,当HEAD的内容改变的时候,Reflog也会留下记录。

16、只Commit一个文件的部分内容

假设index.html文件如下:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>首页</title>
</head>
<body><div class="container"><h1 id="heading">头版消息</h1><div>内文   内文    内文    内文</div><div id="footer">没有版权,随意使用</div></div>
</body>
</html>

我们修改一下:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>首页1</title>
</head>
<body><div class="container"><h1 id="heading">头版消息1</h1><div>内文   内文    内文    内文1</div><div id="footer">没有版权,随意使用1</div></div>
</body>
</html>

如果因为某些原因不想Commit footer区域,在Git中也可以先Commit其他的部分:

git add -p index.html

在这里插入图片描述

当使用git add命令时,如果加上-p参数,Git就会询问是否要把这个区域(hunk)加到暂存区:

y - 暂存此区块
n - 不暂存此区块
q - 退出;不暂存包括此块在内的剩余的区块
a - 暂存此块与此文件后面所有的区块
d - 不暂存此块与此文件后面所有的区块
g - 选择并跳转至一个区块
/ - 搜索与给定正则表达示匹配的区块
j - 暂不决定,转至下一个未决定的区块
J - 暂不决定,转至一个区块
k - 暂不决定,转至上一个未决定的区块
K - 暂不决定,转至上一个区块
s - 将当前的区块分割成多个较小的区块
e - 手动编辑当前的区块
? - 输出帮助

选择e,就会出现编辑器,显示以下内容:
在这里插入图片描述

在这里就可以编辑想要加到暂存区的区域。因为不想把footer区域加进去,所以就把那1行删掉,存档并离开即可“把部分内容加到暂存区”。看一下当前的状态:
在这里插入图片描述

在这里插入图片描述

可以看出,index.html文件有部分在暂存区,同时也有一份包括那1行的版本在工作目录。这样就可以先Commit部分内容了。

相关文章:

Git——本地使用详解

目录 Git1、开始版本控制1.1、初始化Repository1.2、使目录脱离Git控制 2、把文件交给Git管控2.1、创建文件后交给Git2.2、git add之后再次修改文件2.3、git add "--all"与"."参数区别2.4、把暂存区的内容提交到存储库里存档 3、工作区、暂存区与存储库3.1…...

深度学习pytorch——Tensor维度变换(持续更新)

view()打平函数 需要注意的是打平之后的tensor是需要有物理意义的&#xff0c;根据需要进行打平&#xff0c;并且打平后总体的大小是不发生改变的。 并且一定要谨记打平会导致维度的丢失&#xff0c;造成数据污染&#xff0c;如果想要恢复到原来的数据形式&#xff0c;是需要…...

Selenium-webdriver_manager判断是否已经下载过驱动(复用缓存驱动)

1,谷歌浏览器默认位置 2&#xff0c;ChromeDriverManager 下载的驱动位置 其中admin为机器的用户名 def installDriver(self):"""判断是否需要下载driver""""""找到本机谷歌浏览器版本""""""C:\P…...

【SQL】1174. 即时食物配送 II (窗口函数row_number; group by写法;对比;定位错因)

前述 推荐学习&#xff1a; 通俗易懂的学会&#xff1a;SQL窗口函数 题目描述 leetcode题目&#xff1a;1174. 即时食物配送 II 写法一&#xff1a;窗口函数 分组排序&#xff08;以customer_id 分组&#xff0c;按照order_date 排序&#xff09;&#xff0c;窗口函数应用。…...

mvcc介绍

前提&#xff1a;在介绍mvcc之前&#xff0c;先简单介绍一下mysql事务的相关问题&#xff0c;mvcc归根结底是用来解决事务并发问题的&#xff0c;当然这个解决不是全部解决&#xff0c;只是解决了其中的一部分问题&#xff01; mysql事务 一、事务的基本要素&#xff08;ACID&a…...

强化PaaS平台应用安全:关键策略与措施

PaaS&#xff08;平台即服务&#xff0c;Platform-as-a-Service&#xff09;是一种云计算服务模式&#xff0c;可以为客户提供一个完整的云平台&#xff08;硬件、软件和基础架构&#xff09;以用于快捷开发、运行和管理项目&#xff0c;从而降低了企业云计算应用的高成本和复杂…...

K8s 集群高可用master节点ETCD挂掉如何恢复?

写在前面 很常见的集群运维场景&#xff0c;整理分享博文内容为 K8s 集群高可用 master 节点故障如何恢复的过程理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼前的风景已经和从前不一样了。——村上…...

【Godot 4.2】常见几何图形、网格、刻度线点求取函数及原理总结

概述 本篇为ShapePoints静态函数库的补充和辅助文档。ShapePoints函数库是一个用于生成常见几何图形顶点数据&#xff08;PackedVector2Array&#xff09;的静态函数库。生成的数据可用于_draw和Line2D、Polygon2D等进行绘制和显示。因为不断地持续扩展&#xff0c;ShapePoint…...

如何利用POI导出报表

一、报表格式 二、依赖坐标 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version> </dependency> <dependency><groupId>org.apache.poi</groupId><art…...

自动部署SSL证书到阿里云腾讯云CDN

项目地址&#xff1a;https://github.com/yxzlwz/ssl_update 项目简介 目前&#xff0c;自动申请和管理免费SSL证书的项目有很多&#xff0c;如个人正在使用的 acme.sh。然而在申请后&#xff0c;如果我们的需求不仅限于服务器本地的使用&#xff0c;证书的部署也是一件麻烦事…...

【系统性】 循序渐进学C++

循序渐进学C 第一阶段&#xff1a;基础 一、环境配置 1.1.第一个程序&#xff08;基本格式&#xff09; ​ #include <iosteam> using namespace std;int main(){cout<<"hello world"<<endl;system("pause"); }​ 模板 #include &…...

rust - 一个日志缓存记录的通用实现

本文给出了一个通用的设计模式&#xff0c;通过建造者模式实例化记录对象&#xff0c;可自定义格式化器将实例化后的记录对象写入到指定的缓存对象中。 定义记录对象 use chrono::prelude::*; use std::{cell::RefCell, ffi::OsStr, fmt, io, io::Write, path::Path, rc::Rc,…...

elasticsearch(RestHighLevelClient API操作)(黑马)

操作全是换汤不换药&#xff0c;创建一个request&#xff0c;然后使用client发送就可以了 一、增加索引库数据 Testvoid testAddDocument() throws IOException {//从数据库查出数据Writer writer writerService.getById(199);//将查出来的数据处理成json字符串String json …...

用尾插的思想实现移除链表中的元素

目录 一、介绍尾插 1.链表为空 2.链表不为空 二、题目介绍 三、思路 四、代码 五、代码解析 1. 2. 3. 4. 5. 6. 六、注意点 1. 2. 一、介绍尾插 整体思路为 1.链表为空 void SLPushBack(SLTNode** pphead, SLTDataType x) {SLTNode* newnode BuyLTNode(x); …...

【Kubernetes】k8s删除master节点后重新加入集群

目录 前言一、思路二、实战1.安装etcdctl指令2.重置旧节点的k8s3.旧节点的的 etcd 从 etcd 集群删除4.在 master03 上&#xff0c;创建存放证书目录5.把其他控制节点的证书拷贝到 master01 上6.把 master03 加入到集群7.验证 master03 是否加入到 k8s 集群&#xff0c;检查业务…...

HCIP—OSPF虚链路实验

OSPF虚链路—Vlink 作用&#xff1a;专门解决OSPF不规则区域所诞生的技术&#xff0c;是一种虚拟的&#xff0c;逻辑的链路。实现非骨干区域和骨干区域在逻辑上直接连接。注意虚链路条件&#xff1a;只能穿越一个区域&#xff0c;通常对虚链路进行认证功能的配置。虚链路认证也…...

RAxML-NG安装与使用-raxml-ng-v1.2.0(bioinfomatics tools-013)

01 背景 1.1 ML树 ML树&#xff0c;或最大似然树&#xff0c;是一种在进化生物学中用来推断物种之间进化关系的方法。最大似然&#xff08;Maximum Likelihood, ML&#xff09;是一种统计框架&#xff0c;用于估计模型参数&#xff0c;使得观察到的数据在该模型参数下的概率最…...

Tomcat内存马

Tomcat内存马 前言 描述Servlet3.0后允许动态注册组件 这一技术的实现有赖于官方对Servlet3.0的升级&#xff0c;Servlet在3.0版本之后能够支持动态注册组件。 而Tomcat直到7.x才支持Servlet3.0&#xff0c;因此通过动态添加恶意组件注入内存马的方式适合Tomcat7.x及以上。…...

pytorch之诗词生成3--utils

先上代码&#xff1a; import numpy as np import settingsdef generate_random_poetry(tokenizer, model, s):"""随机生成一首诗:param tokenizer: 分词器:param model: 用于生成古诗的模型:param s: 用于生成古诗的起始字符串&#xff0c;默认为空串:return: …...

OpenAI的ChatGPT企业版专注于安全性、可扩展性和定制化。

OpenAI的ChatGPT企业版&#xff1a;安全、可扩展性和定制化的重点 OpenAI的ChatGPT在商业世界引起了巨大反响&#xff0c;而最近推出的ChatGPT企业版更是证明了其在企业界的日益重要地位。企业版ChatGPT拥有企业级安全、无限GPT-4访问、更长的上下文窗口以及一系列定制选项等增…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...