Linux 学习笔记
1. 常用命令
1.1 文件管理
CTRL+C: 取消命令,并且换行CTRL+U: 清空本行命令TAB: 补全命令和文件目录,快速双击,显示备选选项ls: 列出当前目录下所有文件及目录pwd: 显示当前完整路径cd XXX: 进入XXX目录,cd ..进入上一层目录cp A B: 将文件A复制成B,A和B可以是路径mkdir X: 创建目录Xrm XXX: 删除普通文件,rm -r XXX删除文件夹mv A B: 将文件A移动到B,可用于重命名touch: 创建文件cat XXX: 显示文件XXX中的内容
文件权限
chmodchmod +x xxx添加执行权限chmod -x xxx去除执行权限chmod 777 xxx设置 777 权限chmod 777 xxx -R给目录设置权限
1.2 系统状况
top查看所有进程信息,(Linux 系统的任务管理器)- 打开后,输入
M:按使用内存排序(M = memory),大写 - 打开后,输入
P:按使用 CPU 排序(P = process) - 打开后,输入
m:切换内存占用展示模式 - 打开后,输入
q:退出
- 打开后,输入
df -h查看硬盘使用情况free -h查看内存使用情况du -sh查看当前目录占用硬盘空间ps aux查看所有进程kill -9 pid杀死进程编号为pid的进程,(结束运行)netstat -nt查看所有网络连接w列出当前登录用户ping www.baidu.comping 测试
1.3 文件检索
find /path/to/directory/ -name '*.py'搜索某个路径下的所有 python 文件grep xxx从stdin中读入若干行数据,如果某行包含xxx输出该行wc统计行数、单词数、字节数- 既可以从
stdin中读入数据,也可以在命令行参数中传入文件名列表 wc -l -w -c分别是统计行数(line)、单词数(word)、字节数(char)
- 既可以从
tree展示当前目录结构tree /path/to/directory/tree -a展示隐藏文件
ag xxx搜索当前目录下所有文件,检索xxx字符串,需要安装silversearcher-agcut分割一行内容从
stdin中读入多行数据echo $PATH | cut -d ':' -f 3,5输出PATH中用:分割的字符串的第三个和第五个,仍然保留:间隔,相当于:1
2
3
4
5
6
7// javascript
const str = 'aaa:bbb:ccc:ddd:eee';
const arr = str.split(':'); // 分割成数组
const l = 3;
const r = 5;
const res1 = arr[l - 1] + ':' + arr[r - 1];
console.log(res1); // ccc:dddecho $PATH | cut -d ':' -f 3-5输出PATH中用:分割的字符串的第三个到第五个,仍然保留:间隔,相当于:1
2
3
4
5
6
7
8
9
10
11
12
13const str = 'aaa:bbb:ccc:ddd:eee';
const arr = str.split(':');
const l = 3;
const r = 5;
res2 = '';
for (let i = l - 1; i < r; i++) {
if (i === r - 1) {
res2 += arr[i];
} else {
res2 += arr[i] + ':';
}
}
console.log(res2); // ccc:ddd:eeeecho $PATH | cut -c 3,5输出$PATH的第三个和第五个字符,-c(char)echo $PATH | cut -c 3-5输出$PATH的第三个到第五个字符,相当于:1
2
3
4
5const str = 'aaa:bbb:ccc:ddd:eee';
const l = 3;
const r = 5;
// string.slice 方法,截取下标 l-1 至 r,但不包含 r
console.log(str.slice(l - 1, r));
sort将每行内容按字典序排列- 可以从
stdin中读取多行数据 - 可以从命令行参数中读取文件名列表
- 可以从
xargs将stdin中的数据用空格或者回车分割成命令行参数,可以用于删除文件1
2
3
4
5find test/ -name '*.js' | xargs cat | wc -l # 查找 test/ 目录下的 js 文件,统计代码行数
这里代码行数会比真实行数少一行
删除全部 js 文件
find test/ -name '*.js' | xargs rm
1.4 查看文件内容
more浏览文件内容- 回车:下一行
- 空格 |
KeyDown:下一页 b上一页q退出
less与more类似,功能更全面- 回车:下一行
y上一行Page Down下一页Page Up上一页q退出
head -3 XX展示 XX 的前三行内容支持从
stdin读入内容tail -3 XX展示 XX 末尾三行内容支持从
stdin读入内容
1.5 工具
md5sum计算md5哈希值- 可以从
stdin读入内容 - 可以从命令行参数传入文件名列表
- 可以从
time command统计command命令执行时间ipython3交互式python3环境,可以当做计算器,或者批量管理文件watch -n 0.1 command每0.1秒执行一次command命令tar解压缩文件-c创建压缩文件(create)-x解压(extract)-f指定归档(需要被压缩)的文件名,一般是命令最后的文件名-v显示操作过程(verbose)-t查看(list)压缩文件的内容而不解压-z使用gzip压缩或者解压缩.tar.gz文件-j使用bzip2压缩或者解压缩.tar.bz2文件-J使用xz压缩或者解压.tar.xz文件,==高压缩率==-C指定解压的目录--exclude在归档时拍出某个目录或者文件
常用组合
创建
.tar.gz压缩文件1
tar -czvf archive.tar.gz /path/to/directory
解压
.tar.xz文件到指定目录1
tar -xJvf archive.tar.xz -C /path/to/destination
仅查看
.tar文件内容1
tar -tf archive.tar
diff XX YY查看文件XX和YY的不同点
1.6 管道 |
简单来说管道就是重定向,可以将前一个命令的 stdout 重定向到下一个命令的 stdin 。
注意事项
- 管道命令只对
stdout处理,不处理stderr - 管道右边命令必须接受
stdin - 多个管道可以串联
与文件重定向的区别
- 文件重定向:左边是命令,右边是文件
- 管道:左右两边都是命令,左边开启了
stdout,右边开启了stdin
示例
统计当前目录下所有 js 文件中行内包含字符串 const 的行数
1 | 合并 xargs grep,但是 xargs 必须在 grep 左边 |
2. Vim 使用
2.1 三种模式
2.1.1 一般命令模式
默认模式,按 ESC 键进入一般命令模式,命令输入方式:按不同字符即可进行不同操作,可以复制、粘贴、删除等。
2.1.2 编辑模式
在一般命令模式下按 I 键进入编辑模式。
2.1.3 命令行模式
在一般命令模式下按 : 、/ 、? 三个按键中任意一个进入命令行模式,可以进行查找、替换、保存、退出、配置编辑器等。
2.2 操作
2.2.1 一般命令模式
0或者HOME键,光标移动到当前行的第一个字符前$或者END键,光标移动到当前行的最后一个字符前n<SPACE>输入数字加空格,光标将右移到光标当前位置的第 n 个字符后n<>ENTER输入数字加回车,光标将下移到光标当前行以下第 n 行第一个非空?字符前G键,光标移动到最后一行,区分大小写nG键,光标移动到第 n 行,区分大小写gg相当于1G,光标移动到第一行n键,用于命令行模式的查询,查询后按下N键重复上一次查询,区分大小写N键,用于命令行模式的查询,查询后按下N键反向重复上一次查询,区分大小写v键,选中文本,结合方向键及其他上述切换光标位置命令使用d键,删除选中的文本,删除时会自动复制删除的内容dd键,删除当前行,复制同上y键,复制选中的文本yy键,复制当前行p键,将复制的数据在光标的下一行或下一个位置粘贴u键,撤销CTRL + R,取消撤销,无懈可击>键,将选中的文本整体向右缩进一次<键,向左缩进gg=G,四个字符均需要输入,全文代码格式化CTRL + Q, 取消正在执行的命令
2.2.2 命令行模式
:n,冒号+数字,同nG,将光标移动到第 n 行/word,向光标以下查找第一个word?word,向光标以上查找第一个word:n1,n2s/word1/word2/g,在第 n1 行与 n2 行之间寻找word1并替换为word2:1,$s/word1/word2/g,将全文的word1替换为word2:1,$s/word1/word2/gc,将全文的word1替换为word2,但替换前需要手动确认:w保存w!强制保存:q退出,常用:q!强制退出,常用:wq保存并退出,常用:set paste设置成粘贴模式,取消代码自动缩进:set nopaste取消粘贴模式,开启代码自动缩进:set nu显示行号:set nonu隐藏行号noh关闭查找关键词高亮
3 Shell 语法
3.1 概述
Linux 中常见的 Shell 脚本有很多种,包括:
- Bourne Shell
/usr/bin/sh或者/bin/sh - Boume Again Shell
/bin/bash - zsh
- ······
文件头部写明 #! /bin/bash 指定运行使用的解释器
执行方式:
- 赋予执行权限:
chmod +x test.sh - 相对路径运行
./test.sh - 绝对路径运行
/root/test.sh - 家目录运行
~/test.sh - 解释器运行
bash ./test.sh
3.2 变量
3.2.1 注释
注释分为单行注释(行尾注释),多行注释
单行注释
1 | 单行注释 |
多行注释,其中 EOF 可以成对用其他字符串替换
1 | :<<EOF # 冒号也可有可无 |
3.2.2 变量
定义变量
定义变量不需要向 PHP 脚本一样使用 $ 符,注意等号两边不要有空格
变量名限制为常规限制(不能数字开头,不能是保留字等等)
1 | name='applepine' |
使用变量
使用变量要用 $ 符,但最好包裹 {} ,识别变量边界
1 | name='applepine' |
只读变量
使用 readonly 或者 declare 可以将变量设置只读属性
1 | name='applepine' |
删除变量
使用 unset 删除变量
1 | name='applepine' |
变量类型
自定义变量(局部变量):子进程无法访问
环境变量(全局变量):子进程可以访问
自定义变量改成环境变量:
1 | name='applepine' |
环境变量改成自定义变量:
1 | export name |
字符串
字符串可以不用引号,可以用单引号也可以用双引号
单引号的内容不做解析,双引号会解析内部变量
1 | name=applepine |
获取字符串长度 #
1 | name=applepine |
截取字符串
1 | name=applepine |
文件参数变量
执行 shell 脚本时可以向脚本传递参数供脚本使用,$1 是第一个参数,$2 是第二个参数,依次类推。
$0 是执行脚本的文件路径,例如 ./test.sh /root/test.sh
1 | ! /bin/bash |
相关参数
$#参数个数,不算文件路径,只算传参个数$*用空格将各个参数分隔的字符串$@用双引号括起来的各个参数字符串$$脚本当前运行的进程 ID$?上一条命令的退出状态,0 为正常退出- $(command) 返回
command这条命令的stdout,可以嵌套 - `command` 返回
command这条命令的stdout,不可嵌套
3.3 数组
3.3.1 数组基础
只支持一维数组,初始化不需要指明大小
定义数组
1 | array=(1 "def" applepine false) # 用小括号 空格分开 |
读取数组
1 | 读取整个数组 三种均可以 |
数组长度
1 | echo ${#array[@]} |
3.4 基础命令
3.4.1 expr
expr 用于求表达式的值,expr 表达式
字符串表达式
length STRING返回STRING长度index STRING CHARSET返回字符串CHARSET中任意一个字符在STRING中首次出现的位置,下标从 1 开始,不存在返回 0substr STRING POSITION LENGTH返回STRING字符串中从POSITION开始,长度最大为LENGTH的子串,如果POSITIONLENGTH不是正整数或者不是数值将返回空字符串
1 | str="Hello World" |
整数表达式
expr 支持基础算术表达式。过时了,现代 Shell 用 $(())
+-*/%乘法*需要使用转义,或者单引号()**幂
1 | a=3 |
逻辑关系表达式
|如果第一个参数非空且非 0,则返回第二个参数,否则返回第二个参数,但需要非空且非 0,否则返回 0,如果第一个参数非空且非 0,则不会计算第二个表达式
&如果两个参数都非空且非 0,则返回第一个参数,否则返回 0,如果第一个参数为 0 或 空,则不会计算第二个表达式
< <= == != >= >比较两端的参数,如果为 true 则返回 1,否则返回 0。
expr首先尝试将两端参数转化为整数,并做算术比较,如果转化失败,按照字符集排列顺序比较()可以改变优先级,需要反斜杠转义,或者使用单引号
1 | a=3 |
3.4.2 read
read 命令从标准输入中读取单行数据,当读到文件结束符时,exit code 为 1,否则为 0.
参数:
-p后面接提示信息,部分shell不支持,比如zsh-t后面接秒数,等待时间
1 | root@applepine-work:~# read -p "输入用户名" -t 30 name |
3.4.3 echo
echo 用于输出字符串,echo STRING
显示普通字符串
1 | echo "Hello World" |
显示转义字符
1 | echo "\"Hello World\"" # "Hello World" |
显示变量
1 | name=zhangsan |
显示换行
1 | echo "Hi\nMike" |
显示不换行 , 取消 echo 默认换行
1 | echo -e "Hello \c" # 最好开启转义,否则不同 shell 效果不一 |
显示原样字符串,不解释变量和转义,单引号
1 | a=World |
显示命令执行的结果
1 | echo `date` # Fri Oct 25 02:13:10 PM CST 2024 |
3.4.4 printf
默认不会在字符串末尾加换行符 printf format-string [arguments]
1 | printf "%10d.\n" 123 # 10 位 右对齐 |
1 | 123. |
3.4.5 test 命令与判断符号[]
逻辑运算符 && 和 ||
&&表示与,||表示或二者具有短路原则:
expr1 && expr2当expr1为假时直接忽略expr2expr1 || expr2当expr1为真时直接忽略expr2表达式的
exit code为 0, 表示真,为非 0, 表示假
test 命令
1 | ➜ ~ ls |
文件类型判断
test -e filename判断文件是否存在-e文件是否存在-f是否是文件-d是否是目录
文件权限判断
test -r filename判断是否可读-r是否可读-w是否可写-x是否可执行-s是否为非空
整数间比较
test ${a} -eq ${b}判断 a 是否等于 b-eqa == b-nea != b-gta > b-lta < b-gea >= b-lea<= b
字符串比较
test -z STRING判断是否为空,为空返回 truetest -n STRING是否非空test str1 == str2是否相同test str1 != str2是否不同
多重条件判定
test -r filename -a -x filename-a两条件是否同时成立-o是否至少一个成立!取反,如test ! -x test.sh不可执行时返回 true
判断符号
[] 与 test 用法几乎一致,更常用于 if 语句中,另外 [[]] 是 [] 的加强版,支持特性更多
1 | [2 -lt 3] # 为真,返回 0 |
1 | ➜ ~ [ -e proxy.sh ] && echo "exist" || echo "Not exist" |
注意事项:
[]中的每一项都要空格隔开[]中的变量要用双引号括起来[]中的常数用单引号或者双引号括起来
1 | root@applepine-work:~# str="apple pine" |
3.4.6 exit 命令
exit 命令用来退出当前 shell 进程,并返回一个退出状态,使用 $? 可以接收这个退出状态。
exit 命令可以接收一个整数值作为参数,代表退出状态,如果不指定,默认状态值为 0.
exit 退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其他值都表示失败。
1 | ! /bin/bash |
3.4.7 文件重定向
每一个进程默认打开了三个文件描述符:
stdin标准输入,从命令行读入数据,文件描述符为 0stdout标准输出,向命令行输出数据,文件描述符为 1stderr标准错误输出,向命令行输出错误,文件描述符为 2
可以用文件重定向将这三个内容重定向到其他文件中
重定向命令
command > file将stdout重定向到file,即写入file中command < file将stdin重定向到file,即从file中读入command >> file将stdout以追加方式重定向到file即向file尾部写入数据command n> file将文件描述符n重定向到file中command n>> file将文件描述符以追加方式重定向到file中
1 | echo -e "Hello World\nApplepine" > output.txt |
同时重定向输入和输出
test.js 文件
1
2
3
4
5
6const str = 'aaa:bbb:ccc:ddd:eee';
const arr = str.split(':');
const l = 3;
const r = 5;
const res1 = arr[l - 1] + ':' + arr[r - 1];
console.log(res1); // ccc:ddd执行命令
1
2
3
41
echo $(<test.js) > test1.js
2
echo "$(<test.js)" > test2.js结果
1
2
3
4
5
6
7
8
9
10// test1.js
const str = "aaa:bbb:ccc:ddd:eee" const arr = str.split(':') const l = 3 const r = 5 const res1 = arr[l - 1] + ":" + arr[r - 1] console.log(res1) // ccc:ddd
// test2.js
const str = "aaa:bbb:ccc:ddd:eee"
const arr = str.split(':')
const l = 3
const r = 5
const res1 = arr[l - 1] + ":" + arr[r - 1]
console.log(res1) // ccc:ddd
逻辑: 总体逻辑是 $() 通过 < 读入 stdin ,echo 开启 stdout 通过 > 将内容重定向到 test1.js | test2.js ,但是两者有些许差异。前者写入到 test1.js 的内容没有换行符,后者原封不动的复制了 test.js 的内容到 test2.js ,这是 echo 的原因,如果没有用引号包裹变量或者命令替换结果,如 echo $(<test.js) ,echo 会将内容视为单个参数,将所有换行符当做空格处理,而 "" 的使用会告诉 echo 保留文本的原始格式,包括换行符。
3.4.8 include
bash 中可以引入外部文件
1 | . filename # 点和文件之间有空格 |
示例
创建
test1.sh1
2
3! /bin/bash
name="applepine"创建
test2.sh1
2
3
4
5! /bin/bash
source test1.sh
echo "My name is: " ${name}
3.5 基础语句
3.5.1 判断语句
单层 if 形式
1 | if condition |
1 | a=3 |
单层 if-else 形式
1 | if condition |
1 | a=7 |
多层 if-elif-elif-else 形式
1 | if condition |
1 | a=7 |
case···esac 形式
1 | case ${变量名} in |
3.5.2 循环语句
for…in…do…done 形式
1 | for var in val1 val2 val3 |
示例 1,输出 a 2 “applepine”,不换行
1 | for i in a 2 "applepine" |
示例 2,输出当前路径所有文件名
1 | for file in `ls` |
示例 3,输出 1-10
1 | for i in $(seq 1 10) |
示例 4,使用{1..10} 或者 {a..z}
1 | for i in {a..z} #是两个点 |
for((…;…;…)) do …done 形式
1 | for ((expression; condition; expression)) |
示例,输出 1-10
1 | for ((i=1; i<= 10; i++)) |
while…do…done 形式
1 | while condition |
示例,文件结束符为 CTRL + D,输入结束符后 read 指令返回 false
1 | while read name |
until…do…done 形式
1 | until condition |
1 | until [ "${word}" == "yes" ] || [ "${word}" == "YES" ] |
break 命令
跳出==当前一层循环==
1 | while read name |
continue 命令
跳出==当前一次循环==
1 | for ((i=1; i<=10; i++)) |
3.5.3 函数
bash 中的函数类似于 C/C++ 中的函数,但 return 的返回值与 C/C++ 不同,返回的是 exit code,取值为 0-255,0 表示正常结束。
如果想获取函数的输出结果,可以通过 echo 输出到 stdout 中,然后通过 $(function_name) 来获取 stdout 中的结果。
函数的 return 值可以通过 $? 来获取。
1 | [function] func_name() { # function 关键字可以省略 |
不获取 return 值和 stdout 值
1 | func() { |
获取 return 值和 stdout 值
1 | func() { |
函数的输入参数
在函数内, $1 表示第一个输入参数, $2 表示第二个输入参数,依次类推。
注意:函数的 $0 仍然为文件路径,而不是函数名。
1 | func() { |
函数内的局部变量
可以在函数内定义局部变量,作用范围仅在该函数内部。
可以在递归函数中定义局部变量。
local 变量名=变量值
1 | ! /bin/bash |
4. SSH
4.1 远程登录
4.1.1 登录服务器
1 | ssh user@hostname -p port |
第一次登录会提示:
1 | The authenticity of host '123.57.47.211 (123.57.47.211)' can't be established. |
输入 yes 回车后,服务器信息会保存在 ~/.ssh/know_hosts 文件中,然后输入密码即可登录
4.1.2 配置文件
创建文件 ~/.ssh/config 写入:
1 | Host myserver1 |
之后再使用服务器,可以直接通过 myserver1 连接服务器
4.1.3 配置密钥登录
创建密钥
1
ssh-keygen -t rsa -f "~/.ssh/id_rsa" -C "备注信息,可以是邮箱"
-t密钥类型,可选dsa、ecdsa、ed25519、rsa-f密钥文件位置,目录默认是~/.ssh/文件默认是id_rsa-C备注信息
免密登录
将==公钥==上传到服务器
1
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@127.0.0.1
执行命令
1
2
3ssh user@hostname command
ssh myserver 'for ((i=0; i<10; i++)) do echo ${i}; done'
4.2 scp 命令
scp 用于传送文件,将 文件 source 下的文件复制到 destination 中
1 | scp source destination |
复制文件夹
1 | scp -r ~/tmp myserver:/home/acs # 将 tmp 目录传到 /home/acs 下即 /home/acs/tmp |
批量复制文件夹下的文件(夹):
1 | scp -r ~/tmp/* myserver:/home/acs |
5. Git
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
5.1 基本概念
- 工作区:仓库的目录,工作区是独立于各个分支的。
- 暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区,暂存区是独立于各个分支的。
- 版本库,存放所有已经提交到本地仓库的代码版本。
- 版本结构:树结构,树中没一个节点代表一个代码版本。
5.1 基础命令
git config --global user.name xxx:设置全局用户名,信息记录在~/.gitconfig文件中git config --global user.email xxx@xxx.com:设置全局邮件地址git init:将当前目录配置成 git 仓库,信息记录在隐藏的.git文件夹中git add xx:将 xx 添加到暂存区git add .: 将所有待加入暂存区的文件加入暂存区git rm --cached xx: 将文件从仓库索引目录中删除git commit -m "备注信息": 将暂存区的内容提交到当前分支git status: 查看仓库状态git diff xx: 查看 xx 文件相对于暂存区修改了哪些内容git log: 查看当前分支所有版本git relog: 查看 HEAD 指针的移动历史(包括被回滚的版本)git reset --hard HEAD^或者git reset --hard HEAD~: 将代码库回滚到上个版本git reset --hard HEAD^^: 回滚两次,以此类推git reset --hard HEAD~100: 回滚一百次git reset --hard 版本号: 回滚到特定版本
git checkout - xx或者git restore xx: 将 xx 文件尚未加入暂存区的修改全部撤销git remote add origin git@xxx:xxx/xxx.git: 将本地仓库关联到远程仓库git push -u (第一次需要 -u 以后不需要): 将当前分支推送到远程仓库git push origin branch_name: 将本地某个分支推送到远程仓库
git clone git@xxx:xxx/xxx.git: 将远程仓库下载到当前目录下git checkout -b branch_name: 创建并切换到branch_name分支下git branch: 查看所有分支和当前所处分支git checkout branch_name: 切换到branch_name这个分支git merge branch_name: 将分支branch_name合并到当前分支上git branch -d branch_name: 删除本地仓库branch_name分支git branch branch_name: 创建新分支git push --set-upstream origin branch_name: 设置本地branch_name分支对应的远程仓库的branch_name分支git push -d origin branch_name: 删除远程仓库的 branch_name 分支git pull: 将远程仓库的当前分支与本地仓库的当前分支合并git pull origin branch_name: 将远程仓库的branch_name分支与本地仓库的当前分支合并git branch --set-upstream-to=origin/branch_name1 branch_name2: 将远程的branch_name1分支与本地的branch_name2分支对应git checkout -t origin/branch_name: 将远程branch_name分支拉取到本地git stash: 将工作区和暂存区中尚未提交的修改存入栈中git stash apply: 将栈顶存储的修改恢复到当前分支,但不删除栈顶元素git stash drop: 删除栈顶存储的修改git stash pop: 将栈顶存储的修改恢复到当前分支,同时删除栈顶元素git stash list: 查看栈中的所有元素
5.2 常用命令
git init初始化git config --global user.name xxxgit config --global user.email xxx全局用户信息git remote add origin xxx@xxx:xxx/xxx.git添加远程仓库git add .git add $file加入暂存区git commit -m "备注"加入本地分支git status仓库状态git log查看当前仓库所有版本git push -u origin master推送到远程 master 分支git push -d origin master删除远程 master 分支git clone xxx@xxx:xxx/XX.git克隆远程仓库到本地git branch查看所有分支和当前分支
5.3 查看命令
git diff XX查看 XX 文件相对与暂存区修改了哪些内容git status查看仓库状态git log查看当前分支所有版本git log --pretty=oneline用一行来显示git reflog查看 HEAD 指针的移动历史git branch查看所有分支和当前分支
5.4 删除命令
git rm --cached XX将文件从仓库索引目录中删掉,不希望管理这个文件git restore --staged XX将 XX 从暂存区删除git checkout - XX或者git restore XX将 XX 尚未加入暂存区的修改全部撤销
5.5 代码回滚
git reset --hard HEAD^或者git reset --hard HEAD~将代码回滚到上一个版本git reset --hard HEAD^^回滚两次,依次类推git reset --hard HEAD~100回滚一百次git reset --hard 版本号回滚到指定版本
5.6 远程仓库
git remote add origin xxx@xxx:xxx/XX.git将本地仓库关联到远程仓库git push -u origin master将 master 分支推送git push -u推送当前分支git clone xxx@xxx:xxx/XX.git克隆远程仓库到本地git push --set-upstream origin branch_name设置本地的branch_name对应到远程仓库的branch_namegit push -d origin master删除远程仓库的 master 分支git checkout -t origin/master将远程仓库 master 拉取到本地git pull将远程仓库当前分支与本地仓库当前分支合并git pull origin master将远程仓库 master 分支与本地仓库当前分支合并git branch --set-upstream-to=origin/branch_name1 branch_name2将远程的branch_name1与本地branch_name2对应
5.7 分支相关
git branch查看所有分支和当前分支git branch dev创建新分支devgit checkout -b dev创建并切换到分支devgit checkout dev切换到分支devgit merge branch_name将分支branch_name与当前所在分支(git branch)合并git branch -d branch_name删除本地分支git branch --set-upstream-to=origin/branch_name1 branch_name2将远程的branch_name1与本地branch_name2对应git push -d origin master删除远程 master 分支git push --set-upstream origin branch_name设置本地branch_name分支对应远程同名分支git pull拉取远程仓库当前分支合并git pull origin branch_name将远程branch_name分支与本地当前分支合并
5.8 stash 暂存
git stash将工作区和暂存区尚未提交的修改存入栈中git stash apply将栈顶存储的修改恢复到当前分支,不删除栈顶git stash pop将栈顶存储的修改恢复到当前分支,删除栈顶git stash drop删除栈顶git stash list查看栈中所有元素
6. 环境变量
6.1 概念
Linux 系统中有很多环境变量来记录配置信息,环境变量类似于全局变量,可以被各个进程访问,可通过修改环境变量来修改系统配置。
6.1 查看环境变量
env查看当前用户的变量set显示当前 shell 的变量,包括当前用户的变量export显示当前导出成用户变量的 shell 变量echo $PATH输出某个环境变量的值
6.2 修改环境变量
7. 五花八门的软件
7.1 第一个当然非 Docker 莫属啦
7.1.1 添加用户组
为了避免每次使用 docker 命令都需要加上 sudo 权限,可以将当前用户加入安装中自动创建的 docker 用户组
1 | sudo usermod -aG docker $USER |
7.1.2 镜像 (image)
docker pull ubuntu:22.04拉取镜像docker images列出本地所有镜像docker image rm ubuntu:22.04或者docker rmi ubuntu:22.04删除镜像docker [container] commit CONTAINER IMAGE_NAME:TAG创建某个container对象docker save -o ubuntu_22_04.tar ubuntu:22.04将镜像导出到本地压缩文件中docker load -i ubuntu_22_04.tar将镜像ubuntu:22.04从压缩文件ubuntu_22_04.tar中加载出来
7.1.3 容器(container)
docker [container] create -it ubuntu:22.04利用镜像创建容器docker ps -a查看本地所有容器docker [container] start CONTAINER启动容器docker [container] stop CONTAINER停止容器docker [container] reatart CONTAINER重启容器docker [container] run -itd ubuntu:22.04创建并启动容器docker [container] attach CONTAINER进入容器先按
CTRL + p再按CTRL + q可以挂起容器docker [container] exec CONTAINER COMMAND在容器中执行命令docker [container] rm CONTAINER删除容器docker container prune删除所有停止的容器docker export -o xxx.tar CONTAINER将容器导出到本地压缩文件中docker import xxx.tar image_name:tag将本地压缩文件导入成镜像并将镜像命名为image_name:tagdocker export/import与docker save/load的区别:export/import会丢弃历史记录和元数据信息,仅保存容器当时快照save/load会保存完整记录,体积较大
docker top CONTAINER查看某个容器所有进程docker stats查看所有容器统计信息,包括 CPU、内存、储存、网络等docker cp xxx CONTAINER:xxx或者docker cp CONTAINER:xxx xxx在本地和容器间复制文件docker rename CONTAINER1 CONTAINER2重命名容器docker update CONTAINER --memory 500MB修改容器限制
实践
1 | 0 |