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

Git和GitHub基础教学

文章目录

  • 1. 前言
  • 2. 历史
  • 3. 下载安装Git
    • 3.1 下载Git
    • 3.2 安装Git
    • 3.3 验证安装是否成功
  • 4. 配置Git
  • 5. Git基础使用
    • 5.1 通过Git Bash使用
      • 5.1.1 创建一个新的仓库。
        • 5.1.1.1 克隆别人的仓库
        • 5.1.1.2 自己创建一个本地仓库
      • 5.1.2 管理存档
    • 5.2 通过Visual Studio Code使用
  • 6. Git完成远程提交
    • 6.1 Git Bash版本
    • 6.2 Visual Studio Code版本

1. 前言

当你写代码的时候一定遇到过自己需要对代码进行很多改动,结果改动完发现有很多报错,于是我们想回到之前的某个状态的代码的情况。如果是本地的一些项目我会对代码进行一个“存档”的操作(很多游戏会提供存档的选项从而保存玩家的进度,玩家可以“读档”从而恢复到该存档所保存的进度),我会将我的代码ctrl+a然后ctrl+c,打开我的记事本ctrl+v,完成了一遍存档,如果我需要保存新的我只需要再打开一个新的。如果我想要读取某个存档,我只需要将记事本的代码放到我的ide中。
这就是一个简单的代码存档管理,我们可以将我们的代码的一些“关键点”进行保存,然后当我们的代码出现一些问题的时候,我们可以读取这些“关键点”,返回到之前的进度重新进行改动。
但是这是我们一个人写我们自己的代码,万一是一群人在一起进行一个合作,我们该怎么做呢?我们使用u盘互相传一下我们的代码吗?这个方案当然是可以的,但很明显有问题,效率比较低,你的团队人越多,进行u盘同步进度的效率就会很慢。那我们就将各自的存档都上传到一个大家共享的网盘上吧。很快就会出现第一个问题:你们写的是一个python代码,这些网盘里的存档都叫import numpy…你自己只能在本地找到自己的代码,上面的很多存档你看着会一头雾水。还会有其他问题:这么多存档,到底哪个是正式的最后的代码?这里有的模块可能代码没有添加,或者有些需要添加进去的但是和其他代码有些冲突,一个代码和另一个代码到底有什么区别,这些都是可能出现的问题。
对于第一个问题,问题主要是没有统一的规则,万一代码出现问题我们可能都不知道这个代码是谁写的,谁上传的。所以最好这里存档能有时间和上传者的记录,甚至为了解决后面说的代码之间的改动,这个上传者最好自己稍微阐述一下我做了什么。
第二个问题,这里有很多代码,一般来说每个人会做一个模块,然后我们最后讲这些模块放到一起形成最后的代码,因此最后应该有一个人将这些模块的代码进行一个检查。检查没有问题就放进最后的代码之中,如果放进去后有问题也没有关系,因为之前的代码有存档。所有的代码都加进来之后,那我们的最后这个版本就确定了。
第三个问题,如果合作之中的代码之间有一些冲突,最好这些冲突能被标记出来。就像游戏里两个存档可能有不同的道具,有一种同步方案那便是两边的东西都保存,也可能是最后是保存某一种存档。
那这些功能都是可以被Git实现的,这篇文章就将以游戏存档的例子给大家介绍Git的使用。

2. 历史

Git的历史要从Linux之父Linus Torvalds说起。
Linus Torvalds作为Linux之父,当然生完孩子Linux后就不能放任不管了,所以在 2002 年之前,Linux内核的维护工作主要依靠Linus Torvald等人手工检查全球各地热心开发者们提交的补丁,审核通过后就会将其手动加到Linux代码之中,这种方式效率低下且容易出错。因此Linus Torvalds等人需要找到一个解决方案。
下图是Linux之父Linus Torvalds。
Linux之父
这个解决方案便是版本控制系统软件,也就是前文中我们说的那种解决方案。当时Linus Torvalds选择了BitKeeper来解决问题,但是这款软件是一个商业收费软件,2005年后该公司BitMover决定收回Linux内核社区的免费使用权。
数次磋商无果后,Linus Torvalds作为暴躁老哥就表示,不能办就别办了。二话不说撸起袖子就干,花了10天时间,开发了一个开源免费的版本控制系统软件——Git,意思为“不愉快的人”,直接取代了BitKeeper,成为了当今世界上最为流行的版本控制工具。
在这里插入图片描述

3. 下载安装Git

3.1 下载Git

首先打开Git官网:Git官网
点击这里的Download for Windows,这里的教学以默认的命令行界面git为例,下面的GUI版本提供了一个图形用户界面,使得用户可以通过点击和选择来管理Git仓库,而不需要手动输入命令行指令,该教程不会聚焦于GUI版本。
在这里插入图片描述
点击后,会有多个版本进行安装,上面的Standalone Installer是独立安装程序,通过运行安装程序来安装Git,它会在系统中创建相应的程序和环境变量,因此适合我们现在的需求。
而下面的Portable是便携版,一般是如果我们需要放在一些移动介质所需要的版本,它的安装过程不会将Git添加到系统目录中,而是将所有文件都放在安装目录中。便携版可以在没有安装过程的情况下直接运行,因此适合携带在便携式存储设备(如USB闪存驱动器)中使用,方便在不同计算机之间使用Git。
所以这里我们点击64-bit Git for Windows Setup就好了。
在这里插入图片描述
但是这里的下载速度会比较慢,可以科学上网解决。

3.2 安装Git

下载完后,我们点开对应的安装包,点击Next。
在这里插入图片描述
然后是选择安装目录,这里需要注意安装目录里不能有中文。
然后点击Next进入下一步。
在这里插入图片描述
这一步可以不修改上面的选项,直接点击Next下一步。
1.Additional icons(附加图标):是否在桌面上创建 Git 的快捷方式图标。
2.Windows Explorer integration(Windows 资源管理器集成):
Open Git Bash here(在此处打开 Git Bash): 是否在右键菜单中添加“在此处打开 Git Bash”选项。
Open Git GUI here(在此处打开 Git GUI): 是否在右键菜单中添加“在此处打开 Git GUI”选项。
3.Git LFS (Large File Support)(Git 大文件支持):
是否安装 Git LFS 插件,用于支持大文件的版本控制。
4.Associate .git configuration files with the default text editor(将 .git 配置文件与默认文本编辑器关联)**:
是否将 .git 配置文件与系统的默认文本编辑器关联。
5.Associate .sh files to be run with Bash(将 .sh 文件与 Bash 关联):
是否将 .sh 脚本文件与 Git Bash 关联,以便可以直接运行。
6.Check daily for Git for Windows updates(每天检查 Git for Windows 更新):
是否每天检查 Git for Windows 的更新。
7.(NEW!) Add a Git Bash Profile to Windows Terminal(将 Git Bash 配置文件添加到 Windows 终端):
是否在 Windows 终端中添加 Git Bash 配置文件。
在这里插入图片描述
这一步是创建开始菜单文件夹,也是直接点击Next就好。
在这里插入图片描述
这一步是选择Git的默认编辑器,这里建议修改成Visual Studio Code,后文也将会以Visual Studio Code为例,选择自己常用的ide即可,然后点击Next。
在这里插入图片描述
这一步是设置新仓库中初始分支的名称,上面是Git默认的master分支,下面可以是你自己选择的分支名,一般是main,这里现在推荐你直接选择下面的这一个就好,后面环节会对这里再进行详细解释。
在这里插入图片描述
后面的设置几乎不变,一直点击Next就好。
这一步是对PATH环境的调整。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里点击Install即可。
在这里插入图片描述
点击完后等待其安装完毕。
这里点击Finish后因为这里默认勾选了发行文档,所以我们可以取消勾选后,点击Finish。上面的一个选项是启动Git Bash,这是Git的命令行工具,我们暂时不需要从这个地方打开。
在这里插入图片描述

3.3 验证安装是否成功

验证的方式有两种,一种是我们直接打开我们的Visual Studio Code,点击左边第三个后,如果出现的是不是让你安装Git便是成功,比如我这里已经打开了项目,所以这里提示我让我Initialize Repository(初始化仓库)。
在这里插入图片描述
当然如果你的Visual Studio Code是启动的过程中安装的Git,你可能需要关闭Visual Studio Code再打开一遍才可能会识别到安装的Git。

第二种方法是我们在桌面上右击,然后如果点击后没出现以下的界面,则还需要点击显示更多选项,然后就应该会出现下面的界面,然后这里便有Open Git GUI here和Open Git Bash here这两个选项,就说明我们的安装成功了。
在这里插入图片描述

4. 配置Git

配置Git的方法有很多,这里主要是为了后续上传我们前面说的代码存档,需要进行一个小小的设置。官方教程中也推荐你进行这一步的设置,也就是设置Git用户名和电子邮件地址。
Git官方文档/书籍
这里的电子邮箱地址建议先去GitHub官网上注册一个账号,然后这里的电子邮箱就是GitHub上注册账号的邮箱,这样的话会方便我们前面说的团队合作场景中,大家互相方便沟通。
GitHub官网
注:GitHub也需要科学上网才能流程使用。
我们在桌面上右击后,点击显示更多选项,再点击Open Git Bash here,就会出现Git的命令行工具。
如下图所示。
在这里插入图片描述
我们需要输入的命令格式如下。

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

其中的John Doe可以改为自己的用户名,邮箱也可以改为自己的邮箱。
在这里插入图片描述
提示:在这里想粘贴需要右击后点击Paste,或者我们右击后看到这里的Paste快捷键,并不是传统的ctrl+v
至此我们就完成了Git的配置。

5. Git基础使用

Git使用的方式主要是两种,一种是通过Git Bash输入命令进行使用,一种是我们使用Visual Studio Code自动使用Git。

5.1 通过Git Bash使用

5.1.1 创建一个新的仓库。

第一步我们需要创建一个新的仓库(Repository),为什么需要一个仓库呢?我们玩游戏的时候开始新的游戏就会创建一个新的存档,就像我们玩游戏新游戏也是会让你选择一个存档位置一样,我们的一个项目开始也就会有一个存放存档的仓库,一个游戏我们可以有多个存档,可能是多个人游玩导致的,因此这些存档有不同的存档位置,因此就是不同的仓库。
一般来说一个项目是最大的,其下面可能会有多个仓库,每个仓库之中会有多个存档。

5.1.1.1 克隆别人的仓库

当然我们有的时候可以下载网上的存档直接进行游戏,我们也可以直接拿别人的仓库过来直接开始项目,这种操作叫做克隆(clone)。
我们在本地选择好要存储的地方,然后右击后选择显示更多选项,然后点击Open Git Bash here。
在这里插入图片描述
然后我们去GitHub上选择一个项目点击Code,然后选择下面的复制地址。
在这里插入图片描述
在Git Bash里输入命令。

git clone (加上刚刚的地址)

这里复制和前面说的一样建议直接右击Paste,因为默认快捷键不是ctrl+v。
再按下回车后,Git就会把对应的仓库直接全部下载下来。
在这里插入图片描述
在这里插入图片描述

5.1.1.2 自己创建一个本地仓库

我们还是要打开对应的我们想创建仓库的文件夹,然后右击后选择显示更多选项,然后点击Open Git Bash here。
在这里插入图片描述
然后输入命令。

git init

再按下回车。
在这里插入图片描述
我们的文件夹里便会有一个.git文件夹,这个便是我们的代码仓库了,这里面的东西千万不要动。
在这里插入图片描述
如果你无法看见这个文件夹,可能是你没有开启显示隐藏文件夹,点击上面的查看,然后点击显示,勾上隐藏的项目即可。
在这里插入图片描述

5.1.2 管理存档

我们现在有了存档之后,我们开始书写我们的代码,我今天写了个1.txt进去,现在我想保存以下我目前的进度。
在这里插入图片描述
这里虽然1.txt在这个文件夹,但其实还没有放进仓库之中,因此我们现在需要在Git中提交我们这个存档到仓库之中。
在这里插入图片描述
我们打开这里的Git Bash,输入以下命令。

git add 1.txt

在这里插入图片描述
但这一步只是暂时将这个文件放到暂存区,可以理解成存档放进仓库需要先拿一个盒子将存档装起来,再放到仓库里。
当然如果这里有很多个文件的话,你也可以输入以下命令,会将所有文件放入暂存区。

git add .

注意这里.和add之间有空格。
在这里插入图片描述
我们现在存档已经打包好,我们需要将这个存档上交到仓库去了,执行下面命令。

git commit -m "(备注内容)"

在这里插入图片描述
这样代码就被我们成功添加到了仓库之中。
我们现在就会有保存好的存档在仓库之中,我们可以输入以下代码去检查这些存档。

git log

在这里插入图片描述

这里就能发现上面不仅有提交的记录,记录上还会有时间提交人等信息,帮助我们溯源,如果这份代码有问题,我们就可以找到对应负责的人。

我们还可以输入以下命令,检查每次提交修改了哪些文件。

git log --stat

在这里插入图片描述
我们发现每次存档还会有一个存档ID,也就是黄色字的那一行,我们可以使用这个ID去查看每次存档提交与之前的存档有哪些地方不同。
输入以下命令。

git diff (commit ID)

这里可能的结果比较抽象,但是如果我们使用下一种方法使用Git就可以清楚的看到代码前后的差异。

那么如何读取之前的存档,让我们的代码回到之前的保存节点呢?我们可以输入以下的两行命令中的任意一个。

git reset --hard [commit ID]
git checkout [commit ID]

这两行代码的区别在于是否会影响暂存区或当前分支的HEAD,上面会将工作目录和暂存区(staged area)也更新到该提交的状态,而下面的不会影响。

我们前面提到了很多分支一词,我们在前面创建完仓库后,我们现在每一行命令都会有一个括号(main),其实表示的就是我们现在的所有操作都在main这一个分支下,分支是什么呢?
我们前面说过,我们可能有多个人开发的代码,这些代码之间互相可能会有冲突或者问题,所以这些当然不能是直接放到原来的代码之中的,我们之前安装的时候选择了默认的分支名,因为修改成了main所以现在创建完仓库后,Git会帮我们创建这个默认分支main,当我们如果发现某一分支没有问题的时候,我们可以再将这个分支合并到main中,我们以后会详细演示这个过程。
相关的命令如下。

git branch new-feature
git checkout branch-name
git checkout -b new-branch
git merge branch-name
git branch -d branch-name
git branch

1.创建分支:
你可以从当前分支(通常是 main 或 master)创建一个新的分支。例如,使用 git branch new-feature 命令创建一个名为 new-feature 的新分支。
2.切换分支:
使用 git checkout branch-name 命令可以切换到指定的分支。如果分支不存在,这个命令会失败。
3.创建并切换分支:
git checkout -b new-branch 命令会创建一个新的分支,并立即切换到这个新分支。
4.合并分支:
当你在分支上完成开发后,可以使用 git merge branch-name 命令将该分支的更改合并到当前分支。
5.删除分支:
使用 git branch -d branch-name 命令可以删除一个已经合并到其他分支的分支。如果分支还没有合并,可以使用 -D 选项强制删除:git branch -D branch-name。
6.分支管理:
git branch 命令可以列出所有的分支,其中当前分支会用星号 * 标记。

5.2 通过Visual Studio Code使用

我们在IDE中完成对应的代码操作后,我们点击左边的第三个Source controls,点击后由于我们这里没有创建对应的仓库,所以这里的第一步当然是创建仓库。
在这里插入图片描述
我们直接点击Initialize Repository创建仓库,点击后界面就会变成这样。
在这里插入图片描述

和前面一样我们现在需要将代码进行一个存档的保存并提交。与前面不同的是这里它直接出现的是Commit也就是提交到仓库之中,没有前一步添加到暂存区的操作。然后这里的commit上面我们也可以输入对应的备注信息在文本框中。
注意我们提交之前之前记得要保存一下文件,可以使用ctrl+s快速保存,在Visual Studio Code中,如果你的文件没有保存,其右边会出现一个小圆点,比如前两张图的1.txt右边有个小圆点,而下面的图没有,代表这个文件已经被我保存了。
那这个旁边的U是什么意思呢?这表示该文件是unstaged的,即它已经被修改但还没有被添加到暂存区。但没有关系我们这里直接点击commit。

在这里插入图片描述
这里也会出现一个弹窗提示我们没有将存档先添加到暂存区中。
在这里插入图片描述
我们这里直接点击Always就好,这样它就会默认直接将东西帮我们放进暂存区然后再提交了。
在这里插入图片描述
然后我们的左下的这个Graph就会显示我们有多少次提交,以及这些提交之间的关系。

比如我们现在再次修改这个代码,我们右边的这个图标又会出现一个1的下标,提示我们有一个未提交到仓库的文件。
在这里插入图片描述
我们这边再次提交后,Graph下面就会出现新的提交记录。

在这里插入图片描述
然后这个记录和原来的记录有一个线连起来,表示它是从原来的那个存档上演变过来的,我们点击后,右边会出现一个类似编辑器的界面,但是这里不能修改(只读),这里显示的绿色部分就是我们新添加的内容,也就是这两个存档之间的不同的地方,就这样被清晰的展示出来了。
在这里插入图片描述
这个地方展示了一个新的存档,这个存档对原来的存档进行了删除,红色部分展示了删除了哪些内容,然后绿色部分是其新添加的内容,也就是前面Git Bash里的diff命令的结果的一个可视化展现。
当我们点击左下角main的时候就可以对分支进行编辑了。
在这里插入图片描述
点击后上面的搜索框会出现对应的选项,然后我们点击Create new branch。
在这里插入图片描述
比如这里我创建了一个新的Test分支,然后我进行了代码修改,现在打算将这两个分支进行合并。
我们按住Ctrl+Shift+P打开命令面板,再输入Git: Merge Branch命令,然后选择要合并的分支如下。
在这里插入图片描述
点击后,分支就完成了合并。左下的Graph上面的图标显示出main和Test分支完成了合并。
在这里插入图片描述

6. Git完成远程提交

6.1 Git Bash版本

我们先打开GitHub官网,然后点击自己的头像然后点击Settings。
在这里插入图片描述
然后点击左边的SSH and GPG keys,这里我已经添加过一个。
在这里插入图片描述
我们这里点击右上角的New SSH key
在这里插入图片描述
接下来就会进入这个界面。
在这里插入图片描述
现在我们就要生成SSH key了。
我们打开命令行,输入以下命令。

ssh-keygen -t rsa -b 4096 -C "你的注册邮箱"

按下回车后再按下三次回车就好。然后我们就会出现下面的界面,代表SSH keys生成完毕。
在这里插入图片描述
命令行的这个地方提示了SSH keys生成的地方,打开对应文件夹可以找到SSH keys。
在这里插入图片描述
打开对应文件夹后,用记事本打开这个.pub结尾的文件。
在这里插入图片描述
打开后复制里面的内容,然后回到之前的添加SSH Key界面,上面的Title随便输入一个名字就好。
然后下面的Key栏粘贴我们刚刚复制的生成的SSH key。
在这里插入图片描述
完成后点击下面的Add SSH key,然后会让你再输入一遍账号的密码进行确认,之后就完成了添加。
现在我们可以检查以下是否能成功建立连接,这一步同样需要科学上网。
我们输入以下命令。

ssh -T git@github.com

回车后对于下一个询问输入yes再回车即可。
在这里插入图片描述
出现Hi的那一行就说明SSH连接建立完毕。

现在我们先创建一个远程仓库,这个远程仓库,就相当于我们前面说的大家一起使用的网盘,本地的仓库只是在自己电脑上,别人难以访问,现在放到GitHub上之后,它就是一个网上的资源,当然你也可以设置哪些人可以访问。
我们打开GitHub页面,然后选择这里的加号,然后点击New repository。当然也可以在别的界面创建仓库,比如左边的侧栏,或者是个人仓库界面都可以创建一个新的仓库。
在这里插入图片描述
点击后,我们输入这个仓库的名字,下面Description一栏中可以输入这个仓库的描述,下面的Add a README file,也建议勾选。
在这里插入图片描述
其余选项不动后,然后点击右下角的Create repository就完成了仓库的创建。
完成创建后就只会有一个孤零零的README文件展示了这个项目是做什么的。
在这里插入图片描述
我们其实可以直接点击Add file添加文件,但是只能上传单一的文件,无法直接上传文件夹,而且本教程就是想教大家如何使用Git进行上传。我们这里点击Code,然后选择SSH,然后复制对应的SSH地址。
在这里插入图片描述
我们回到要上传的文件夹下,我们向前面的步骤一样开始操作。
在这里插入图片描述
当我们完成本地仓库的提交后,我们下一步就是将这个存档提交到远程仓库之中去。
我们输入以下指令。

git remote add origin (远程仓库的SSH地址)

在这里插入图片描述
我们输入以下指令会发现报错。

git push -u origin main

在这里插入图片描述
该指令是说我们将本地的main分支推送到远程仓库origin中,但是现在远程仓库有README文件,我们本地没有,这就是我们前面说的发生了冲突,我们为了解决这个问题,我们需要先拉取远程仓库的更改,以确保我的本地仓库是最新的。
我们输入命令。

git pull origin main

在这里插入图片描述
我们发现这里继续报错,因为这里我们都是main分支,这里引起了冲突。
由于我们这里是不同的文件,我们现在要求它们强制合并其实也不会有什么问题,因此我们可以使用下面的命令。

git pull origin main --allow-unrelated-histories

在这里插入图片描述
这里我们可以发现文件夹下多了原来的README文件,因为这里我们进行了强制合并。

我们再输入远程提交命令。

git push -u origin main

在这里插入图片描述
这里提示已经成功,我们再去GitHub上查看一下。
也成功完成上传。
在这里插入图片描述
这其实告诉我们正确的代码顺序,其实是先创建远程仓库,然后我们将仓库和我们的本地仓库进行同步(pull),然后我们进行代码书写,然后完成修改后,再提交到远程仓库,这才是正确的远程仓库使用顺序。

6.2 Visual Studio Code版本

Visual Studio Code版本的操作如下。
我们回到刚刚的Souce Control界面,然后点击这里的Publish Branch。
在这里插入图片描述
这里会弹出一个弹窗,这个弹窗会让你去登录GitHub。
在这里插入图片描述
这里确定是自己的账号后点击Continue即可。
在这里插入图片描述
然后后面会有一个正式的权限授权,继续点击Authorize Visual-Studio-Code即可。允许后面的弹窗。
回到Visual Studio Code后,这里会问你要上传到私人仓库,还是公开仓库,这就看你的具体项目情况了。
在这里插入图片描述
我这里选择上传到公共仓库,等待一会后,它就会上传完毕,当然这里需要科学上网。
在这里插入图片描述
成功后左边的Graph里的这个分支的右边会多一个云的标志,表示你的这个分支已经上传到GitHub上了。
我们打开GitHub上能看到成功上传。

在这里插入图片描述
当我们现在本地又有新的存档提交到仓库之中时,我们的这里云端就会落后与本地的仓库,这里的Graph也会出现左边的这种情况,我们这时候再点击左边的Sync Changes就能完成前面的Pull和Push的操作。
在这里插入图片描述
同样这里会提示你,这里可以选择OK,Don’t Show Again即可。
在这里插入图片描述
等待上传完毕,现在云端和本地又实现同步了。
在这里插入图片描述
这就是全部Git和GitHub的基础教学教程,一些其他复杂的实际使用这里没有详细说明,希望大家能学会Git的基础使用,能在GitHub上找到优秀的开源项目帮助到自己,在未来和别人的多人项目中做出自己的贡献。

相关文章:

Git和GitHub基础教学

文章目录 1. 前言2. 历史3. 下载安装Git3.1 下载Git3.2 安装Git3.3 验证安装是否成功 4. 配置Git5. Git基础使用5.1 通过Git Bash使用5.1.1 创建一个新的仓库。5.1.1.1 克隆别人的仓库5.1.1.2 自己创建一个本地仓库 5.1.2 管理存档 5.2 通过Visual Studio Code使用 6. Git完成远…...

【Linux docker】关于docker启动出错的解决方法。

无论遇到什么docker启动不了的问题 就是 查看docker状态sytemctl status docker查看docker日志sudo journalctl -u docker.service查看docker三个配置文件(可能是配置的时候格式错误):/etc/docker/daemon.json(如果存在&#xf…...

程序化广告行业(2/89):从程序化广告深挖数据处理技巧

程序化广告行业(2/89):从程序化广告深挖数据处理技巧 大家好!我一直希望能和大家在技术学习的道路上携手共进,这也是我写这一系列博客的初衷。上次我们一起学习了Python基础的数据处理知识,这次咱们借助一…...

第七课:Python反爬攻防战:Headers/IP代理与验证码

在爬虫开发过程中,反爬虫机制成为了我们必须面对的挑战。本文将深入探讨Python爬虫中常见的反爬机制,并详细解析如何通过随机User-Agent生成、代理IP池搭建以及验证码识别来应对这些反爬策略。文章将包含完整的示例代码,帮助读者更好地理解和…...

时序数据库TimescaleDB基本操作示例

好的&#xff01;以下是使用 TimescaleDB 的 Java 示例&#xff08;基于 JDBC&#xff0c;因为 TimescaleDB 是 PostgreSQL 的扩展&#xff0c;官方未提供独立的 Java SDK&#xff09;&#xff1a; 1. 添加依赖&#xff08;Maven&#xff09; <dependency><groupId&g…...

【CSS 】Class Variance Authority CSS 类名管理工具库

1.背景、什么是 CVA&#xff1f; Class Variance Authority (CVA) 是一个用于管理 CSS 类名 的工具库&#xff0c;特别适合在 React 或 Vue 等前端框架中使用。它可以帮助你更轻松地处理组件的 样式变体&#xff08;Variants&#xff09;&#xff0c;比如按钮的不同状态&#…...

【Linux】36.简单的TCP网络程序

文章目录 1. TCP socket API 详解1.1 socket():打开一个网络通讯端口1.2 bind():绑定一个固定的网络地址和端口号1.3 listen():声明sockfd处于监听状态1.4 accept():接受连接1.5 connect():连接服务器 2. 实现一个TCP网络服务器2.1 Log.hpp - "多级日志系统"2.2 Daem…...

Win 转 MacBook Pro 踩坑指南

前言 Window 和 macOS 系统的差异还是很大的&#xff0c;我从 Thinkpad 转用 M1 的 Macbook pro 已经一年了&#xff0c;几乎没有任何不适应&#xff0c;整体感受那是真的牛&#x1f443;&#xff0c;速度和续航惊艳到我了&#xff0c;同时开启 6个 vscode 加几十个浏览器标签…...

【模拟CMOS集成电路设计】带隙基准(Bandgap)设计与仿真(基于运放的电流模BGR)

【模拟CMOS集成电路设计】带隙基准&#xff08;Bandgap&#xff09;设计与仿真 前言工程文件&部分参数计算过程&#xff0c;私聊~ 一、 设计指标指标分析&#xff1a; 二、 电路分析三、 仿真3.1仿真电路图3.2仿真结果(1)运放增益(2)基准温度系数仿真(3)瞬态启动仿真(4)静态…...

手写一个Tomcat

Tomcat 是一个广泛使用的开源 Java Servlet 容器&#xff0c;用于运行 Java Web 应用程序。虽然 Tomcat 本身功能强大且复杂&#xff0c;但通过手写一个简易版的 Tomcat&#xff0c;我们可以更好地理解其核心工作原理。本文将带你一步步实现一个简易版的 Tomcat&#xff0c;并深…...

QT显示网页控件QAxWidget、QWebEngineView及区别

一.QT种显示网页控件QAxWidget 1.介绍 QAxWidget 属于 QtAxContainer 模块&#xff0c;ActiveX 是微软提出的一种组件对象模型&#xff08;COM&#xff09;技术&#xff0c;允许不同的软件组件在 Windows 操作系统上进行交互和集成。QAxWidget 为开发者提供了在 Qt 应用程序中…...

【AI智能体报告】开源AI助手的革命:OpenManus深度使用报告

一、引言&#xff1a;当开源智能体走进生活 2025年3月&#xff0c;MetaGPT团队用一场"开源闪电战"改写了AI Agent的竞争格局。面对商业产品Manus高达10万元的邀请码炒作&#xff0c;他们仅用3小时便推出开源替代品OpenManus&#xff0c;首日即登顶GitHub趋势榜。 …...

VS Code连接服务器教程

VS Code是什么 VS Code&#xff08;全称 Visual Studio Code&#xff09;是一款由微软推出的免费、开源、跨平台的代码编辑神器。VS Code 支持 所有主流操作系统&#xff0c;拥有强大的功能和灵活的扩展性。 官网&#xff1a;https://code.visualstudio.com/插件市场&#xff1…...

装饰器模式的C++实现示例

核心思想 装饰器设计模式是一种结构型设计模式&#xff0c;它允许动态地为对象添加额外的行为或职责&#xff0c;而无需修改其原始类。装饰器模式通过创建一个装饰器类来包装原始对象&#xff0c;并在保持原始对象接口一致性的前提下&#xff0c;扩展其功能。 装饰器模式的核…...

C 语言数据结构(二):顺序表和链表

目录 1. 线性表 2. 顺序表 2.1 概念及结构 2.1.1 静态顺序表&#xff08;不常用&#xff09; 2.1.2 动态顺序表&#xff08;常用&#xff09; ​编辑 2.2 练习 2.2.1 移除元素 2.2.2 删除有序数组中的重复项 2.2.3 合并两个有序数组 2.3 顺序表存在的问题 3. 链表 …...

TDengine 服务无法启动常见原因

taosd 是 TDengine 的核心服务进程&#xff0c;如果无法启动将导致整个数据库无法使用&#xff0c;了解常导致无法启动的原因&#xff0c;可以帮你快速解决问题。 1. 如何查找日志 无法启动的原因记录在日志中&#xff0c;日志文件默认在 /var/log/taos 的 taosdlog.0 或者 t…...

在 UniApp 中实现stream流式输出 AI 聊天功能,AI输出内容用Markdown格式展示

在 UniApp 中实现流式 AI 聊天功能 介绍 在现代 Web 开发中&#xff0c;流式 API 响应能够显著提升用户体验&#xff0c;尤其是在与 AI 聊天接口进行交互时。本文将介绍如何在 UniApp 中使用 Fetch API 实现一个流式响应的 AI 聊天功能&#xff0c;包括实时更新聊天内容和滚动…...

数据库SQL的配置和练习题

一、MySQL的安装 1.安装包下载 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 2.解压软件包 将MySQL软件包解压在没有中文和空格的目录下 3.设置配置文件 在解压目录下创建my.ini文件并添加内容如下&#xff1a; ​ [client] #客户端设置&…...

Pytorch的一小步,昇腾芯片的一大步

Pytorch的一小步&#xff0c;昇腾芯片的一大步 相信在AI圈的人多多少少都看到了最近的信息&#xff1a;PyTorch最新2.1版本宣布支持华为昇腾芯片&#xff01; 1、 发生了什么事儿&#xff1f; 在2023年10月4日PyTorch 2.1版本的发布博客上&#xff0c;PyTorch介绍的beta版本…...

AI+办公 Task1

作业 题目1&#xff1a;提示词除了三要素“角色”、“背景”、“要求”之外&#xff0c;还有哪些关键要素 提示词有一个框架叫CO-STAR框架&#xff0c;还有的关键要素有风格、任务、响应格式等。 要素适用场景实际案例​Context需要限定领域或场景的任务"作为医学助手&…...

文件系统调用─── linux第17课

目录 linux 中man 2和man 3的区别 文件内容介绍 C语言文件接口 示例: 输出信息到显示器&#xff0c;你有哪些方法 总结: 系统文件I/O 文件类的系统调用接口介绍 示例 open 函数具体使用哪个,和具体应用场景相关&#xff0c; write read close lseek ,类比C文件相关接…...

概念|RabbitMQ 消息生命周期 待消费的消息和待应答的消息有什么区别

目录 消息生命周期 一、消息创建与发布阶段 二、消息路由与存储阶段 三、消息存活与过期阶段 四、消息投递与消费阶段 五、消息生命周期终止 关键配置建议 待消费的消息和待应答的消息 一、待消费的消息&#xff08;Unconsumed Messages&#xff09; 二、待应答的消息…...

Javaweb后端文件上传@value注解

文件本地存储磁盘 阿里云oss准备工作 阿里云oss入门程序 要重启一下idea&#xff0c;上面有cmd 阿里云oss案例集成 优化 用spring中的value注解...

DeepSeek技术演进与发展前瞻

如果喜欢可以订阅专栏哟(^U^)ノ~YO,至少更新6年 以下DeepSeek未来发展的技术分析框架及核心内容示范 # -*- coding: utf-8 -*- """ DeepSeek技术演进模拟器(概念验证代码) 本代码展示动态架构调整的核心逻辑 """class DynamicArchitect…...

Java常见面试技术点整理讲解——后端框架(整理中,未完成)

前言&#xff1a; 对于后端常用框架的技术整理&#xff0c;其实框架在平时就是会用就行&#xff0c;但面试时多半需要描述实现原理&#xff0c;这个要靠自己理解&#xff0c;不推荐死记硬背。 这篇和另外几篇文章区分开&#xff0c;主要用于规整Java后端各种框架&#xff0c;…...

目标检测YOLO实战应用案例100讲-基于毫米波雷达的多目标检测 (续)

目录 3.2 改进的CFAR目标检测算法 3.3 算法步骤描述 3.4 实验结果与分析 基于VGG16-Net的毫米波雷达目标检测算法 4.1 VGG16-Net网络模型 4.2 改进VGG16-Net网络的目标检测算法 4.3 算法步骤描述 4.4 实验结果与分析 知识拓展 基于毫米波雷达的多目标检测:使…...

python爬虫:Android自动化工具Auto.js的详细使用

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Auto.js 简介2. 安装与配置2.1 安装 Auto.js2.2 安装 Python 环境2.3 安装 ADB 工具3. Python 与 Auto.js 结合3.1 通过 ADB 执行 Auto.js 脚本3.2 通过 Python 控制 Auto.js3.3 通过 Python 与 Auto.js 交互4. 常用…...

MyBatis-Plus 注解大全

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 MyBatis-Plus 注解大全 MyBatis-Plus 是基于 MyBatis 的增强工具&#xff0c;通过注解简化了单表 CRUD 操作和复杂查询的配置。以下是常用注解的分类及详细说…...

牛客周赛 Round 84——小红的陡峭值(四)

牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 小红的陡峭值&#xff08;四&#xff09; 题目&#xff1a; 思路&#xff1a; 题目告诉我们关于树的陡峭值的定义&#xff0c;那一开始看起来无从下手&#xff0c;但是当我们选取某一个节点为根节点时&#…...

Redis 内存淘汰策略深度解析

Redis 作为高性能的内存数据库&#xff0c;其内存资源的高效管理直接关系到系统的稳定性和性能。当 Redis 的内存使用达到配置的最大值&#xff08;maxmemory&#xff09;时&#xff0c;新的写入操作将触发内存淘汰机制&#xff08;Eviction Policy&#xff09;&#xff0c;以释…...

微前端之 Garfish.js 的基础使用教程和进阶配置

前言 在现代前端开发中&#xff0c;微前端架构逐渐成为一种流行的解决方案。它允许将大型应用拆分成多个小型独立的子应用&#xff0c;从而提高开发效率和可维护性。Garfish.js 是一个强大的微前端框架&#xff0c;可以帮助我们轻松实现这一架构。在本文中&#xff0c;通过一个…...

Rabbitmq--延迟消息

13.延迟消息 延迟消息&#xff1a;生产者发送消息时指定一个时间&#xff0c;消费者不会立刻收到消息&#xff0c;而是在指定时间之后才会收到消息 延迟任务&#xff1a;一定时间之后才会执行的任务 1.死信交换机 当一个队列中的某条消息满足下列情况之一时&#xff0c;就会…...

Webshell原理与利用

本文内容仅用于技术研究、网络安全防御及合法授权的渗透测试&#xff0c;严禁用于任何非法入侵、破坏或未经授权的网络活动。 1. WebShell的定义与原理 定义&#xff1a;WebShell是一种基于Web脚本语言&#xff08;如PHP、ASP、JSP&#xff09;编写的恶意后门程序&#xff0c;…...

Android 内存泄漏实战:从排查到修复的完整指南

通过实战示例和工具使用&#xff0c;帮助开发者理解、排查和修复 Android 应用中的内存泄漏问题 1. 什么是内存泄漏&#xff1f; 定义&#xff1a;内存泄漏是指程序中已动态分配的内存由于某种原因未能释放&#xff0c;导致系统内存的浪费&#xff0c;最终可能导致应用崩溃或性…...

Liunx系统 : 进程间通信【IPC-Shm共享内存】

文章目录 System V共享内存创建共享内存shmget 控制共享内存shmctl shm特性 System V System V是Liunx中的重要的进程间通信机制&#xff0c;它包括&#xff08;shm&#xff09;共享内存&#xff0c;&#xff08;msg&#xff09;消息队列和&#xff08;sem&#xff09;信号量。…...

c语言笔记 数组指针

数组指针是指针类型的一种&#xff0c;一般数组指针跟二维数组&#xff0c;一维数组结合比较多&#xff0c;下面我们通过图片来探讨一下数组指针的使用以及结合起来的联系。 1.数组指针与一维数组 int a[3]; //一维数组 int aa[2][3];//二维数组 数组元素类型 int [3] int (*p…...

SpringBoot + vue 管理系统

SpringBoot vue 管理系统 文章目录 SpringBoot vue 管理系统 1、成品效果展示2、项目准备3、项目开发 3.1、部门管理 3.1.1、前端核心代码3.1.2、后端代码实现 3.2、员工管理 3.2.1、前端核心代码3.2.2、后端代码实现 3.3、班级管理 3.3.1、前端核心代码3.3.2、后端代码实现 …...

Python语法核心架构与核心知识点:从理论到实践

一、Python的核心设计哲学 Python以“简洁优雅”为核心理念&#xff0c;遵循以下原则&#xff1a; # Zen of Python&#xff08;输入 import this 可查看&#xff09; >>> import this The Zen of Python, by Tim Peters ... Simple is better than complex. Readab…...

OpenHarmony子系统开发 - 编译构建Kconfig可视化配置指导

OpenHarmony子系统开发 - 编译构建Kconfig可视化配置指导 概述 功能简介 该功能基于Kconfiglib与Kconfig实现&#xff0c;方便用户个性化配置OpenHarmony产品子系统部件。 基于Kconfig实现的可视化配置功能具有以下优点&#xff1a; 能直观且全面地展示软件的部件选项。可…...

管中窥豹数字预失真(DPD)

管中窥豹数字预失真&#xff08;DPD&#xff09; 数字预失真在通信领域发挥了巨大的作用&#xff0c;对提高功放效率、改善误码率起了不可忽略的作用&#xff0c;广泛运用与通信、雷达等各种领域。但是对于普通用户&#xff0c;它显得及其高深神秘。今天就用这个短文&#xff…...

spring-boot-starter和spring-boot-starter-web的关联

maven的作用是方便jar包的管理&#xff0c;所以每一个依赖都是对应着相应的一个或者一些jar包&#xff0c;从网上看到很多对spring-boot-starter的描述就是“这是Spring Boot的核心启动器&#xff0c;包含了自动配置、日志和YAML。”没看太明白&#xff0c;所参与的项目上也一直…...

梯度计算中常用的矩阵微积分公式

标量对向量求导的常用数学公式 设标量函数 y f ( x ) y f(\boldsymbol{x}) yf(x)&#xff0c;其中 x ( x 1 , x 2 , ⋯ , x n ) T \boldsymbol{x} (x_1, x_2, \cdots, x_n)^{\rm T} x(x1​,x2​,⋯,xn​)T是一个 n n n维列向量。标量 y y y对向量 x \boldsymbol{x} x的导数…...

vim 编写/etc/docker/daemon.json文件时,E212: 无法打开并写入文件

目录 问题描述 解决方法 1、创建/etc/docker目录 2、打开/etc/docker目录 3、创建daemon.json文件 4、vim 编辑daemon.json文件 问题描述 当我们输入代码&#xff1a;vim /etc/docker/daemon.json时&#xff0c;报E212: 无法打开并写入文件错误&#xff0c;如下图 vim /e…...

http 模块的概念及作用详细介绍

目录 1. http 模块概述 2. http 模块的作用 3. http 服务器代码示例 运行代码 4. http 客户端代码示例 运行代码 5. 总结 1. http 模块概述 http 模块是 Node.js 内置的核心模块之一&#xff0c;它用于创建 HTTP 服务器和客户端&#xff0c;支持处理 HTTP 请求和响应。…...

重生之我在学Vue--第5天 Vue 3 路由管理(Vue Router)

重生之我在学Vue–第5天 Vue 3 路由管理&#xff08;Vue Router&#xff09; 文章目录 重生之我在学Vue--第5天 Vue 3 路由管理&#xff08;Vue Router&#xff09;前言一、路由配置与导航1.1 什么是 Vue Router&#xff1f;1.2 安装 Vue Router1.3 基本路由配置步骤代码示例 1…...

常见排序算法深度评测:从原理到10万级数据实战

常见排序算法深度评测&#xff1a;从原理到10万级数据实战 摘要 本文系统解析冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序和基数排序8种经典算法&#xff0c;通过C语言实现10万随机数排序并统计耗时。测试显示&#xff1a;快速排序综合性能最优&…...

搭建BOA服务器

BOA服务器是嵌入式常用的服务器类型&#xff0c;嵌入式程序作为后端时候如果想配合网页进行显示&#xff0c;利用BOA服务器搭建网络界面是不错的选择 首先下载boa官方安装包 Boa Webserver 下载后传输到Ubuntu随便文件夹&#xff0c;解压 tar -xvf boa-0.94.13.tar.gz 进入…...

JSON.parse(JSON.stringify())深拷贝不会复制函数

深拷贝 是指创建一个新对象&#xff0c;并递归地复制原对象中所有层级的属性和值&#xff0c;从而确保新对象与原对象完全独立 深拷贝的实现方法 &#xff1a; 1. 使用 JSON.parse(JSON.stringify()) 函数会被忽略复制&#xff0c;比如&#xff0c;下面的对象的forma…...

debug_unpack_ios failed: Exception: Failed to codesign 解决方案(亲测有效)

debug_unpack_ios failed: Exception: Failed to codesign 解决方案&#xff08;亲测有效&#xff09; 背景原因解决方案tipsresult 背景 执行flutter doctor全通过后run项目依然报错 原因 1、检查flutter Mac的flutter项目在哪个文件夹内 2、检查flutter Sdk在哪个文件夹内 …...

Docker篇

1.docker环境搭建&#xff1a; 1.1软件仓库的配置rhel9&#xff1a; #cd/etc/yum.repos.d #vim docker.repo [docker] namedocker-ce baseurlhttps://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable gpgcheck0 1.2安装docker并且启动服务 yum install -y dock…...