【软件入门】Git快速入门
Git快速入门
文章目录
- Git快速入门
- 0.前言
- 1.安装和配置
- 2.新建版本库
- 2.1.本地创建
- 2.2.云端下载
- 3.版本管理
- 3.1.添加和提交文件
- 3.2.回退版本
- 3.2.1.soft模式
- 3.2.2.mixed模式
- 3.2.3.hard模式
- 3.2.4.使用场景
- 3.3.查看版本差异
- 3.4.忽略文件
- 4.云端配置
- 4.1.Github
- 4.1.1.SSH配置
- 4.1.2.关联本地仓库和远程仓库
- 4.2.Gitee
- 4.3.GitLab
- 5.在VSCode中使用Git
- 5.1.配置Git
0.前言
前两天刷视频刷到Git的教学视频,才突然发现自己大学四年居然连Git都不会用,实在是太蠢了。今天也是熬到周五了,干点自己的事,囫囵吞枣地学个Git吧!
虽然发这篇博客确实是周五发的,但其实这个Flag是上上周五立的
当然了,鉴于笔者水平很差,如果想要精通Git这篇笔记是远远不够的。如果只是想用一下,我觉得看这篇笔记还是OK的。作为方便其他初学者参考的笔记,笔者尽可能详细记录,争取看了就能会。
本篇笔记参考视频:【GeekHour】一小时Git教程_哔哩哔哩_bilibili
强烈推荐如果有时间的话去看一下这位UP的视频,动画精美,内容详细,非常不错!
需要强调的是这个东西最多最多也只是一个工具,不要喧宾夺主。
1.安装和配置
进入Git官网:Git - Downloads (git-scm.com),下载自己操作系统对应的版本即可。
安装过程中需要注意的点不多。几乎可以一路默认配置,除了这里需要选择你常用的编译器:
安装完毕后打开Git CMD(注意不是普通CMD),输入:
git -v
能够正确显示版本号,安装成功。
安装完毕后我们配置用户名和邮箱。在命令行中先后输入下面两行代码:
git config --global user.name "xxx"
git config --global user.email "xxx@xxx.com"
这两行代码输入完毕后是没有答复的,不用担心。配置完后可以输入下面这条指令来查看是否配置成功:
git config --list
可以看到没有问题。
2.新建版本库
版本库又名仓库,英文名Repository,简称Repo。仓库通俗来说就是目录。创建仓库有两种途径,一种是在本地创建,一种是从云端下载。
2.1.本地创建
首先需要找到一个合适的位置创建一个空目录,右键,选择Open Git Bash here:

输入:
git init
可以看到在Git Learning目录下新建了一个.git文件夹。但是细心的朋友可能会发现文件夹是空的:

这是因为.git文件夹是隐藏的,我们在查看中勾选显示隐藏的项目:
这样就能看到这个文件夹了:

不过平时不需要看到,只是在这里做演示。平时完全可以隐藏掉,这样可以防止误删。
2.2.云端下载
我们还可以通过git命令直接从Github或Gitee上下载自己或别人的仓库,在命令行输入:
git clone https://gitee.com/xxxxxxxxx
git clone https://github.com/xxxxxxxx
稍等片刻即可。
3.版本管理
在正式开始进行版本管理之前,我们要先了解一下Git的工作区域和文件状态。这一部分强烈推荐看这段视频,一共就3分钟,这里仅放两张图。视频链接:04.工作区域和文件状态_哔哩哔哩_bilibili


3.1.添加和提交文件
编辑好新文件后,可以通过以下三种方式将文件添加到暂存区:
git add file1.txt
git add *.txt
git add .
第一条指令是只添加某一文件,第二条指令是将所有.txt格式的文件添加到暂存区,第三条指令是将文件夹内所有文件都添加到暂存区。
比如我们输入:
git add file1.txt
然后输入:
git status
从上到下可以看到No commits yet,即还没有被提交到本地仓库;然后Changes to be committed,这是add到“cache”中但是还未“commit”的file1.txt;然后Untracked files,这是连add都没add的文件。
我们再输入:
git add .
git status
可以看到都提交到暂存区了。
添加到暂存区后,需要用commit指令将暂存区里的文件提交到仓库。输入:
git commit -m log
git commit
如果用第一条,则在-m后面,即log的位置输入你本次提交留下的日志。如果用第二条,则会跳转你安装时默认的编译器。
先试试第一条:
我们查看一下日志,输入:
git log
我们创建三个新文件,然后重新上传到暂存区,然后试一试不加-m会发生什么。从暂存区提交到仓库之前还是先看一看状态:
现在提交到仓库:

稍等片刻后,自动跳转到了VSCode,这是我在安装Git时配置的默认editor。我们在光标位置输入这次的log信息,然后在最后一行输入:
:wq
注意输入的是半角冒号。

输入完后Ctrl+s保存文件,然后直接关闭文件,终端就会自动更新:
再看一看log:
到这里就可以给我刚刚写的log纠错,说明在VSCode中写log并不需要输入:wq退出,而是直接保存并退出即可。
3.2.回退版本
回退版本分为3个类型,分别是soft、hard和mixed,默认的模式是mixed。
我们先在分别在file1和file2中输入(直接打开文本文件打字就行):
file1-v3
随便说点话吧
file2-v3
实在不知道说什么了哥
然后看一看状态:
该add了:
然后commit:
为了便于观察,我们再在file1、2、3中分别输入:
file1-v4
没有删掉刚刚的内容哦,只是在后面又加了一句话
file2-v4
把刚刚的那些废话删了,现在只剩这一句了
file3-v4
我是纯纯的新文件
同时,新建一个file4.txt,删掉之前这三个文件:

还是先add,然后看看status:
可以看到它是误以为我删了俩,改名了一个,这个其实无所谓。直接commit后看log:
3.2.1.soft模式
现在来试验一下版本回退,先试试soft模式:
git reset --soft 4e30568f302f979cde4debe02c434f9e7ce18ea5
注意,4e30568f302f979cde4debe02c434f9e7ce18ea5是v3的版本号,这个每个人的都不同,需要自己复制。
然后瞅瞅log:
再看看file1:
再看看status:
可见,soft模式是回退到提交至本地仓库那一步,即回退到commit之前。
3.2.2.mixed模式
我们重新commit:
然后输入:
git reset --mixed 4e30568f302f979cde4debe02c434f9e7ce18ea5
然后瞅瞅log:
再看看file1:
再看看status:
可见,soft模式是回退到提交至暂存区那一步,即回退到add之前。
3.2.3.hard模式
我们重新add并commit:
然后输入:
git reset --hard 4e30568f302f979cde4debe02c434f9e7ce18ea5
然后瞅瞅log:
再看看file1:

再看看status:
可见,soft模式是回退到v3版本最初的样子,不论是文件中的内容,还是项目中包含哪些文件,都是最初的样子。
但是这时候就出现了一个问题,这些文件都没了,我后悔了该怎么办?别急,可以回溯。输入:
git reflog
然后复制v4的版本号,输入:
git reset --hard b1e08a0
注意,这里的版本号是b1e08a0 HEAD@{1}: commit: v4这一行的版本号。
看看log:
回溯成功了。
3.2.4.使用场景
如果你已经更新到v4,觉得v3相比于v2没什么区别,单开一个版本号太浪费了,那可以用soft或mixed模式回退到v2,然后重新commit即可。
一般不推荐使用hard,除非你百分之百确定这玩意没用了。不过即便是用了hard,文件更改没了,也不是不可挽回的,回溯就成。
3.3.查看版本差异
在文件夹内新建一个file5.txt:
然后依次add、commit。随后我们更改一下file5.txt里的内容,在命令行中输入:
get diff
如果我们add后再输入get diff,这个差异就不见了:
也就是说,git diff这个命令是查看上一次commit之后,这一次add之前的差异。如果想查看上一次commit之后,这一次add之后、commit之前的差异,需要输入:
git diff HEAD
也可以对比add前后的差异:
git diff --cached
也可以查看不同版本的差异。我们先把这个版本commit一下:
然后查看之前的版本号:
我们对比v6和v5的区别,版本号分别为6fc94a042c9e8f7b73ed53fab5bbe83ed27be8e6和e8dda090421cfd0f9d59ead9f976b9d79736fc54,输入:
git diff 6fc94a042c9e8f7b73ed53fab5bbe83ed27be8e6 e8dda090421cfd0f9d59ead9f976b9d79736fc54
如果要比较某一版本和当前版本的差异,可以不输入当前版本的版本号,而是用HEAD代替,如:
git diff HEAD e8dda090421cfd0f9d59ead9f976b9d79736fc54
更经常用的命令是比较当前版本和上一版本的差异,输入:
git diff HEAD~ HEAD
这个命令也可以变为:
git diff HEAD~2 HEAD
这是查看当前版本和两个版本之前版本的差异。
也可以单独查看某一个文件的差异,先整体看一下和三个版本之前的差异:
git diff HEAD~3 HEAD
可以看到有很多文件都不同。我们输入:
git diff HEAD~3 HEAD file2.txt
就只显示file2的差异了。
3.4.忽略文件
可以参考这篇博客:[Git 开发必备 .gitignore 详解!【建议收藏】-CSDN博客](https://blog.csdn.net/nyist_zxp/article/details/119887324?ops_request_misc=%7B%22request%5Fid%22%3A%22d4ab1f51b41cda7446b6cff986a5141f%22%2C%22scm%22%3A%2220140713.130102334…%22%7D&request_id=d4ab1f51b41cda7446b6cff986a5141f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-119887324-null-null.142v100pc_search_result_base2&utm_term=Git ignore&spm=1018.2226.3001.4187)
常用的忽略一般是忽略某个目录,一般编译产生的文件都会放在某个文件夹下,这个文件夹我们一般无需上传,将其忽略掉即可。举个例子,这是一个STM32H7项目的文件夹:
.
├─Core
│ ├─Inc
│ └─Src
├─Drivers
│ ├─CMSIS
│ │ ├─Core
│ │ │ ├─Include
│ │ │ └─Template
│ │ │ └─ARMv8-M
│ │ ├─Core_A
│ │ │ ├─Include
│ │ │ └─Source
│ │ ├─Device
│ │ │ └─ST
│ │ │ └─STM32H7xx
│ │ │ ├─Include
│ │ │ └─Source
│ │ │ └─Templates
│ │ │ ├─arm
│ │ │ ├─gcc
│ │ │ └─iar
│ │ │ └─linker
│ │ ├─docs
│ │ │ └─General
│ │ │ └─html
│ │ ├─DSP
│ │ │ ├─DSP_Lib_TestSuite
│ │ │ │ ├─Common
│ │ │ │ │ ├─inc
│ │ │ │ │ │ ├─basic_math_tests
│ │ │ │ │ │ ├─complex_math_tests
│ │ │ │ │ │ ├─controller_tests
│ │ │ │ │ │ ├─fast_math_tests
│ │ │ │ │ │ ├─filtering_tests
│ │ │ │ │ │ ├─intrinsics_tests
│ │ │ │ │ │ ├─matrix_tests
│ │ │ │ │ │ ├─statistics_tests
│ │ │ │ │ │ ├─support_tests
│ │ │ │ │ │ ├─templates
│ │ │ │ │ │ └─transform_tests
│ │ │ │ │ ├─JTest
│ │ │ │ │ │ ├─inc
│ │ │ │ │ │ │ ├─arr_desc
│ │ │ │ │ │ │ ├─opt_arg
│ │ │ │ │ │ │ └─util
│ │ │ │ │ │ └─src
│ │ │ │ │ ├─platform
│ │ │ │ │ │ ├─ARMCC
│ │ │ │ │ │ ├─ARMCLANG
│ │ │ │ │ │ └─GCC
│ │ │ │ │ └─src
│ │ │ │ │ ├─basic_math_tests
│ │ │ │ │ ├─complex_math_tests
│ │ │ │ │ ├─controller_tests
│ │ │ │ │ ├─fast_math_tests
│ │ │ │ │ ├─filtering_tests
│ │ │ │ │ ├─intrinsics_tests
│ │ │ │ │ ├─matrix_tests
│ │ │ │ │ ├─statistics_tests
│ │ │ │ │ ├─support_tests
│ │ │ │ │ └─transform_tests
│ │ │ │ ├─DspLibTest_FVP
│ │ │ │ ├─DspLibTest_FVP_A5
│ │ │ │ │ └─RTE
│ │ │ │ │ ├─CMSIS
│ │ │ │ │ └─Device
│ │ │ │ │ └─ARMCA5
│ │ │ │ ├─DspLibTest_MPS2
│ │ │ │ ├─DspLibTest_SV_FVP
│ │ │ │ ├─DspLibTest_SV_MPS2
│ │ │ │ └─RefLibs
│ │ │ │ ├─inc
│ │ │ │ └─src
│ │ │ │ ├─BasicMathFunctions
│ │ │ │ ├─ComplexMathFunctions
│ │ │ │ ├─ControllerFunctions
│ │ │ │ ├─FastMathFunctions
│ │ │ │ ├─FilteringFunctions
│ │ │ │ ├─HelperFunctions
│ │ │ │ ├─Intrinsics
│ │ │ │ ├─MatrixFunctions
│ │ │ │ ├─StatisticsFunctions
│ │ │ │ ├─SupportFunctions
│ │ │ │ └─TransformFunctions
│ │ │ ├─Examples
│ │ │ │ └─ARM
│ │ │ │ ├─arm_class_marks_example
│ │ │ │ │ └─RTE
│ │ │ │ │ └─Device
│ │ │ │ │ ├─ARMCM0
│ │ │ │ │ ├─ARMCM3
│ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ └─ARMCM7_SP
│ │ │ │ ├─arm_convolution_example
│ │ │ │ │ └─RTE
│ │ │ │ │ └─Device
│ │ │ │ │ ├─ARMCM0
│ │ │ │ │ ├─ARMCM3
│ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ └─ARMCM7_SP
│ │ │ │ ├─arm_dotproduct_example
│ │ │ │ │ └─RTE
│ │ │ │ │ └─Device
│ │ │ │ │ ├─ARMCM0
│ │ │ │ │ ├─ARMCM3
│ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ └─ARMCM7_SP
│ │ │ │ ├─arm_fft_bin_example
│ │ │ │ │ └─RTE
│ │ │ │ │ └─Device
│ │ │ │ │ ├─ARMCM0
│ │ │ │ │ ├─ARMCM3
│ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ └─ARMCM7_SP
│ │ │ │ ├─arm_fir_example
│ │ │ │ │ └─RTE
│ │ │ │ │ └─Device
│ │ │ │ │ ├─ARMCM0
│ │ │ │ │ ├─ARMCM3
│ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ └─ARMCM7_SP
│ │ │ │ ├─arm_graphic_equalizer_example
│ │ │ │ │ └─RTE
│ │ │ │ │ └─Device
│ │ │ │ │ ├─ARMCM0
│ │ │ │ │ ├─ARMCM3
│ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ └─ARMCM7_SP
│ │ │ │ ├─arm_linear_interp_example
│ │ │ │ │ └─RTE
│ │ │ │ │ └─Device
│ │ │ │ │ ├─ARMCM0
│ │ │ │ │ ├─ARMCM3
│ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ └─ARMCM7_SP
│ │ │ │ ├─arm_matrix_example
│ │ │ │ │ └─RTE
│ │ │ │ │ └─Device
│ │ │ │ │ ├─ARMCM0
│ │ │ │ │ ├─ARMCM3
│ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ └─ARMCM7_SP
│ │ │ │ ├─arm_signal_converge_example
│ │ │ │ │ └─RTE
│ │ │ │ │ └─Device
│ │ │ │ │ ├─ARMCM0
│ │ │ │ │ ├─ARMCM3
│ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ └─ARMCM7_SP
│ │ │ │ ├─arm_sin_cos_example
│ │ │ │ │ └─RTE
│ │ │ │ │ └─Device
│ │ │ │ │ ├─ARMCM0
│ │ │ │ │ ├─ARMCM3
│ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ └─ARMCM7_SP
│ │ │ │ ├─arm_variance_example
│ │ │ │ │ └─RTE
│ │ │ │ │ └─Device
│ │ │ │ │ ├─ARMCM0
│ │ │ │ │ ├─ARMCM3
│ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ └─ARMCM7_SP
│ │ │ │ └─boot
│ │ │ ├─Include
│ │ │ ├─Lib
│ │ │ │ ├─ARM
│ │ │ │ ├─GCC
│ │ │ │ └─IAR
│ │ │ ├─PythonWrapper
│ │ │ │ └─cmsisdsp_pkg
│ │ │ │ └─src
│ │ │ └─Source
│ │ │ ├─BasicMathFunctions
│ │ │ ├─CommonTables
│ │ │ ├─ComplexMathFunctions
│ │ │ ├─ControllerFunctions
│ │ │ ├─FastMathFunctions
│ │ │ ├─FilteringFunctions
│ │ │ ├─MatrixFunctions
│ │ │ ├─StatisticsFunctions
│ │ │ ├─SupportFunctions
│ │ │ └─TransformFunctions
│ │ ├─Include
│ │ ├─NN
│ │ │ ├─Examples
│ │ │ │ ├─ARM
│ │ │ │ │ └─arm_nn_examples
│ │ │ │ │ ├─cifar10
│ │ │ │ │ │ └─RTE
│ │ │ │ │ │ ├─Compiler
│ │ │ │ │ │ ├─Device
│ │ │ │ │ │ │ ├─ARMCM0
│ │ │ │ │ │ │ ├─ARMCM3
│ │ │ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ │ │ └─ARMCM7_SP
│ │ │ │ │ │ ├─_ARMCM0
│ │ │ │ │ │ ├─_ARMCM3
│ │ │ │ │ │ ├─_ARMCM4_FP
│ │ │ │ │ │ └─_ARMCM7_SP
│ │ │ │ │ └─gru
│ │ │ │ │ └─RTE
│ │ │ │ │ ├─Compiler
│ │ │ │ │ ├─Device
│ │ │ │ │ │ ├─ARMCM0
│ │ │ │ │ │ ├─ARMCM3
│ │ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ │ └─ARMCM7_SP
│ │ │ │ │ ├─_ARMCM0
│ │ │ │ │ ├─_ARMCM3
│ │ │ │ │ ├─_ARMCM4_FP
│ │ │ │ │ └─_ARMCM7_SP
│ │ │ │ └─IAR
│ │ │ │ └─iar_nn_examples
│ │ │ │ ├─NN-example-cifar10
│ │ │ │ └─NN-example-gru
│ │ │ ├─Include
│ │ │ ├─NN_Lib_Tests
│ │ │ │ └─nn_test
│ │ │ │ ├─Ref_Implementations
│ │ │ │ └─RTE
│ │ │ │ ├─Device
│ │ │ │ │ ├─ARMCM0
│ │ │ │ │ ├─ARMCM3
│ │ │ │ │ ├─ARMCM4
│ │ │ │ │ ├─ARMCM4_FP
│ │ │ │ │ ├─ARMCM7_SP
│ │ │ │ │ └─STM32F411RETx
│ │ │ │ ├─_ARMCM0
│ │ │ │ ├─_ARMCM3
│ │ │ │ ├─_ARMCM4_FP
│ │ │ │ └─_ARMCM7_SP
│ │ │ └─Source
│ │ │ ├─ActivationFunctions
│ │ │ ├─ConvolutionFunctions
│ │ │ ├─FullyConnectedFunctions
│ │ │ ├─NNSupportFunctions
│ │ │ ├─PoolingFunctions
│ │ │ └─SoftmaxFunctions
│ │ ├─RTOS
│ │ │ └─Template
│ │ └─RTOS2
│ │ ├─Include
│ │ ├─Source
│ │ └─Template
│ └─STM32H7xx_HAL_Driver
│ ├─Inc
│ │ └─Legacy
│ └─Src
├─Function
└─MDK-ARM├─DebugConfig├─RTE│ └─_Test1.0.0└─Test1.0.0
假设我们需要忽略Drivers文件夹和MDK-ARM中的RTE文件夹,我们应该如何操作呢?输入:
vi .gitignore
然后输入:
Drivers/
MDK-ARM/RTE/
然后按Esc,输入:wq:
即可退出。
看一下状态:
可以看到并没有显示Drivers文件夹。
4.云端配置
4.1.Github
自行创建Github账号。
4.1.1.SSH配置
进入GitHub,创建自己的仓库:

配置如下(注意不要勾选其他内容,否则不会显示引导界面):

然后会进入一个引导界面:

打开Git Bash终端,然后先后输入:
cd
ssh-keygen -t rsa -b 4096
然后需要手动输入一个名称,这个可以直接回车让他自动生成,需要连续回车三下:
然后先后输入:
cd .ssh
ls -ltr
没有后缀的是私钥文件,谁也不要给;有后缀的是公钥文件。输入:
vi id_rsa.pub
复制内容:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDQiflzS5ow+......PRv86w== Fangzhou Tan@LAPTOP-JQFPEMOQ
回到Github,点击头像,找到Settings:

然后找到SSH配置:


名字是任意的,想是啥就是啥,不用和仓库名一样。
设置好后在引导界面复制SSH:

到本地的文件夹,打开git bash终端,然后输入(注意在输入前要关闭代理):
git clone git@github.com:LengYuuu/Hello_Github.git
需要手动输入yes,即可完成克隆。如下所示:

在文件夹中加点文件:
然后在中断中先后输入:
git add .
git commit -m "first commit"
git push
去Github刷新一下:

成功上传!
4.1.2.关联本地仓库和远程仓库
写不动了实在是,后面再补吧
4.2.Gitee
和Github几乎一样。
4.3.GitLab
私有化部署
暂时不需要私有化部署,也是先挖坑吧。
5.在VSCode中使用Git
5.1.配置Git
如果按照刚刚的步骤下载Git,但是打开VSCode,显示:

那可能是Git的环境变量没有配好。在环境变量中加入:
然后在命令行中检查一下:
重启VSCode:

如果还是没有找到Git,则点击文件 -> 首选项 -> 设置,搜索 git.path:


然后手动设置 Git 的完整路径,例如:
json
"git.path": "C:\\Program Files\\Git\\bin\\git.exe"
然后保存,重启VSCode即可。
未完待续…
先把学完的部分发出来,后面慢慢学慢慢补齐
相关文章:
【软件入门】Git快速入门
Git快速入门 文章目录 Git快速入门0.前言1.安装和配置2.新建版本库2.1.本地创建2.2.云端下载 3.版本管理3.1.添加和提交文件3.2.回退版本3.2.1.soft模式3.2.2.mixed模式3.2.3.hard模式3.2.4.使用场景 3.3.查看版本差异3.4.忽略文件 4.云端配置4.1.Github4.1.1.SSH配置4.1.2.关联…...
nextjs window is not defined
问题产生的原因 在 Next.js 中,“window is not defined” 错误通常出现在服务器端渲染(Server - Side Rendering,SSR)的代码中。这是因为window对象是浏览器环境中的全局对象,在服务器端没有window这个概念。例如&am…...
C语言实现冒泡排序:从基础到优化全解析
一、什么是冒泡排序? 冒泡排序(Bubble Sort)是一种经典的排序算法,其工作原理非常直观:通过多次比较和交换相邻元素,将较大的元素“冒泡”到数组的末尾。经过多轮迭代,整个数组会变得有序。 二…...
windows11下git与 openssl要注意的问题
看了一下自己贴文的历史,有一条重要的忘了写了。 当时帮有位同事配置gitlab,众说周知gitlab是不太好操作。 但我还是自认自己git还是相当熟的。 解决了一系列问题,如配置代理,sshkey,私有库,等等࿰…...
lua除法bug
故事背景,新来了一个数值,要改公式。神奇的一幕出现了,公式算出一个非常大的数。排查是lua有一个除法bug,1除以大数得到一个非常大的数。 function div(a, b)return tonumber(string.format("%.2f", a/b)) end print(1/73003) pri…...
Ubuntu下Docker容器java服务往mysql插入中文数据乱码
一、问题描述 1、java服务部署在ubuntu下的docker容器内,但是会出现部分插入中文数据显示乱码,如图所示: 二、解决方案 1、查看mysql是否支持utf8,登录进入Mysql 输入命令: mysql -u root -pshow variables like c…...
C语言根据字符串变量获取/设置结构体成员值
一、背景 在项目中需要根据从数据库中获取的字段与对应的键值付给对应结构体成员上,而c语言中没有类似的反射机制,所以需要实现类似功能。例,从表中查到a 10,在结构体t中,需要将 t.a 10。 二、实现 感谢ChatGPT&…...
Selenium 自动化测试demo
场景描述: 模拟用户登录页面操作,包括输入用户名、密码、验证码。验证码为算数运算,如下: 使用到的工具和依赖: 1. Selenium:pip install selenium 2. 需要安装浏览器驱动:这里使用的是Edge 3…...
LeetCode 111.二叉树的最小深度
题目: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 思路:自底向上(归)/自顶向下(递) DF…...
大工C语言作业答案
前言 这里是大连理工大学新版C语言课程MOOC作业的答案。 后期我会把全部的作业答案开源出来,希望对大家有帮助。 第九周第一题 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int B(int i) {int sum 1;while (i > 0){sum i * sum;i--;}return su…...
【Unity踩坑】Unity中父对象是非均匀缩放时出现倾斜或剪切现象
The game object is deformed when the parent object is in non-uniform scaling. 先来看一下现象 有两个Cube, Cube1(Scale2,1,1),Cube2(Scale1,1,1) 将Cube2拖拽为Cube2的子对象。并且将position设置为(-0.6,1,0&a…...
QT 跨平台实现 SSDP通信 支持多网卡
一.多网卡场景 在做SSDP通信的时候,客户端发出M-search命令后, 主机没有捕捉到SSDP的消息,你可以查看下,是不是局域网下,既打开了wifi,又连接了本地网络,mac os下很容易出现这种场景。此时,我们发送消息时,需要遍历所有网卡并发送M-search命令。 二.QT相关接口介绍 1…...
如何寻找适合的HTTP代理IP资源?
一、怎么找代理IP资源? 在选择代理IP资源的时候,很多小伙伴往往将可用率作为首要的参考指标。事实上,市面上的住宅IP或拨号VPS代理IP资源,其可用率普遍在95%以上,因此IP可用率并不是唯一的评判标准 其实更应该关注的…...
数据结构(ArrayList顺序表)
一、引言 1.什么是顺序表 定义: 顺序表是一种基于阵列实现的线性表结构,用连续的存储空间保存表中的数据元素,并按顺序排列。 底层依赖阵列,支持随机访问。元素之间没有额外的连接信息,如指针或链表节点。通过动态扩容…...
直接抄作业!Air780E模组LuatOS开发:位运算(bit)示例
在嵌入式开发中,位运算是一种高效且常用的操作技巧。本文将介绍如何使用Air780E模组和LuatOS进行位运算,并通过示例代码帮助读者快速上手。 一、位运算概述 位运算是一种在计算机系统中对二进制数位进行操作的运算。由于计算机内部数据的存储和处理都是…...
RK3588-LinuxSDK安装
安装依赖软件 执行如下命令,安装 LinuxSDK 开发包依赖软件。 备注:安装过程中,请保证 Ubuntu 可正常访问互联网,若提示"*** is already the newest version ***"表示该软件已安装,请忽略。 Host# sudo apt-get install -y git ssh make gcc libssl-dev \ liblz…...
MATLAB 中有关figure图表绘制函数设计(论文中常用)
在撰写论文时,使用 MATLAB 导出的图像常常因大小和格式不统一,导致投稿时编辑部频繁退稿,要求修改和调整。这不仅浪费时间,也增加了工作量。为了减少这些麻烦,可以在 MATLAB 中导出图像时提前设置好图表的大小、格式和…...
Unity UGUI原理剖析
UI最重要的两部分 UI是如何渲染出来的点击事件如何触发何时发生UI重绘 1:UI如何渲染出来的 UI渲染一定是有顶点的,没有顶点就没法确定贴图的采样,UGUI的顶点在一张Mesh上创建,经过渲染管线UI就渲染到屏幕上了,UI的渲染…...
Spring框架使用xml方式配置ThreadPoolTaskExecutor线程池,并且自定义线程工厂
一、自定义线程工厂 自定义线程工厂需要实现java.util.concurrent.ThreadFactory接口,重写newThread方法。 示例代码: package com.xiaobai.thread;import org.apache.log4j.Logger;import java.util.concurrent.ThreadFactory; import java.util.conc…...
架构-微服务-服务网关
文章目录 前言一、网关介绍1. 什么是API网关2. 核心功能特性3. 解决方案 二、Gateway简介三、Gateway快速入门1. 基础版2. 增强版3. 简写版 四、Gateway核心架构1. 基本概念2. 执行流程 五、Gateway断言1. 内置路由断言工厂2. 自定义路由断言工厂 六、过滤器1. 基本概念2. 局部…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
