Git详解及 github使用
1.1 关于版本控制
开始之前先看一个没有版本控制的例子

1.1.1 本地版本控制
本地版本控制系统 许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的 好处就是简单,但是特别容易犯错。有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。
1.1.2 集中化的版本控制系统
如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。这类系统,诸如 CVS、Subversion 以及Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。

1.1.3 分布式版本控制系统
在这类系统中,像Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

1.2 Git简介

官网:Git
git是一个分布式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。
Git 官方中文手册 Git - Book
1.2.1 Git历史
自2002年开始,林纳斯·托瓦兹决定使用BitKeeper作为Linux内核主要的版本控制系统用以维护代码。因为BitKeeper为专有软件,这个决定在社区中长期遭受质疑。在Linux社区中,特别是理查德·斯托曼与自由软件基金会的成员,主张应该使用开放源代码的软件来作为Linux核心的版本控制系统。林纳斯·托瓦兹曾考虑过采用现成软件作为版本控制系统(例如Monotone),但这些软件都存在一些问题,特别是性能不佳。现成的方案,如CVS的架构,受到林纳斯·托瓦兹的批评。
2005年,安德鲁·垂鸠写了一个简单程序,可以连接BitKeeper的存储库,BitKeeper著作权拥有者拉里·麦沃伊认为安德鲁·垂鸠对BitKeeper内部使用的协议进行逆向工程,决定收回无偿使用BitKeeper的授权。Linux内核开发团队与BitMover公司进行蹉商,但无法解决他们之间的歧见。林纳斯·托瓦兹决定自行开发版本控制系统替代BitKeeper,以十天的时间,编写出第一个git版本
1.3 安装git
1.3.1 环境说明
[root@git ~]# rpm -qa centos-release
centos-release-7-4.1708.el7.centos.x86_64
[root@git ~]# uname -a
Linux gitlab 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@git ~]# getenforce
Disabled
[root@git ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (dead)Docs: man:firewalld(1)
本文使用的linux系统均为该系统
本文使用的windows系统为 Microsoft Windows [版本 10.0.15063]
1.3.2 Yum安装Git
centos 自带git
[root@git ~]# rpm -qa git
git-1.8.3.1-11.el7.x86_64
安装方法
[root@git ~]# yum install git -y
1.3.3 编译安装
编译安装可以安装较新版本的git
Git下载地址: https://github.com/git/git/releases
# 安装依赖关系
[root@git ~]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel autoconf gcc perl-ExtUtils-MakeMaker
# 编译安装
[root@git ~]# tar -zxf git-2.0.0.tar.gz
[root@git ~]# cd git-2.0.0
[root@git ~]# ./configure --prefix=/usr/local/git # 没有文件可以略过
[root@git ~]# make
[root@git ~]# make install
1.4 初次运行 Git 前的配置
1.4.1 配置git
命令集
git config --global user.name "username" #配置git使用用户
git config --global user.email "email@mail.com" #配置git使用邮箱
git config --global color.ui true #语法高亮
git config --list # 查看全局配置
配置过程
[root@gitlab ~]# git config --global user.name "newrain" #配置git使用用户
[root@gitlab ~]# git config --global user.email "newrain@aliyun.com" #配置git使用邮箱
[root@gitlab ~]# git config --global color.ui true #语法高亮
[root@gitlab ~]# git config --list # 查看全局配置
user.name=newrain
user.mail=newrain@aliyun.com
color.ui=true
生成的配置文件
[root@gitlab ~]# cd
[root@gitlab ~]# cat .gitconfig
[user]name = newrainemail = newrain@aliyun.com
[color]ui = true
1.4.2 获取帮助
使用Git时需要获取帮助,有三种方法可以找到Git命令的使用手册:
git help <verb>
git <verb> --help
man git-<verb>
例如,要想获得配置命令的手册,执行
git help config
1.5 获取 Git 仓库(初始化仓库)
1.5.1 创建裸库
[root@gitlab ~]# useradd git
[root@gitlab ~]# passwd git
[root@gitlab ~]# mkdir /git-root/
[root@gitlab ~]# cd /git-root/
[root@gitlab git-root]# git init --bare shell.git
Initialized empty Git repository in /git-root/shell.git/
[root@gitlab git-root]# chown -R git:git shell.git
1.5.2 创建本地库
[root@gitlab opt]# ssh-keygen
[root@gitlab opt]# ssh-copy-id git@192.168.249.156
[root@gitlab opt]# git clone git@192.168.249.156:/git-root/shell.git
[root@gitlab opt]# ls
rh shell
[root@gitlab opt]# cd shell/
[root@gitlab shell]# vim test1.sh
[root@gitlab shell]# git add test1.sh
[root@gitlab shell]# git commit -m 'first commit'
[master (root-commit) 33c5fbf] first commit1 file changed, 2 insertions(+)create mode 100644 test1.sh
[root@gitlab shell]# git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 230 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.1.102:/git-root/shell.git* [new branch] master -> master
[root@gitlab shell]#
# git cat
1.6 Git命令常规操作
常用命令说明
| 命令 | 命令说明 |
|---|---|
| #add | 添加文件内容至索引 |
| bisect | 通过二分查找定位引入 bug 的变更 |
| #branch | 列出、创建或删除分支 |
| #checkout | 检出一个分支或路径到工作区 |
| #clone | 克隆一个版本库到一个新目录 |
| #commit | 记录变更到版本库 |
| #diff | 显示提交之间、提交和工作区之间等的差异 |
| fetch | 从另外一个版本库下载对象和引用 |
| grep | 输出和模式匹配的行 |
| #init | 创建一个空的 |
| #log | 显示提交日志 |
| #merge | 合并两个或更多开发历史 |
| #mv | 移动或重命名一个文件、目录或符号链接 |
| #pull | 获取并合并另外的版本库或一个本地分支 |
| #push | 更新远程引用和相关的对象 |
| rebase | 本地提交转移至更新后的上游分支中 |
| #reset | 重置当前HEAD到指定状态 |
| #rm | 从工作区和索引中删除文件 |
| show | 显示各种类型的对象 |
| #status | 显示工作区状态 |
| #tag | 创建、列出、删除或校验一个GPG签名的 tag 对象 |
常用操作示意图

文件的状态变化周期

1.6.1 创建文件
[root@gitlab git_data]# touch README
[root@gitlab git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# README
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
---
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# README
nothing added to commit but untracked files present (use "git add" to track)
添加文件跟踪
[root@gitlab git_data]# git add ./*
[root@gitlab git_data]# git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
# (使用 "git rm --cached <file>..." 撤出暂存区)
#
# 新文件: README
#
---
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: README
#
文件会添加到.git的隐藏目录
[root@gitlab git_data]# tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── objects
│ ├── e6
│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ ├── info
│ └── pack
└── refs├── heads└── tags
由工作区提交到本地仓库
[root@gitlab git_data]# git commit -m 'first commit'
[master(根提交) bb963eb] first commit1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 README
查看git的状态
[root@gitlab git_data]# git status
# 位于分支 master
无文件要提交,干净的工作区
# On branch master
nothing to commit, working directory clean
提交后的git目录状态
[root@gitlab git_data]# tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ └── master
├── objects
│ ├── 54
│ │ └── 3b9bebdc6bd5c4b22136034a95dd097a57d3dd
│ ├── bb
│ │ └── 963eb32ad93a72d9ce93e4bb55105087f1227d
│ ├── e6
│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ ├── info
│ └── pack
└── refs├── heads│ └── master└── tags
1.6.2 添加新文件
git add * 添加到暂存区域 git commit 提交git仓库 -m 后面接上注释信息,内容关于本次提交的说明,方便自己或他人查看修改或删除原有文件
常规方法
git add * git commit简便方法
git commit -a -m "注释信息"-a 表示直接提交
Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected.
1.6.3 删除git内的文件
命令说明:
• 没有添加到暂存区的数据直接rm删除即可。
• 已经添加到暂存区数据:
git rm --cached database
#→将文件从git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)
git rm -f database
#→将文件数据从git暂存区和工作目录一起删除
命令实践:
# 创建新文件
[root@gitlab git_data]# touch 123
[root@gitlab git_data]# git status
# 位于分支 master
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# 123
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
---
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# 123
nothing added to commit but untracked files present (use "git add" to track)
# 将文件添加到暂存区域
[root@gitlab git_data]# git add 123
[root@gitlab git_data]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 新文件: 123
---
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: 123
# 删除文件
[root@gitlab git_data]# rm 123 -f
[root@gitlab git_data]# ls
README
[root@gitlab git_data]# git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 新文件: 123
#
# 尚未暂存以备提交的变更:
# (使用 "git add/rm <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 删除: 123
#
---
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: 123
#
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: 123
[root@gitlab git_data]# git reset HEAD ./*
[root@gitlab git_data]# git status
# 位于分支 master
无文件要提交,干净的工作区
---
# On branch master
nothing to commit, working directory clean
1.6.4 重命名暂存区数据
• 没有添加到暂存区的数据直接mv/rename改名即可。
• 已经添加到暂存区数据:
git mv README NOTICE
[root@gitlab git_data]# git mv README notice
[root@gitlab git_data]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: README -> notice
#
1.6.5 查看历史记录
• git log #→查看提交历史记录
• git log -2 #→查看最近几条记录
• git log -p -1 #→-p显示每次提交的内容差异,例如仅查看最近一次差异
• git log --stat -2 #→--stat简要显示数据增改行数,这样能够看到提交中修改过的内容,对文件添加或移动的行数,并在最后列出所有增减行的概要信息
• git log --pretty=oneline #→--pretty根据不同的格式展示提交的历史信息
• git log --pretty=fuller -2 #→以更详细的模式输出提交的历史记录
• git log --pretty=fomat:"%h %cn" #→查看当前所有提交记录的简短SHA-1哈希字串与提交着的姓名。
使用format参数来指定具体的输出格式
| 格式 | 说明 |
|---|---|
| %s | 提交说明。 |
| %cd | 提交日期。 |
| %an | 作者的名字。 |
| %cn | 提交者的姓名。 |
| %ce | 提交者的电子邮件。 |
| %H | 提交对象的完整SHA-1哈希字串。 |
| %h | 提交对象的简短SHA-1哈希字串。 |
| %T | 树对象的完整SHA-1哈希字串。 |
| %t | 树对象的简短SHA-1哈希字串。 |
| %P | 父对象的完整SHA-1哈希字串。 |
| %p | 父对象的简短SHA-1哈希字串。 |
| %ad | 作者的修订时间。 |
命令实践
[root@gitlab git_data]# git log
commit f5b79552635a7dc60afc35c99c1170366d8c5f6b
Author: newrain <newrain@aliyun.com>
Date: Sat May 11 21:29:21 2019 -0700
456
commit e9ed8b38a0052cdcd85ecee833ea8198b077f881
Author: newrain <root@vmdesk.localdomain>
Date: Sat May 11 21:21:12 2019 -0700
commit 123
commit 9d394114177b8da9e452d001ec610e9c45ceede3
Author: newrain <root@vmdesk.localdomain>
Date: Sat May 11 20:19:23 2019 -0700
first commit
1.6.6 还原历史数据
Git服务程序中有一个叫做HEAD的版本指针,当用户申请还原数据时,其实就是将HEAD指针指向到某个特定的提交版本,但是因为Git是分布式版本控制系统,为了避免历史记录冲突,故使用了SHA-1计算出十六进制的哈希字串来区分每个提交版本,另外默认的HEAD版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫HEAD^,上上一个版本则会叫做HEAD^^,当然一般会用HEAD~5来表示往上数第五个提交版本。
git reset --hard hash
git reset --hard HEAD^ #→还原历史提交版本上一次
git reset --hard 3de15d4 #→找到历史还原点的SHA-1值后,就可以还原(值不写全,系统
会自动匹配)
测试命令
[root@gitlab git_data]# git log
commit f5b79552635a7dc60afc35c99c1170366d8c5f6b
Author: newrain <newrain@aliyun.com>
Date: Sat May 11 21:29:21 2019 -0700
456
commit e9ed8b38a0052cdcd85ecee833ea8198b077f881
Author: newrain <root@vmdesk.localdomain>
Date: Sat May 11 21:21:12 2019 -0700
commit 123
commit 9d394114177b8da9e452d001ec610e9c45ceede3
Author: newrain <root@vmdesk.localdomain>
Date: Sat May 11 20:19:23 2019 -0700
first commit
还原数据
[root@gitlab git_data]# git reset --hard e9ed8b38a
HEAD is now at e9ed8b3 commit 123
HEAD 现在位于 e9ed8b3 commit 123
# 查看数据
[root@gitlab git_data]# ls
123 README
1.6.7 还原未来数据
什么是未来数据?就是你还原到历史数据了,但是你后悔了,想撤销更改,但是git log已经找不到这个版本了。
git reflog #→查看未来历史更新点
测试命令
[root@gitlab git_data]# git reflog
e9ed8b3 HEAD@{0}: reset: moving to e9ed8b38a
f5b7955 HEAD@{1}: commit: 456
e9ed8b3 HEAD@{2}: commit: commit 123
9d39411 HEAD@{3}: commit (initial): first commit
[root@gitlab git_data]#
1.6.8 标签使用
前面回滚使用的是一串字符串,又长又难记。
git tag v1.0 #→当前提交内容打一个标签(方便快速回滚),每次提交都可以打个tag。
git tag #→查看当前所有的标签
git show v1.0 #→查看当前1.0版本的详细信息
git tag v1.2 -m "version 1.2 release is test" #→创建带有说明的标签,-a指定标签名字,-m指定说明文字
git tag -d v1.0 #→我们为同一个提交版本设置了两次标签,删除之前的v1.0
测试命令
[root@gitlab git_data]# git reset --hard e9ed8b38a
HEAD is now at e9ed8b3 commit 123
[root@gitlab git_data]# git reset --hard V1.0
HEAD is now at e9ed8b3 add test dir
[root@gitlab git_data]# git tag v20171129
[root@gitlab git_data]# git tag
v20171129
1.6.9 对比数据
git diff可以对比当前文件与仓库已保存文件的区别,知道了对README作了什么修改
后,再把它提交到仓库就放⼼多了。
git diff README
git diff --name-only HEAD HEAD^
git diff --name-only head_id head_id2
1.7 分支结构
在实际的项目开发中,尽量保证master分支稳定,仅用于发布新版本,平时不要随便直接修改里面的数据文件。
那在哪干活呢?干活都在dev分支上。每个人从dev分支创建自己个人分支,开发完合并到dev分支,最后dev分支合并到master分支。所以团队的合作分支看起来会像下图那样。

1.7.1 分支切换
[root@gitlab git_data]# git branch newrain
[root@gitlab git_data]# git branch
* masternewrain
[root@gitlab git_data]# git checkout newrain
切换到分支 'newrain'
Switched to branch 'newrain'
[root@gitlab git_data]# git branch master
* newrain
在newrain 分支进行修改
[root@gitlab git_data]# cat README
This is git_data readme
[root@gitlab git_data]# echo '1901' >> README
[root@gitlab git_data]# git add .
[root@gitlab git_data]# git commit -m '1901'
[newrain 4310e7e] 19011 file changed, 1 insertion(+)
[root@gitlab git_data]# git status
# On branch newrain
nothing to commit, working directory clean
---
# 位于分支 newrain
无文件要提交,干净的工作区
回到master分支
[root@gitlab git_data]# git checkout master
Switched to branch 'master'
切换到分支 'master'
[root@gitlab git_data]# cat README
This is git_data readme
[root@gitlab git_data]# git log -1
commit f5b79552635a7dc60afc35c99c1170366d8c5f6b
Author: newrain <newrain@aliyun.com>
Date: Sat May 11 21:29:21 2019 -0700
456
合并代码
[root@gitlab git_data]# git merge newrain
Updating f5b7955..4310e7e
Fast-forwardREADME | 1 +1 file changed, 1 insertion(+)
[root@gitlab git_data]# git status
# On branch master
nothing to commit, working directory clean
# 位于分支 master
无文件要提交,干净的工作区
[root@gitlab git_data]# cat README
This is git_data readme
1901
1.7.2 合并失败解决
模拟冲突,在文件的同一行做不同修改
在master 分支进行修改
[
root@gitlab git_data]# cat README
This is git_data readme
1901
[root@gitlab git_data]# echo '1901-git' > README
[root@gitlab git_data]# git commit -m 'newrain 1901-git'
[master 4e6c548] newrain 1901-git1 file changed, 1 insertion(+), 2 deletions(-)
切换到newrain分支
[root@gitlab git_data]# git checkout newrain
Switched to branch 'newrain'
[root@gitlab git_data]# cat README
This is git_data readme
1901
[root@gitlab git_data]# echo 'newrain' >> README
[root@gitlab git_data]# git commit -m '1901-git-check'
# On branch newrain
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: README
#
no changes added to commit (use "git add" and/or "git commit -a")
回到master分区,进行合并,出现冲突
[root@gitlab git_data]# git checkout master
切换到分支 'master'
[root@gitlab git_data]# git merge linux
自动合并 README
冲突(内容):合并冲突于 README
自动合并失败,修正冲突然后提交修正的结果。
解决冲突
[root@gitlab git_data]# vim README
This is git_data readme
1901
newrain
meger test ti
meger test master
# 手工解决冲突
[root@gitlab git_data]# git commit -a -m "merge-ti-test"
[master 2594b2380] merge-ti-test
1.7.3 删除分支
因为之前已经合并了newrain分支,所以现在看到它在列表中。 在这个列表中分支名字前没有 * 号的分支通常可以使用 git branch -d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。
查看所有包含未合并工作的分支,可以运行 git branch --no-merged:
git branch --no-mergedtesting
这里显示了其他分支。 因为它包含了还未合并的工作,尝试使用 git branch -d 命令删除它时会失败:
git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.
如果真的想要删除分支并丢掉那些工作,如同帮助信息里所指出的,可以使用 -D 选项强制删除它。
相关文章:
Git详解及 github使用
1.1 关于版本控制 开始之前先看一个没有版本控制的例子 1.1.1 本地版本控制 本地版本控制系统 许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的 好处就是简单,但是特别容易犯错。有时候会混淆所在…...
iOS源码-工程目录讲解
1、 工程目录 1.1、xib 主要的界面渲染控制,ios开发常用的界面,可以在这里快速开发出来 1.2、base 基本的类,子类继承base类,就具备父类的方法,无需在重写 1.3、util 基础的类一些,处理时间等 1.4、…...
ESP32 Arduino实战协议篇-搭建独立的 Web 服务器
在此项目中,您将创建一个带有 ESP32 的独立 Web 服务器,该服务器使用 Arduino IDE 编程环境控制输出(两个 LED)。Web 服务器是移动响应的,可以使用本地网络上的任何浏览器设备进行访问。我们将向您展示如何创建 Web 服务器以及代码如何逐步工作。 项目概况 在直接进入项目…...
多维时序 | MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多变量时间序列预测
多维时序 | MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-BiLSTM-Attention粒子群优化双向长短期记忆神经网络融合注意力机制的多变量时间序列预测预测效果基本介绍模型描述程序设计参考…...
【开源】基于Vue.js的在线课程教学系统的设计和实现
项目编号: S 014 ,文末获取源码。 \color{red}{项目编号:S014,文末获取源码。} 项目编号:S014,文末获取源码。 目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2…...
CentOS 安装etcd集群 —— 筑梦之路
环境说明 192.168.1.11 192.168.1.12 192.168.1.13 yum在线安装 yum install etcd -y #etcd01 cat > /etc/etcd/etcd.conf <<EOF ETCD_NAMEetcd01 ETCD_LISTEN_PEER_URLS"http://0.0.0.0:2380" ETCD_LISTEN_CLIENT_URLS"http://0.0.0.0:2379&quo…...
mysql 实现去重
个人网站 首发于公众号小肖学数据分析 1、试题描述 数据表user_test如下,请你查询所有投递用户user_id并且进行去重展示,查询结果和返回顺序如下 查询结果和返回顺序如下所示 解题思路: (1) 对user_id列直接去重: ÿ…...
类模板成员函数类外实现
#include<iostream> #include<string> using namespace std;//类模板成员函数类外实现 template<class T1,class T2> class Person { public:Person(T1 name,T2 age); // { // this->m_namename; // this->m_ageage; // }void showPerson(); // { /…...
多svn仓库一键更新脚本分享
之前分享过多git仓库一键更新脚本,本期就分享下svn仓库的一键更新脚本 1、首先需要设置svn为可执行命令行 打开SVN安装程序,选择modify,然后点击 command client tools,安装命令行工具 2、update脚本 echo 开始更新SVN目录&…...
C语言程序设计(入门)
考虑到期末临近,大一的学生该考c语言程序设计了吧,整一小篇给爱摆烂的小萌新复习一下降低挂科的风险 1. 1.1 main 函数 int main() {// 程序的入口,执行从这里开始return 0; // 表示程序正常结束 }1.2 语句和分号 C语言中的语句以分号结束…...
短视频账号矩阵系统源码
短视频账号矩阵系统源码搭建步骤包括以下几个方面: 1. 确定账号类型和目标受众:确定要运营的短视频账号类型,如搞笑、美食、美妆等,并明确目标受众和定位。 2. 准备账号资料:准备相关资质和资料,如营业执照…...
基于SSM的在线投稿系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...
PWM实验
PWM相关概念 PWM:脉冲宽度调制定时器 脉冲:方波信号,高低电平变化产生方波 周期:高低电平变化所需要时间 频率:1s钟可以产生方波个数 占空比:在一个方波内,高电平占用的百分比 宽度调制:占…...
Python武器库开发-flask篇之session与cookie(二十六)
flask篇之session与cookie(二十六) 在 Flask 中,可以使用 session 来在不同请求之间存储和传递数据。Session 在客户端和服务器端之间交换,但是数据存储在服务器端。 Session 与 Cookie 的区别 session 和 cookie 都可以用来在不同请求之间存储和传递…...
深度学习YOLO安检管制物品识别与检测 - python opencv 计算机竞赛
文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov55 模型训练6 实现效果7 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习YOLO安检管制误判识别与检测 ** 该项目较为新颖,适合作为竞赛课题方向&…...
vite+react+typescript 遇到的问题
1.找不到模块“vite”。你的意思是要将 “moduleResolution” 选项设置为 “node”,还是要将别名添加到 “paths” 选项中 tsconfig.json 中 compilerOptions:{“moduleResolution”: node} 2.未知的编译器选项“allowImportingTsExtensions” 该选项用于控制是否…...
数据结构及八种常用数据结构简介
data-structure 数据结构是一种存在某种关系的元素的集合。“数据” 是指元素;“结构” 是指元素之间存在的关系,分为 “逻辑结构” 和 “物理结构(又称存储结构)”。 常用的数据结构有 数组(array)、栈&…...
阿里云配置ssl(Apache)
阿里云申请证书,有个专门的免费的申请方式与普通证书是平级的功能; 访问服务器,判断apache是不是开启ssl功能,如果没有安装就安装它 [rootcentos ~]# rpm -qa | grep mod_ssl //什么没显示说明没装 yum install mod_ssl openssl …...
阿里云linux升级新版本npm、nodejs
在阿里云服务器上编译部署NextJS工程发现 alibaba linux默认yum install npm安装的版本太低, 使用以下方式升级node、npm新版本。 1、卸载现有版本 yum remove nodejs npm -y2、安装新版本 sudo yum install https://rpm.nodesource.com/pub_21.x/nodistro/repo/nodesource-…...
如何在el-tree懒加载并且包含下级的情况下进行数据回显-02
上一篇文章如何在el-tree懒加载并且包含下级的情况下进行数据回显-01对于el-tree懒加载,包含下级的情况下,对于回显提出两种方案,第一种方案有一些难题无法解决,我们重点来说说第二种方案。 第二种方案是使用这个变量对其是否全选…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
