【Git学习笔记】Git结构原理及其分支管理模型分析
【Git学习笔记】Git结构原理及其分支管理模型分析
🔥个人主页:大白的编程日记
🔥专栏:Git学习笔记
文章目录
- 【Git学习笔记】Git结构原理及其分支管理模型分析
- 前言
- 一.认识工作区、暂存区、版本库
- 1.1 版本回退
- 1.2 撤销修改
- 1.3 删除文件
- 二. 分支管理
- 2.1 理解分支
- 2.2 创建分支
- 2.3 切换分支
- 2.4 合并分支
- 2.5 删除分支
- 2.6 图文分析
- 后言
前言
哈喽,各位小伙伴大家好!今天开始我们就进入新的篇章——Git学习!。今天我们来讲一下Git初始及其结构原理分析。话不多说,我们进入正题!向大厂冲锋
一.认识工作区、暂存区、版本库
1.1 版本回退
之前我们也提到过,Git 能够管理文件的历史版本,这也是版本控制器重要的能力。如果有一天你发现之前的工作做的出现了很大的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本回退的功能了。
执行 git reset 命令用于回退版本,可以指定退回某一次提交的版本。要解释一下“回退”本质是要将版本库中的内容进行回退,工作区或暂存区是否回退由命令参数决定:
git reset 命令语法格式为:git reset [–soft | --mixed |- -hard] [HEAD]
- –mixed 为默认选项,使用时可以不用带该参数。该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。
- –soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
- –hard 参数将暂存区与工作区都退回到指定版本。切记工作区有未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使用该参数前一定要慎重。
- HEAD 说明:
可直接写成commitid,表示指定退回的版本
- HEAD 表示当前版本
- HEAD^ 上一个版本
- HEAD^^ 上上一个版本
以此类推…
- 可以使用 ~数字表示:
- HEAD~0 表示当前版本
- HEAD~1 上一个版本
- HEAD^2 上上一个版本
以此类推…
为了便于表述,方便测试回退功能,我们先做一些准备工作:更新3个版本的ReadMe,并分别进行3次提交,如下所示:
# 第⼀次修改提交
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
qcj@139 - 159 - 150 - 152:~/ gitcode$ git add ReadMe
qcj@139 - 159 - 150 - 152:~/ gitcode$ git commit - m"add version1"
[master cff9d1e] add version1
1 file changed, 1 insertion(+)
#
第⼆次修改提交
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
qcj@139 - 159 - 150 - 152:~/ gitcode$ git add ReadMe
qcj@139 - 159 - 150 - 152:~/ gitcode$ git commit - m"add version2"
1 file changed, 1 insertion(+)
# 第三次修改提交
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
qcj@139 - 159 - 150 - 152:~/ gitcode$ git add ReadMe
qcj@139 - 159 - 150 - 152:~/ gitcode$ git commit - m"add version3"
[master d95c13f] add version3
1 file changed, 1 insertion(+)
# 查看历史提交记录
qcj@139 - 159 - 150 - 152:~/ gitcode$ git log --pretty = oneline
d95c13ffc878a55a25a3d04e22abfc7d2e3e1383(HEAD->master) add version3
14c12c32464d6ead7159f5c24e786ce450c899dd add version2
cff9d1e019333318156f8c7d356a78c9e49a6e7b add version1
...
现在,如果我们在提交完version3后,发现 version3编写错误,想回退到 version2,重新基于version2开始编写。由于我们在这里希望的是将工作区的内容也回退到 version 2 版本,所以需要用到–hard 参数,示例如下:
qcj@139 - 159 - 150 - 152:~/ gitcode$ git log --pretty = oneline
d95c13ffc878a55a25a3d04e22abfc7d2e3e1383(HEAD->master) add version3
14c12c32464d6ead7159f5c24e786ce450c899dd add version2
cff9d1e019333318156f8c7d356a78c9e49a6e7b add version1
...
qcj@139 - 159 - 150 - 152:~/ gitcode$
git reset --hard
14c12c32464d6ead7159f5c24e786ce450c899dd
HEAD is now at 14c12c3 add version2
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
我们惊奇的发现,此时 ReadMe 文件的内容,已经回退到 version2了!,当前,我们再次用 git log 查看一下提交日志,发现 HEAD 指向了version2,如下所示:
hyb@139-159-150-152:~/gitcode$ git log --pretty=oneline14c12c32464d6ead7159f5c24e786ce450c899dd (HEAD -> master) add version2cff9d1e019333318156f8c7d356a78c9e49a6e7b add version1...
到这里一般回退功能就演示完了,但现在如果我后悔了,想再回到 version3怎么办?我们可以继续使用 git reset 命令,回退到 version 3 版本,但我们必须要拿到 version 3的 commit id 去指定回退的版本。
但我们看到了 git log并不能打印出 version 3的 commit id,运气好的话我们可以从终端上去找找之前的记录,运气不好的话commitid 已经被我们搞丢了=。=
Git 还提供了⼀个git reflog 命令能补救⼀下,该命令用来记录本地的每⼀次命令。
qcj@139 - 159 - 150 - 152:~/ gitcode$
git reflog
14c12c3(HEAD->master) HEAD@{0}: reset: moving to
14c12c32464d6ead7159f5c24e786ce450c899dd
d95c13f HEAD@{1}: commit: add version3
14c12c3(HEAD->master) HEAD@{2}: commit: add version2
cff9d1e HEAD@{3}: commit: add version1
94da695 HEAD@{4}: commit: add modify ReadMe file
23807c5 HEAD@{5}: commit: add 3 files
c614289 HEAD@{6}: commit(initial) : commit my first file
这样,你就可以很方便的找到你的所有操作记录了,但 d95c13f这个是啥东西?这个是 version3 的 commit id 的部分。没错,Git 版本回退的时候,也可以使用部分 commit id 来代表目标版本。示例如下:
# 回退到v3
qcj@139 - 159 - 150 - 152:~/ gitcode$
git reset --hard d95c13f
HEAD is now at d95c13f add version3
# 查看⼯作区
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
# 查看log
qcj@139 - 159 - 150 - 152:~/ gitcode$ git log --pretty = oneline
d95c13ffc878a55a25a3d04e22abfc7d2e3e1383(HEAD->master) add version3
14c12c32464d6ead7159f5c24e786ce450c899dd add version2
cff9d1e019333318156f8c7d356a78c9e49a6e7b add version1
94da6950d27e623c0368b22f1ffc4bff761b5b00 add modify ReadMe file
23807c536969cd886c4fb624b997ca575756eed6 add 3 files
c61428926f3853d4ec6dde904415b0e6c1dabcc6 commit my first file
往往是理想很丰满,现实很骨感。在实际开发中,由于长时间的开发了,导致 commit id 早就找不到了,可突然某一天,我又想回退到version3,那该如何操作呢?貌似现在不可能了。。
值得说的是,Git的版本回退速度非常快,因为 Git 在内部有个指向当前分支(此处是master)的HEAD指针,refs/heads/master 文件里保存当前 master 分支的最新 commit id。当我们在回退版本的时候,Git仅仅是给 refs/heads/master 中存储一个特定的version,可以简单理解成如下示意图:
1.2 撤销修改
如果我们在我们的工作区写了很长时间代码,越写越写不下去,觉得自己写的实在是垃圾,想恢复到上一个版本。
- 情况一:对于工作区的代码,还没有 add
你当然可以直接删掉你目前在工作区新增的代码,像这样
# 向ReadMe中新增⼀⾏代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ git status
On branch master
nothing to commit, working tree clean
qcj@139 - 159 - 150 - 152:~/ gitcode$ vim ReadMe
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
This piece of code is like shit #
新增代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ git status
On branch master
Changes not staged for commit :
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: ReadMe
no changes added to commit(use "git add" and /or "git commit -a")
# 直接删除代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ vim ReadMe
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
qcj@139 - 159 - 150 - 152:~/ gitcode$ git status
On branch master
nothing to commit, working tree clean
辛亏我们工作效率不高,才写了一行代码就发现不行了,要是你写了3天,一直都没有提交,该怎么删掉呢?你自己都忘了自己新增过哪些,有同学说,我可以 git diff xxx 一下,看看差别在删啊,那你肯定又要花3天时间删代码了,并且很大的概率还会改出bug。一周过去了,你怎么向你的老板交代呢?
Git 其实还为我们提供了更好的方式,我们可以使用 git checkout – [file]命令让工作区的文件回到最近一次 add 或 commit 时的状态。要注意 git checkout – [file]命令中的
很重要,切记不要省略,一旦省略,该命令就变为其他意思了,后面我们再说。示例如下:
#
向ReadMe中新增⼀⾏代码
hyb@139-159-150-152:~/gitcode$ vim ReadMe
hyb@139-159-150-152:~/gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
This piece of code is like shit #新增代码
# 恢复到上⼀次add 或commit
hyb@139-159-150-152:~/gitcode$ git checkout -- ReadMe
hyb@139-159-150-152:~/gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
- 情况二:已经 add ,但没有commit
add 后还是保存到了暂存区呢?怎么撤销
# 向ReadMe中新增⼀⾏代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ vim ReadMe
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
This piece of code is like shit #
# add存⼊暂存区新增代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ git add ReadMe
qcj@139 - 159 - 150 - 152:~/ gitcode$ git status
On branch master
Changes to be committed :
(use "git restore --staged <file>..." to unstage)
modified: ReadMe
让我们来回忆一下学过的 git reset 回退命令,该命令如果使用 --mixed 参数,可以将暂存区的内容退回为指定的版本内容,但工作区文件保持不变。那我们就可以回退下暂存区的内容了
#--mixed 是默认参数,使用时可以省略
qcje139 - 159 - 150 - 152:~/ gitcode$ git reset HEAD ReadMe
Unstaged changes after reset :
M ReadMe
用 git status 查看一下,发现现在暂存区是干净的,工作区有修改。
qcj@139 - 159 - 150 - 152:~/ gitcode$ git status
On branch master
Changes not staged for commit :(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directorymodified :
ReadMe
no changes added to commit(use "git add" and /or "git commit -a")
还记得如何丢弃工作区的修改吗?
hybe139-159-150-152:~/gitcode$ git checkout -- ReadMe
hyb@139-159-150-152:~/gitcode$ git status
On branch master
nothing to commit,working tree clean
hybe139-159-150-152:~/gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
恢复了!
- 情况三:已经 add ,并且也commit了
不要担心,我们可以 git reset --hardHEAD^回退到上一个版本!不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。还记得Git是分布式版本控制系统吗?我们后面会讲到远程版本库,一旦你推送到远程版本库,你就真的惨了
# 向ReadMe中新增⼀⾏代码
qcj@139 - 159 - 150 - 152:~/ gitcode$ vim ReadMe
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
This piece of code is like shit #新增代码
# 提交
qcj@139 - 159 - 150 - 152:~/ gitcode$ git add ReadMe
qcj@139 - 159 - 150 - 152:~/ gitcode$ git commit - m"test quash"
[master 5f71ae1] test quash
1 file changed, 1 insertion(+)
# 回退
qcj@139 - 159 - 150 - 152:~/ gitcode$ git reset --hard HEAD ^
HEAD is now at 144a3f8 add file
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
1.3 删除文件
在 Git 中,删除也是一个修改操作,我们实战一下,如果要删除 file5 文件,怎么搞呢?如果你这样做了
qcj@139 - 159 - 150 - 152:~/ gitcode$ ls
file1 file2 file3 file4 file5 ReadMe
qcj@139 - 159 - 150 - 152:~/ gitcode$rm file5
但这样直接删除是没有用的,反而徒增烦恼,git status 命令会立刻告诉你哪些文件被删除了:
qcj@139 - 159 - 150 - 152:~/ gitcode$ git status
On branch master
Changes not staged for commit :(use "git add/rm <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)deleted:
file5
no changes added to commit(use "git add" and /or "git commit -a")
此时,工作区和版本库就不一致了,要删文件,目前除了要删工作区的文件,还要清除版本库的文件。
⼀般走到这里,有两种可能:
- 确实要从版本库中删除该文件
- 不小心删错了
对第二种情况,很明显误删,需要使用 git 来进行恢复,很简单,我们刚学过(删除也是修改)
hyb@139-159-150-152:~/gitcode$ git checkout -- file5hyb@139-159-150-152:~/gitcode$ lsfile1 file2 file3 file4 file5 ReadMe
对于第一种情况,很明显是没有删完,我们只删除了工作区的文件。这时就需要使用 gitrm 将文件从暂存区和工作区中删除,并且commit :
qcj@139 - 159 - 150 - 152:~/ gitcode$
git rm file5
rm 'file5'
qcj@139 - 159 - 150 - 152:~/ gitcode$ git status
On branch master
Changes to be committed :
(use "git restore --staged <file>..." to unstage)
deleted:file5
qcj@139 - 159 - 150 - 152:~/ gitcode$git rmgit commit - m"deleted file5"
[master 5476bde] deleted file5
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 file5
qcj@139 - 159 - 150 - 152:~/ gitcode$ git status
On branch master
nothing to commit, working tree clean
现在,文件就从版本库中被删除了。
二. 分支管理
2.1 理解分支
本章开始介绍 Git 的杀手级功能之一(注意是之一,也就是后面还有之二,之三……):分支。分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习 C++ 的时候,另一个你正在另一个平行宇宙里努力学习 JAVA。
如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了 C++ 又学会了 JAVA!
在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就可以理解为是个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。
再来理解一下HEAD,HEAD 严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD 指向的就是当前分支。
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长,而HEAD只要一直指向master分支即可指向当前分支。
通过查看当前的版本库,我们也能清晰的理出思路:
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat.git / HEAD
ref : refs / heads / master
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat.git / refs / heads / master
5476bdeb12510f7cd72ac4766db7988925ebd302
2.2 创建分支
Git 支持我们查看或创建其他分支,在这里我们来创建第一个自己的分支 dev ,对应的命令为:
qcj@139 - 159 - 150 - 152:~/ gitcode$ git branch
* master
qcj@139 - 159 - 150 - 152:~/ gitcode$ git branch dev
qcj@139 - 159 - 150 - 152:~/ gitcode$ git branch
dev
* master
当我们创建新的分支后,Git 新建了一个指针叫 dev,*表示当前 HEAD 指向的分支是 master分支。另外,可以通过目录结构发现,新的 dev分支:
qcj@139 - 159 - 150 - 152:~/ gitcode$ ls.git / refs / heads /
dev master
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat.git / refs / heads/*
5476bdeb12510f7cd72ac4766db7988925ebd302
5476bdeb12510f7cd72ac4766db7988925ebd302
发现目前 dev和 master指向同一个修改。并且也可以验证下 HEAD 目前是指向 master 的。
hyb@139-159-150-152:~/gitcode$ cat .git/HEADref: refs/heads/master
一张图总结:
2.3 切换分支
那如何切换到 dev分支下进行开发呢?使用 git checkout 命令即可完成切换,示例如下
qcj@139 - 159 - 150 - 152:~/ gitcode$ git checkout dev
Switched to branch 'dev'
qcj139 - 159 - 150 - 152 : ~/ gitcode$ git branch
* dev
master
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat.git / HEAD
ref : refs / heads / dev
我们发现 HEAD 已经指向了 dev,就表示我们已经成功的切换到了 dev 上!
接下来,在 dev 分支下修改 ReadMe文件,新增一行内容,并进行一次提交操作:
qcj@139 - 159 - 150 - 152:~/ gitcode$ vim ReadMe
qcj@139 - 159 - 150 - 152 : ~/ gitcode$ cat ReadMe
hello bit
hello git
hello world
hello versionl
hello version2
hello version3
write aaa for new branch
qcje139 - 159 - 150 - 152:~/ gitcode$ git add .
qcj@139 - 159 - 150 - 152:~/ gitcode$ git commit - m"modify ReadMe"
[dev 3740dce] modify ReadMe
1 file changed, l insertion(+)
现在,dev分支的工作完成,我们就可以切换回 master分支:
qcj@139 - 159 - 150 - 152:~/ gitcode$ git checkout master
Switched to branch 'master
qcj@139 - 159 - 150 - 152:~/ gitcodes cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
切换回 master 分支后,发现ReadMe文件中新增的内容不见了!!!赶紧再切回 dev看看
qcj@139 - 159 - 150 - 152:~/ gitcode$ git checkout dev
Switched to branch 'dev'
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat ReadMe
hello bit
hello git
hello world
hello version1
hello version2
hello version3
write aaa for new branc
在 dev分支上,内容还在。为什么会出现这个现象呢?我们来看看 dev分支和 master分支指向,发现两者指向的提交是不一样的:
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat.git / refs / heads / dev
bdaf528ffbb8e05aee34d37685408f0e315e31a4
qcj@139 - 159 - 150 - 152 : ~/ gitcode$ cat.git / refs / heads / master
5476bdeb12510f7cd72ac4766db7988925ebd302
看到这里就能明白了,因为我们是在dev分支上提交的,而master分支此刻的提交点并没有变,此时的状态如图如下所示。
当切换到 master分支之时,HEAD 就指向了 master,当然看不到提交了!
2.4 合并分支
为了在 master 主分支上能看到新的提交,就需要将 dev 分支合并到 master 分支,示例如下:
qcj139 - 159 - 150 - 152:~/ gitcode$ git branch
* dev
master
qcje139 - 159 - 150 - 152 : ~/ gitcode$ git checkout master
# 切换到 master 上进行合并
Switched to branch 'master'
qcje139 - 159 - 150 - 152:~/ gitcodes git merge dev #合并 dev 分支
Updating 16623e1..3740dce
Fast - forward
ReadMe1 +
l file changed, 1 insertion(+)
qcj@139 - 159 - 150 - 152:~/ gitcode$ cat ReadMe
hello bit
hello git
hello world
hello versionl
hello version2
hello version3
write aaa for new branch
git merge 命令用于合并指定分支到当前分支。合并后,master就能看到dev分支提交的内容了。此时的状态如图如下所示。
Fast-forward 代表“快进模式”也就是直接把master指向dev的当前提交,所以合并速度非常快。当然,也不是每次合并都能 Fast-forward,我们后面会讲其他方式的合并。
2.5 删除分支
合并完成后,dev分支对于我们来说就没用了,那么dev分支就可以被删除掉,注意如果当前正处于某分支下,就不能删除当前分支,如:
qcj@139 - 159 - 150 - 152:~/ gitcode$ git branch
* dev
master
qcj@139 - 159 - 150 - 152:~/ gitcode$
git branch - d dev
error : Cannot delete branch 'dev' checked out at '/home/qcj/gitcode'
而可以在其他分支下删除当前分支,如:
qcje139 - 159 - 150 - 152:~/ gitcode$ git checkout master
Switched to branch 'master
qcje139 - 159 - 150 - 152 : ~/ gitcode$ git branch - d dev
Deleted branch dev(was bdaf528).
qcje139 - 159 - 150 - 152 : ~/ gitcode$ git branch
* master
此时的状态如图如下所示。
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
2.6 图文分析
上面的过程的 下面这一张图搞定!
后言
这就是Git结构原理及其分支管理模型分析。大家自己好好消化!今天就分享到这!感谢各位的耐心垂阅!咱们下期见!拜拜~
相关文章:
【Git学习笔记】Git结构原理及其分支管理模型分析
【Git学习笔记】Git结构原理及其分支管理模型分析 🔥个人主页:大白的编程日记 🔥专栏:Git学习笔记 文章目录 【Git学习笔记】Git结构原理及其分支管理模型分析前言一.认识工作区、暂存区、版本库1.1 版本回退1.2 撤销修改1.3 删…...
找工作、创业的思考和出路
最近有几位朋友在找工作,以及探索职场出路,与他们聊了一些关于找工作和职业发展的话题。而这些话题对大多数职场人来说,都是必须考虑和面对的问题。今天就基于这两个话题展开聊聊。 首先,初入职场时,工作是相对容易找…...
2024山东大学计算机复试上机真题
2024山东大学计算机复试上机真题 2024山东大学计算机复试机试真题 历年山东大学计算机复试上机真题 历年山东大学计算机复试机试真题 在线评测:传动门:pgcode.cn 最长递减子序列 题目描述 输入数字 n,和 n 个整数,输出该数字…...
FLASK和GPU依赖安装
1. 安装所有依赖包 在终端运行以下命令(如果使用 GPU,请确保已安装 CUDA 驱动): # 安装 Flask 和其他依赖 pip install flask sentence-transformers torch# 如果是 GPU 环境,推荐安装 CUDA 版本的 PyTorchÿ…...
【图论】并查集的学习和使用
目录 并查集是什么? 举个例子 组成 父亲数组: find函数: union函数: 代码实现: fa[] 初始化code: find code: 递归实现: 非递归实现: union code : 画图模拟: 路径压缩:…...
3.9/Q2,Charls最新文章解读!
文章题目:Association between remnant cholesterol and depression in middle-aged and older Chinese adults: a population-based cohort study DOI:10.3389/fendo.2025.1456370 中文标题:中国中老年人残留胆固醇与抑郁症的关系࿱…...
用Python和Pygame实现打砖块游戏
标题:用Python和Pygame实现打砖块游戏 摘要: 本文将介绍如何使用Python和Pygame库实现一个经典的打砖块游戏。通过这个项目,你将学习到Pygame的基本用法、游戏循环、碰撞检测等知识。 1. 打砖块游戏简介(完整代码在末尾) 打砖块是一款经典的…...
自动化测试-网页聊天室
项目介绍: 针对基于WebSocket协议的网页端即时通讯系统,主导设计并实施全流程自动化测试方案。通过构建模块化测试框架,完成对核心业务场景(用户登录鉴权、消息同步、实时聊天等)的自动化验证,最终达成测试…...
Linux第三次练习
1、创建根目录结构中的所有的普通文件 首先在根目录下面新创建一个test目录,然后将查找到的普通文件新建到test目录下 2、列出所有账号的账号名 3、将/etc/passwd中内容按照冒号隔开的第三个字符从大到小排序后输出所有内容 4、列出/etc/passwd中的第20行-25行内容…...
Redis学习
最开始使用的是MySQL,其使用的是磁盘IO方式较慢,无法满足一分钟成千上万次的访问,而使用内存IO的Redis就可以较好的满足。 Redis是NOSQL(Not Only SQL)中的键值存储数据库,性能好较灵活,是在内存中进行存储。 可以通…...
【CSS3】化神篇
目录 平面转换平移旋转改变旋转原点多重转换缩放倾斜 渐变线性渐变径向渐变 空间转换平移视距旋转立体呈现缩放 动画使现步骤animation 复合属性animation 属性拆分逐帧动画多组动画 平面转换 作用:为元素添加动态效果,一般与过渡配合使用 概念&#x…...
【C/C++算法】从浅到深学习--- 前缀和算法(图文兼备 + 源码详解)
绪论:冲击蓝桥杯一起加油!! 每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章将使用八道题由浅到深的带你了解并基本掌握前缀和思想,以及前缀和的基…...
VIC模型率定验证
在气候变化问题日益严重的今天,水文模型在防洪规划,未来预测等方面发挥着不可替代的重要作用。目前,无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然,这些软件有各自的优点;但是&am…...
二叉树的性质和实现
二叉树开端 我们要理解二叉树我们可以先看看什么是树,如图 这个树虽然没有什么叶子,不是很好看,但是用在这里刚刚好,我们从局部来看它,随便挑一根树枝, 大概是这样,由一根粗的的主干和一些细的…...
【Azure 架构师学习笔记】- Azure Databricks (21) --费用相关
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (20) --Delta Live Table 建议 前言 Databricks是很强大的工具和集成平台,但是随着越来越多地使用它,就没办法必须去面…...
StarRocks + Paimon 在阿里集团 Lakehouse 的探索与实践
作者: 范振: 阿里云计算平台开源 OLAP 负责人,StarRocks 社区 Champion 翁才智: 阿里云技术专家,Apache Paimon PMC Member 导读:阿里集团在推进湖仓一体化建设过程中,依托 StarRocks 强大的 OLAP 查询能力与 Paimon…...
OTP单片机调试工具之—单线数据编码
OTP单片机调试工具在实现过程中离不开单线数据的传输,那么使用哪一种方式的数据编码会比较好呢? 我所了解的主要有以下三种: 1.UART(串口),这种方式在单片机和pc之间进行传输都非常常见,效率比较…...
你的完美主义:从缺陷到超能力
所属专栏:《逻辑辨证系列》 前情回顾: 《完美还是完成》(一):完成还是完美—完成大于完美 时间、机会、情绪成本 先完成 … 本期: 《完美还是完成》(二):你的完美主…...
zsh: command not found: adb 报错问题解决
哈喽小伙伴们大家好,我是小李,今天,我满怀信心想要在本地跑一下pda,然而, what? 居然报错了!!别逗我啊! 好吧,究其原因:没有配置好sdk 那就配呗。 首先,…...
应急响应靶机练习-Linux2
1.背景 前景需要:看监控的时候发现webshell告警,领导让你上机检查你可以救救安服仔吗!! 挑战内容: (1)提交攻击者IP (2)提交攻击者修改的管理员密码(明文) (…...
进程间通信--匿名管道
进程间通信介绍 进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件&…...
ctfshow-xxs-316-333-wp
316.反射型 XSS(-326都是反射型) js恶意代码是存在于某个参数中,通过url后缀进行get传入,当其他用户点进这个被精心构造的url链接时,恶意代码就会被解析,从而盗取用户信息。 来看题,先简单测试…...
顺序表和链表的对比(一)
前言 今天给小伙伴们分享的是在数据结构中顺序表和链表的对比。它们在计算机科学和软件开发中具有广泛的应用,是理解更复杂数据结构(如栈、队列、树、图等)的基础。这次将会给大家从定义初始化,以及功能增删查改上进行详细对比&a…...
蓝思科技冲刺港股上市,双重上市的意欲何为?
首先,蓝思科技冲刺港股上市,这一举措是其国际化战略进入实质性阶段的重要标志。通过港股上市,蓝思科技有望进一步拓宽融资渠道,这不仅能够为公司带来更加多元化的资金来源,还能够降低对单一市场的依赖风险,…...
【C++项目实战】校园公告搜索引擎:完整实现与优化指南
🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 📚一、项目概述 📖1.项目背景 📖2.主要功能 📖3.界面展…...
C语言每日一练——day_8
引言 针对初学者,每日练习几个题,快速上手C语言。第八天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…...
单片机农业大棚浇花系统
标题:单片机农业大棚浇花系统 内容:1.摘要 本文针对传统农业大棚浇花方式效率低、精准度差的问题,提出了一种基于单片机的农业大棚浇花系统。该系统以单片机为核心控制器,通过土壤湿度传感器实时采集土壤湿度数据,并将数据传输至单片机进行处…...
Kubernetes 单节点集群搭建
Kubernetes 单节点集群搭建教程 本人尝试基于Ubuntu搭建一个单节点K8S集群,其中遇到各种问题,最大的问题就是网络,各种镜像源下载不下来,特此记录!注意:文中使用了几个镜像,将看来可能失效导致安…...
windows安装两个或多个JDK,并实现自由切换
我用两个JDK来做演示,分别是JDK8和JDK17(本人已安装JDK8,所以这里只演示JDK17的安装)。 1、下载JDK17安装 Java Downloads | Oracle 2、安装JDK17,这里忽略。直接双击软件,点击下一步就可以。 3、配置环境变量 在系统变量中新建一个CLASSP…...
如何打包数据库mysql数据,并上传到虚拟机上进行部署?
1.连接数据库,使得我们能看到数据库信息,才能进行打包上传 2. 3. 导出结果如下,是xml文件 4.可以查询每个xml文件的属性,确保有大小,这样才是真实导出 5跟着黑马,新建文件夹,并且把对应的东西放…...
fastapi +angular迷宫求解可跨域
说明:我计划使用fastapi angular,实现迷宫路径生成与求解 后端功能包括: 1.FastAPI搭建RESTful接口。写两个接口, 1.1生成迷宫, 1.2求解路径 前端功能包括 1.根据给定的长宽值,生成迷宫 2.点击按钮&…...
CobaltStrike详细使用及Linux上线
1、工具准备 cs工具 将teamserver.zip放进服务端给必要文件增加可执行文件( 执行时会有提示 )服务端启动服务监听 sudo ./teamserver <IP地址> <密码> [c2配置文件]客户端直接连接即可端口默认:50050主机:服务端ip地址2、基础配置 启动监听…...
WSL2 Ubuntu安装GCC不同版本
WSL2 Ubuntu安装GCC不同版本 介绍安装gcc 7.1方法 1:通过源码编译安装 GCC 7.1步骤 1:安装编译依赖步骤 2:下载 GCC 7.1 源码步骤 3:配置和编译步骤 4:配置环境变量步骤 5:验证安装 方法 2:通过…...
WPF CommunityToolkit.MVVM库的简单使用
CommunityToolkit.MVVM 是 .NET 社区工具包中的一部分,它为实现 MVVM(Model-View-ViewModel)模式提供了一系列实用的特性和工具,能帮助开发者更高效地构建 WPF、UWP、MAUI 等应用程序。以下是关于它的详细使用介绍: 1…...
4个 Vue 路由实现的过程
大家好,我是大澈!一个喜欢结交朋友、喜欢编程技术和科技前沿的老程序员👨🏻💻,关注我,科技未来或许我能帮到你! Vue 路由相信朋友们用的都很熟了,但是你知道 Vue 路由…...
Compose 实践与探索十 —— 其他预先处理的 Modifier
1、PointerInputModifier PointerInputModifier 用于定制触摸(包括手指、鼠标、悬浮)反馈算法,实现手势识别。 1.1 基本用法 最简单的使用方式就是通过 Modifier.clickable() 响应点击事件: Box(Modifier.size(40.dp).backgro…...
基于Python的天气预报数据可视化分析系统-Flask+html
开发语言:Python框架:flaskPython版本:python3.8数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统登录 可视化界面 天气地图 天气分析 历史天气 用户管理 摘要 本文介绍了基于大数据…...
“消失的中断“
“消失的中断” 1. 前言 在嵌入式开发过程中,中断必不可少。道友们想必也经常因为中断问题头疼不已,今天来说说一个很常见的问题,“消失的中断”。最近项目在使用第三方MCAL的时候,就遇到了I2C中断丢失的问题,排查起…...
对C++面向对象的理解
C的面向对象编程(OOP)是其核心特性之一,通过类(Class)和对象(Object)实现数据和行为的封装,支持继承、多态和抽象等核心概念。以下是关键点解析: 1. 类(Class…...
代码随想录-训练营-day52
97. 小明逛公园 (kamacoder.com) #include<iostream> #include<vector> using namespace std; int main(){int n,m,u,v,w;cin>>n>>m;vector<vector<vector<int>>> grid(n1,vector<vector<int>>(n1,vector<int>(n1…...
Java File 类详解
1. 概述 File 类是 Java 提供的用于文件和目录路径名的抽象表示。它能够用于创建、删除、查询文件和目录的信息,但不用于读写文件内容。如果需要对文件进行读写,可以结合 FileReader、FileWriter、BufferedReader 等类来完成。 2. File 类的构造方法 …...
JS实现省份地级市的选择
JS实现省份地级市的选择 效果展示: 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><ti…...
【鸿蒙开发】Hi3861学习笔记-Visual Studio Code安装(New)
00. 目录 文章目录 00. 目录01. Visual Studio Code概述02. Visual Studio Code下载03. Visual Studio Code安装04. Visual Studio Code插件05. 附录 01. Visual Studio Code概述 vscode是一种简化且高效的代码编辑器,同时支持诸如调试,任务执行和版本管…...
记录致远OA服务器硬盘升级过程
前言 日常使用中OA系统突然卡死,刷新访问进不去系统,ping服务器地址正常,立马登录服务器检查,一看磁盘爆了。 我大脑直接萎缩了,谁家OA系统配400G的空间啊,过我手的服务器没有50也是30台,还是…...
计算机网络-网络规划与设计
基本流程 需求分析—》通信规范分析—》逻辑网络设计—》物理网络设计—》实施阶段 需求分析: 确定需求,包括:业务需求、用户需求、应用需求、计算机平台需求、网络通信需求等。 产物:需求规范 通信规范分析: 现有…...
C#opencv 遍历图像中所有点 不在圆范围内的点变为黑色,在圆范围内的保持原色
C#opencv 遍历图像中所有点 不在圆范围内的点变为黑色,在圆范围内的保持原色 安装 Install-Package OpenCvSharp4 Install-Package OpenCvSharp4.Windows 普通实现 using System; using System.Collections.Generic; using System.Linq; using OpenCvSharp; // 添加OpenCV引用…...
精通游戏测试笔记(持续更新)
第一章、游戏测试的两条规则 不要恐慌 不要将这次发布当作最后一次发布 不要相信任何人 把每次发布当作最后一次发布 第二章:成为一名游戏测试工程师...
Linux内核,mmap_pgoff在mmap.c的实现
1. mmap_pgoff的系统调用实现如下 SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,unsigned long, prot, unsigned long, flags,unsigned long, fd, unsigned long, pgoff) {return ksys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); }2. ksys_mma…...
深度揭秘:蓝耘 Maas 平台如何重塑深度学习格局
目录 前言 深度学习:技术基石与发展脉络 蓝耘 Maas 平台:深度学习的强大助推器 1. 高性能算力支撑 2. 丰富的模型支持 3. 便捷的开发体验 4. 完善的安全保障 代码示例:蓝耘 Maas 平台上的深度学习实践 1. 注册与登录 2. 代码实现 …...
深入解析操作系统进程控制:从地址空间到实战应用
引言 想象这样一个场景: 你的游戏本同时运行着《赛博朋克2077》、Chrome浏览器和Discord语音 突然游戏崩溃,但其他应用依然正常运行 此时你打开任务管理器,发现游戏进程已经消失,但内存占用却未完全释放 这背后涉及的关键机制…...