梦开始的地方
路径、目录
- 绝对路径:pwd,/开始
- 相对路径:就是当前文件开始
- 当前目录:.
- 上级目录:…
- 家目录:~/ 等价 /home/acs
- 复制:按住shinft,鼠标拉动,在按Ctrl + insert;
- 粘贴: shinft + insert;
- top 看进程
命令ctrl
-
ctrl + C: 可以终止当前运行或者换一行并清空
-
ctrl + U: 可以清除一行
-
teb:可以补全,按两次有提示
-
↑ 键:可以上一条命令
-
ls:看当前的文件,蓝色文件夹,绿色可执行文件,白色普通文件
- ls -1:详细文件信息
- ls -lh:加一个h:更加详细
- ls -a:可以看隐藏文件
- ls -A:不显示
- ls -la:详细文件信息,包括隐藏文件
- ls | wc -1: 查看有多少个文件
-
cd:切换目录
- cd … :返回上一级目录
- cd - : 返回之前的目录
-
cp xxx xxx :复制文件,(要加路径),复制时可以重命名,如:cp a/tmp.txt b/tmp2.txt
- 复制目录:cp a b -r
- 复制到当前目需要重命名:cp a b -r
- -r:意思意思是递归
-
mkdir xxx: 创建文件夹
mkdir xxx/xxx/xxx: 连续创建文件
mkdir --h:看命令
-
history:查看历史命令
-
touch xxx:创建文件
-
rm :删除
- rm *.txt : 删除所以的.txt文件
- rm xx -r :递归删除,就是强制删除
- rm a/* : 删除a文件下的所有文件
-
mv指令:剪切加粘贴,可重命名;
- 如:mv a/a.txt b :把a文件夹中的a.txt文件移到b文件夹中
- mv a/a.txt b/b1.txt 把a文件夹中的a.txt文件移到b文件夹中并改名b1;也可以mv a.txt b.txt 直接改名
- mv a/* b 移动a文件下的文件到b
tmux 命令
功能:
(1) 分屏。
(2) 允许断开Terminal连接后,继续运行进程。
结构:
一个tmux可以包含多个session,一个session可以包含多个window,一个window可以包含多个pane。
实例:
tmux:
session 0:
window 0:
pane 0
pane 1
pane 2
...
window 1
window 2
...
session 1
session 2
...
操作:(注意:Ctrl + a 原来是 Ctrl + b,在Acwing中改了键)
-
tmux:新建一个session,其中包含一个window,window中包含一个pane,pane里打开了一个shell对话框。
-
Ctrl + a 松手,再按 %,当前pane左右分;
-
Ctrl + a 松手,再按 ",当前pane上下分;
-
Ctrl + d :关闭当前pane;如果当前window的所有pane均已关闭,则自动关闭window;如果当前session的所有window均已关闭,则自动关闭session。
-
tmux attach -t
<sission-name>
选择window -
tumx ls 查看会话
-
复制张贴:复制Ctrl + a,松手按左挎号,粘贴Ctrl + a,松手按右挎号
-
挂机tmux : ctrl + a 在按 ctrl + z ,在一次进来的话使用fg
-
多个tmux的切换 ctrl + a,再按 s,择你想切换到的会话。
选择 pane 和 操作 :
-
鼠标点击可以选pane;
-
Ctrl + a 松手,再按任意方向键,来选择pane;
-
按住ctrl + a的同时按方向键,可以调整pane之间分割线的位置;
-
Ctrl + a 松手,在按z:可将pane全屏和取消全屏;
-
Ctrl + a + z:可以退出tmux
sission 里面的操作
- Ctrl + a 松手,然后按d:挂起当前的session;
- tmux a:打开之前挂起的session。
- ctrl + a后手指松开,然后按s:选择其它session。
-
方向键 —— 上:选择上一项 session/window/pane
-
方向键 —— 下:选择下一项 session/window/pane
-
方向键 —— 右:展开当前项 session/window
-
方向键 —— 左:闭合当前项 session/window
- Ctrl + a :按c:在当前session中创建一个新的window。
- Ctrl + a :按w:选择其他window,操作方法与(6)完全相同。
- Ctrl + a :按PageUp,PageDn:翻阅当前pane内的内容,或者直接滚轮。
- 在tmux中选中文本时,需要按住shift键。仅支持Windows和Linux,不支持Mac,不过该操作并不是必须的,因此影响不大)
- tmux中复制/粘贴文本的通用方式:
- (1) 按下Ctrl + a后松开手指,然后按insert
- (2) 用鼠标选中文本,被选中的文本会被自动复制到tmux的剪贴
- (3) 按下shinft + insert,内容粘贴到光标处
- 复制:shinft + 鼠标选中,在按ctrl + insert
- 粘贴:shinft + insert
- tmux中复制/粘贴文本的通用方式:
-
vim 三个模式
功能:
- 命令模式下的文本编辑器
- 根据文件扩展可自动判别编程语言,支持代码缩进
- 使用方法: vim filename
- 文件已经有,直接打开
- 文件没有,直接并打开
-
一般命令模式
默认模式。命令输入方式:类似于打游戏放技能,按不同字符,即可进行不同操作。可以复制、粘贴、删除文本等。
-
编辑模式
在一般命令模式里按下i,会进入编辑模式。按下ESC会退出编辑模式,返回到一般命令模式。
-
命令行模式
在一般命令模式里按下
:/?
三个字母中的任意一个,会进入命令行模式。命令行在最下面。可以查找、替换、保存、退出、配置编辑器等。
操作
- i: 进入编辑模式
- ESC: 进入一般命令模式
一般命令模式下:
-
光标移动:
- h 或 左箭头键:光标向左移动一个字符
- j 或 向下箭头:光标向下移动一个字符
- k 或 向上箭头:光标向上移动一个字符
- l 或 向右箭头:光标向右移动一个字符
-
n+
<Space>
:n表示数字,按下数字后再按空格,光标会向右移动这一行的n个字符 -
0 或 功能键[Home]:光标移动到本行开头
-
$ 或 功能键[End]:光标移动到本行末尾
-
大写的G:光标移动到最后一行
-
:n 或 nG:n为数字,光标移动到第n行
-
gg:光标移动到第一行,相当于1G
-
n
<Enter>
:n为数字,光标向下移动n行 -
v:进入选中文本
-
d:删除选中的文本
-
dd: 删除当前行
-
y:复制选中的文本
-
yy: 复制当前行
-
p: 将复制的数据在光标的下一行/下一个位置粘贴
-
u:撤销
-
Ctrl + r:取消撤销
-
shift+大于号 >:将选中的文本整体向右缩进一次
-
shift+小于号 <:将选中的文本整体向左缩进一次
-
ggdG:删除所有
-
gg=G:将全文代码格式化
-
Ctrl + q:当vim卡死时,可以取消当前正在执行的命令
异常处理:每次用vim编辑文件时,会自动创建一个.filename.swp的临时文件。
如果打开某个文件时,该文件的swp文件已存在,则会报错。此时解决办法有两种:
(1) 找到正在打开该文件的程序,并退出
(2) ls -a ,找到直接删掉(rm)该swp文件即可
命令模式下:
-
/word: 从光标向下查找第一个word的字符串
-
?word 从光标向上查找第一个word的字符串
-
按 n :重复前一个查找操作
-
按 N : 反向重复前一个查找操作
-
替换:
:n1,n2s/word1/word2/g
n1与n2为数字,在第n1行与n2行之间寻找word1这个字符串,并将该字符串替换为word2:1,$s/word1/word2/g
:将全文的word1替换为word2, "$s"表示之后一行1,$s/word1/word2/gc
:将全文的word1替换为word2,且在替换前要求用户确认。
-
:w 保存.
-
:w! 强制保存
-
:q 退出
-
:q! 强制退出
-
:wq 保存并退出
-
:set nu 设置行号
-
:set nonu 取消行号
-
:set paste 设置成粘贴模式,取消代码自动缩进
-
:set nopaste 回复缩进
-
:noh 关闭查找关键词高亮
shell语法
简介
shell是我们通过命令行与操作系统沟通的语言。
AC Terminal中的命令行可以看成是一个“shell脚本在逐行执行”。
Linux中常见的shell脚本有很多种,常见的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- zsh
…
Linux系统中一般默认使用bash,所以接下来讲解bash中的语法。
文件开头需要写#! /bin/bash,指明bash为脚本解释器。
脚本示例
新建一个test.sh文件,内容如下:
#! /bin/bash
echo "Hello World!"
运行方式
作为可执行文件
acs@9e0ebfcd82d7:~$ chmod +x test.sh # 使脚本具有可执行权限
acs@9e0ebfcd82d7:~$ ./test.sh # 当前路径下执行
Hello World! # 脚本输出
acs@9e0ebfcd82d7:~$ /home/acs/test.sh # 绝对路径下执行
Hello World! # 脚本输出
acs@9e0ebfcd82d7:~$ ~/test.sh # 家目录路径下执行
Hello World! # 脚本输出
用解释器执行
acs@9e0ebfcd82d7:~$ bash test.sh
Hello World! # 脚本输出
注释
- 每行中
#
之后的内容均是注释。 - 多行注释:<<EOF EOF ,其中EOF可以替换任何字符
定义变量
- 定义变量,不需要加$符号,例如:
name1=‘yxc’ # 单引号定义字符串
name2=“yxc” # 双引号定义字符串
name3=yxc # 也可以不加引号,同样表示字符串
- 使用变量
使用变量,需要加上$
符号,或者${}
符号。花括号是可选的,主要为了帮助解释器识别变量边界。(在.sh文件中)
name=yxc
echo $name # 输出yxc
echo ${name} # 输出yxc
echo ${name}acwing # 输出yxcacwing
- 只读变量
使用readonly或者declare可以将变量变为只读。
name=yxc
#设置只读
readonly name
declare -r name # 两种写法均可name=abc # 会报错,因为此时name只读
- 删除变量
unset可以删除变量。
name=yxc
unset name
echo $name # 输出空行
变量类型
- 自定义变量(局部变量) 子进程不能访问的变量
- 环境变量(全局变量) 子进程可以访问的变量
- 遍历的定义习惯大写。
自定义变量改成环境变量:
acs@9e0ebfcd82d7:~$ name=yxc # 定义变量
acs@9e0ebfcd82d7:~$ export name # 第一种方法
acs@9e0ebfcd82d7:~$ declare -x name # 第二种方法
环境变量改为自定义变量:
acs@9e0ebfcd82d7:~$ export name=yxc # 定义环境变量
acs@9e0ebfcd82d7:~$ declare +x name # 改为自定义变量
字符串
字符串可以用单引号,也可以用双引号,也可以不用引号。
-
单引号与双引号的区别:
- 单引号中的内容会原样输出,不会执行、不会取变量;
- 双引号中的内容可以执行、可以取变量;
name=yxc # 不用引号
echo
'hello, $name \"hh\"'
# 单引号字符串,输出 hello, $name\"hh\"
echo"hello, $name \"hh\""
# 双引号字符串,输出 hello, yxc “hh”
获取字符串长度
name=“yxc”
echo ${#name} # 输出3
提取子串
name=“hello, yxc”
echo ${name:0:5} # 提取从0开始的5个字符
默认变量
文件参数变量
在执行shell脚本时,可以向脚本传递参数。$1是第一个参数,$2是第二个参数,以此类推。特殊的,$0是文件名(包含路径)。例如:
创建文件test.sh:
#! /bin/bash
echo “文件名:”$0
echo “第一个参数:”$1
echo “第二个参数:”$2
echo “第三个参数:”$3
echo “第四个参数:”$4
然后执行该脚本:
acs@9e0ebfcd82d7:~$ chmod +x test.sh s
acs@9e0ebfcd82d7:~$ ./test.sh 1 2 3 4
文件名:./test.sh
第一个参数:1
第二个参数:2
第三个参数:3
第四个参数:4
其它参数相关变量
参数 说明
$# 代表文件传入的参数个数,如上例中值为4
$* 由所有参数构成的用空格隔开的字符串,如上例中值为"$1 $2 $3 $4"··· $@ 每个参数分别用双引号括起来的字符串,如上例中值为"$1" "$2" "$3" "$4" $$ 脚本当前运行的进程ID $? 上一条命令的退出状态(注意不是stdout,而是exit code)。0表示正常退出,其他值表示错误 $(command) 返回command这条命令的stdout(可嵌套) `command` 返回command这条命令的stdout(不可嵌套)
数组
数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。
数组下标从0开始。
- 定义 : 数组用小括号表示,元素之间用空格隔开。例如:
array=(1 abc "def" yxc)
也可以直接定义数组中某个元素的值:
array[0]=1 array[1]=abc array[2]="def" array[3]=yxc
读取数组中某个元素的值格式:${array[index]}
例如:
array=(1 abc "def" yxc) echo ${array[0]} echo ${array[1]} echo ${array[2]} echo ${array[3]}
读取整个数组格式:
${array[@]} # 第一种写法 ${array[*]} # 第二种写法
例如:
array=(1 abc “def” yxc)
echo ${array[@]} # 第一种写法
echo ${array[*]} # 第二种写法
数组长度
类似于字符串
${#array[@]} # 第一种写法
${#array[*]} # 第二种写法
例如:
array=(1 abc “def” yxc)
echo ${#array[@]} # 第一种写法
echo ${#array[*]} # 第二种写法
expr命令
格式:expr
表达式
表达式说明:
- 用空格隔开每一项
- 用反斜杠放在
shell
特定的字符前面(发现表达式运行错误时,可以试试转义) - 对包含空格和其他特殊字符的字符串要用引号括起来
expr
会在stdout
中输出结果相当于C++中的cout
。如果为逻辑关系表达式,则结果为真,stdout
为1
,否则为0
。expr
的exit code
:如果为逻辑关系表达式,则结果为真,exit code
为0
,否则为1
,相当于return。
字符串的表达式:
-
length string 返回string 的长度
-
index STRING CHARSET
CHARSET
中任意单个字符在STRING
中最前面的字符位置,下标从1开始。如果在STRING
中完全不存在CHARSET
中的字符,则返回0
。 -
substr STRING POSITION LENGTH
返回
STRING
字符串中从POSITION
开始,长度最大为LENGTH
的子串。如果POSITION
或LENGTH
为负数,0或非数值,则返回空字符串。
示例:
str=“Hello World!”
echo `expr length “$str”` # ``不是单引号,表示执行该命令,输出12
echo `expr index “$str” awd` # 输出7,下标从1开始
echo `expr substr “$str” 2 3` # 输出 ell
整数表达式
expr
支持普通的算术操作,算术表达式优先级低于字符串表达式,高于逻辑关系表达式。
+ -
加减运算。两端参数会转换为整数,如果转换失败则报错。
* / %
乘,除,取模运算。两端参数会转换为整数,如果转换失败则报错。
()
可以改变优先级,但需要用反斜杠转义
示例:
a=3
b=4
echo `expr $a + $b` # 输出7
echo `expr $a - $b` # 输出-1
echo `expr $a \* $b` # 输出12,*需要转义
echo `expr $a / $b` # 输出0,整除
echo `expr $a % $b` # 输出3
echo `expr \( $a + 1 \) \* \( $b + 1 \)` # 输出20,值为(a + 1) * (b + 1)
逻辑关系表达式
|
&
< <= > >= != = ==
”==”是”=”的同义词。
a=3
b=4
echo `expr $a \> $b` # 输出0,>需要转义
echo `expr $a '<' $b` # 输出1,也可以将特殊字符用引号引起来
echo `expr $a '>=' $b` # 输出0
echo `expr $a \<\= $b` # 输出1
c=0
d=5
echo `expr $c \& $d` # 输出0
echo `expr $a \& $b` # 输出3
echo `expr $c \| $d` # 输出5
echo `expr $a \| $b` # 输出3
**注意一定要加expr**
read命令
read
命令用于从标准输入中读取单行数据。当读到文件结束符时,exit code
为1,否则为0。
参数说明
-p
: 后面可以接提示信息-t
:后面跟秒数,定义输入字符的等待时间,超过等待时间后会自动忽略此命令
read name
echo “hello”,$name # 运行,输入数据
read -p “what`s your name” name
echo “helle”,$name
read -p "Please input your name: " -t 30 name # 读入name的值,等待时间30秒
echo命令
-
显示普通字符串
echo “Hello AC Terminal”
echo Hello AC Terminal # 引号可以省略 -
显示转义字符
echo ““Hello AC Terminal”” # 注意只能使用双引号,如果使用单引号,则不转义
echo “Hello AC Terminal” # 也可以省略双引号 -
显示变量
name=yxc
echo “My name is $name” # 输出 My name is yxc -
显示换行
echo -e “Hi\n” # -e 开启转义
echo “acwing”
输出结果: Hi
acwing
-
显示不换行
echo -e “Hi \c” # -e 开启转义 \c 不换行
echo “acwing”
输出结果: Hi acwing
-
显示结果定向至文件
echo “Hello World” > output.txt # 将内容以覆盖的方式输出到output.txt中
原样输出字符串,不进行转义或取变量(用单引号)
name=acwing
echo ‘$name"’
输出结果 $name"
-
显示命令的执行结果
echo `date`
输出结果: Wed Sep 1 11:45:33 CST 2021
printf命令
注:用的不多
test命令与判断符号[]
- && 表示与,|| 表示或
- 二者具有短路原则:
expr1 && expr2:当expr1为假时,直接忽略expr2
expr1 || expr2:当expr1为真时,直接忽略expr2
- 表达式的
exit code
为0
,表示真;为非零,表示假。(与C/C++中的定义相反)
test命令
test命令用于判断文件类型,以及对变量做比较。
test命令用exit code返回结果,而不是使用stdout。0表示真,非0表示假。
例如:
test 2 -lt 3 # 为真,返回值为0
echo $? # 输出上个命令的返回值,输出0acs@9e0ebfcd82d7:~$ ls # 列出当前目录下的所有文件
homework output.txt test.sh tmp
acs@9e0ebfcd82d7:~$ test -e test.sh && echo “exist” || echo “Not exist”
exist# test.sh 文件存在
acs@9e0ebfcd82d7:~$ test -e test2.sh && echo “exist” || echo “Not exist”
Not exist# testh2.sh 文件不存在
文件类型判断
命令格式:
test -e filename
# 判断文件是否存在
测试参数 | 代表意义 |
---|---|
-e | 文件是否存在 |
-f | 是否为文件 |
-d | 是否为目录 |
文件权限判断
命令格式:
test -r filename
# 判断文件是否可读
测试参数 | 代表意义 |
---|---|
-r | 文件是否可读 |
-w | 文件是否可写 |
-x | 文件是否可执行 |
-s | 是否为非空文件 |
整数间的比较
命令格式:
test $a -eq $b # a是否等于b
测试参数 | 代表意义 |
---|---|
-eq | a是否等于b |
-ne | a是否不等于b |
-gt | a是否大于b |
-lt | a是否小于b |
-ge | a是否大于等于b |
-le | a是否小于等于b |
字符串比较
测试参数 | 代表意义 |
---|---|
test -z STRING | 判断STRING是否为空,如果为空,则返回true |
test -n STRING | 判断STRING是否非空,如果非空,则返回true(-n可以省略) |
test str1 == str2 | 判断str1是否等于str2 |
test str1 != str2 | 判断str1是否不等于str2 |
多重条件判定
命令格式:
test -r filename -a -x filename
测试参数 | 代表意义 |
---|---|
-a | 两条件是否同时成立 |
-o | 两条件是否至少一个成立 |
! | 取反。如 test ! -x file,当file不可执行时,返回true |
判断符号[]
[ ]
与test
用法几乎一模一样,更常用于if
语句中。另外[[ ]]
是[ ]
的加强版,支持的特性更多。
例如:
[ 2 -lt 3 ]
# 为真,返回值为0
echo $?
# 输出上个命令的返回值,输出0
acs@9e0ebfcd82d7:~$ ls
# 列出当前目录下的所有文件
homework output.txt test.sh tmp
acs@9e0ebfcd82d7:~$ [ -e test.sh ] && echo "exist" || echo "Not exist"
exist # test.sh 文件存在
acs@9e0ebfcd82d7:~$ [ -e test2.sh ] && echo "exist" || echo "Not exist"
Not exist # testh2.sh 文件不存在
注:
- []内的每一项都要用空格隔开
- 中括号内的
变量
,最好用双引号
括起来 - 中括号内的
常数
,最好用单
或双引号
括起来
在.sh文件中
name=“acwing yxc”
[ KaTeX parse error: Expected 'EOF', got '#' at position 26: …cwing yxc" ] #̲ 错误,等价于 [ acwin…name" == “acwing yxc” ] # 正确
判断语句
if…then形式
看文档
循环
看文档
函数
文件重定向,引入外部文件
SSH
SSh登入
基本用法
-
远程登录服务器:
主要是用来的登入服务器的。ctrl + d 退出。
ssh user@hostname
user: 用户名
hostname: IP地址或域名
第一次登录时会提示:
The authenticity of host ‘123.57.47.211 (123.57.47.211)’ can’t be established.
ECDSA key fingerprint is SHA256:iy237yysfCe013/l+kpDGfEG9xxHxm0dnxnAbJTPpG8.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
输入yes,然后回车即可。
这样会将该服务器的信息记录在~/.ssh/known_hosts
文件中。
然后输入密码即可登录到远程服务器中。
默认登录端口号为22。如果想登录某一特定端口:
ssh user@hostname -p 22
配置文件创建别名
创建文件 :la看所有文件,在.ssh目录下创建config文件:~/.ssh/config。
然后在文件中输入:
Host myserver1
HostName IP地址或域名
User 用户名Host myserver2
HostName IP地址或域名
User 用户名
之后再使用服务器时,可以直接使用别名myserver1、myserver2与之前的ssh acs_5850@123.57.47.211 改成 ssh myserver。
密钥登录
创建密钥:
ssh-keygen
然后一直回车即可。
执行结束后,~/.ssh/目录下会多两个文件:
id_rsa:私钥
id_rsa.pub:公钥
之后想免密码登录哪个服务器,就将公钥传给哪个服务器即可。
要先配置一下别名:cd .ssh/ config 中
例如,想免密登录myserver服务器。则将公钥中的内容,复制到myserver中的~/.ssh/authorized_keys文件
里即可,这一步要登入服务器里面操作。
也可以使用如下命令一键添加公钥:
ssh-copy-id myserver
-
执行命令
命令格式:ssh user@hostname command
例如:ssh user@hostname ls -a 如:
ssh myserver ls -a
或者单引号中的$i可以求值
ssh myserver ‘for ((i = 0; i < 10; i ++ )) do echo $i; done’
或者双引号中的$i不可以求值
ssh myserver “for ((i = 0; i < 10; i ++ )) do echo $i; done”
执行的结果可以由服务器返回给终端
scp 传文件
- 本地服务器的传送
scp source destination 将source路径下的文件复制到destination中
一次复制多个文件:
scp source1 source2 destination
复制文件夹:
scp -r ~/tmp myserver:/home/acs/
将本地家目录中的tmp文件夹复制到myserver服务器中的/home/acs/(绝对路径)目录下。
scp -r ~/tmp myserver:homework/
将本地家目录中的tmp文件夹复制到myserver服务器中的~/homework/(家)目录下。
scp -r myserver:homework .
将myserver服务器中的~/homework/文件夹复制到本地的当前路径下。
在本地创建一个tmp/a.txt
在本地:scp -r tmp/a.txt myserver: # “:”:冒号是相对于家目录
在服务器:scp -r myserver:tmp/a.txt /home/acs #采用绝对路径
. 为当前路径
-
服务器与服务器的传送
一般需要本地的服务器进行中转
服务器<————> 本地 <——————>服务器
使用scp配置其他服务器的vim和tmux
scp ~/.vimrc ~/.tmux.conf myserver:
eg:在AC Teminal 中 scp .vimrc .tmux.conf myserver:
Git命令
-
工作区:仓库的目录。工作区是独立于各个分支的。
-
暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。
-
版本库:存放所有已经提交到本地仓库的代码版本,有一个head指向当前的分支。
-
版本结构:树结构,树中每个节点代表一个代码版本
git命令分类整理
全局设置
git config --global user.name xxx:设置全局用户名,信息记录在~/.gitconfig文件中
git config --global user.email xxx@xxx.com:设置全局邮箱地址,信息记录在~/.gitconfig文件中
git init:将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中
常用命令
git add XX :将XX文件添加到暂存区
git add . : 所有的添加到暂存区
git commit -m “给自己看的备注信息”:将暂存区的内容提交到当前分支(文件变绿,清空暂存区)
git status:查看仓库状态
git log:查看当前分支的所有版本
git push -u (第一次需要-u以后不需要) :将当前分支推送到远程仓库
git clone git@git.acwing.com:xxx/XXX.git:将远程仓库XXX下载到当前目录下
git branch:查看所有分支和当前所处分支
查看命令
git diff XX:查看XX文件相对于暂存区修改了哪些内容
git status:查看仓库状态
git log:查看当前分支的所有版本
git log --pretty=oneline:用一行来显示
git reflog:查看HEAD指针的移动历史(包括被回滚的版本)
git branch:查看所有分支和当前所处分支
git pull :将远程仓库的当前分支与本地仓库的当前分支合并
删除命令
git rm --cached XX:将文件从仓库索引目录中删掉,不希望管理这个文件
git restore --staged xx:将xx从暂存区里移除,但还是管理的,用cat看文件是看不到暂存区的内容的,看到的还是工作 区的内容
git checkout — XX或git restore XX:将XX文件尚未加入暂存区的修改全部撤销
git restore XX:也可以把在工作区的修改内容(不想要了的话,可以用这个命令),回滚到上一次暂存区的内容(如果暂存区有存的话);
可以理解为add 和restore 是相反的操作
commit之后:删除本地文件之后没有加入暂存区的话,可以回滚git restore xx到工作区
回滚版本
git reset --hard HEAD^ 或git reset --hard HEAD~ :将代码库回滚到上一个版本
git reset --hard HEAD^^:往上回滚两次,以此类推
git reset --hard HEAD~100:往上回滚100个版本
git reset --hard 版本号
(六位):回滚到某一特定版本(看版本号 git reflog)
远程仓库
git remote add origin git@git.acwing.com:xxx/XXX.git:将本地仓库关联到远程仓库
git push -u (第一次需要-u以后不需要) :将当前分支推送到远程仓库
git push origin branch_name:将本地的某个分支推送到远程仓库
git clone git@git.acwing.com:xxx/XXX.git:将远程仓库XXX下载到当前目录下
git push --set-upstream origin branch_name:将本地的branch_name分支创建到远程仓库(在云端创建这个分支)
git push -d origin branch_name:删除远程仓库的branch_name分支
git checkout -t 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 branch branch_name:创建新分支
git branch:查看所有分支和当前所处分支
git checkout -b branch_name:创建并切换到branch_name这个分支
git checkout branch_name:切换到branch_name这个分支
git merge branch_name:将分支branch_name合并到当前分支上
git branch -d branch_name:删除本地仓库的branch_name分支
git push --set-upstream origin branch_name:设置本地的branch_name分支对应远程仓库的branch_name分支
git push -d origin branch_name:删除远程仓库的branch_name分支
git checkout -t origin/branch_name 将远程的branch_name分支拉取到本地
git pull :将远程仓库的当前分支与本地仓库的当前分支合并
git branch --set-upstream-to=origin/branch_name1 branch_name2:将远程的branch_name1分支与本地的branch_name2分支对应(需要在本地创建一个和服务器一样的项目名字,在执行这条命令进行绑定,在执行git pull,下拉分支)(起连接的作用,知道pull给谁)
git pull origin branch_name:将远程仓库的branch_name分支与本地仓库的当前分支合并(拉下来)
stash暂存
git stash:将工作区和暂存区中尚未提交的修改存入栈中
git stash apply:将栈顶存储的修改恢复到当前分支,但不删除栈顶元素
git stash drop:删除栈顶存储的修改
git stash pop:将栈顶存储的修改恢复到当前分支,同时删除栈顶元素
git stash list:查看栈中所有元素
存到服务器
-
创建一个项目
-
设置公钥:在.ssh文件夹中id_rsa.pub,复制出来,在ACgit中添加公钥
-
本地运行添加:
git remote add origin git@git.acwing.com:jlc/project.git
建立本地和云端链接 -
在运行:
git push -u origin master
-
从云端复制下来:git clone git@git.acwing.com:jlc/pro.git
当两个人开发同一个分支的时候,另一个人需要一个新的服务器,在给这个用户配置好新的密钥,在本地创建一个和云端一样的分支关联起来,-----git checkout div , 在git pull。如果在一个人开发中修改了同一个文件push冲突,要先pull解决冲突。
docker教程
docker
images
container
container
images
container
container
...
...
...
将当前用户添加到docker用户组
为了避免每次使用docker命令都需要加上sudo权限,可以将当前用户加入安装中自动创建的docker用户组(可以参考官方文档):
sudo usermod -aG docker $USER
执行完此操作后,需要退出服务器,再重新登录回来,才可以省去sudo权限。
镜像(images)
docker pull ubuntu:20.04:拉取一个镜像
docker images:列出本地所有镜像
docker image rm ubuntu:20.04 或 docker rmi ubuntu:20.04:删除镜像ubuntu:20.04
docker [container] commit CONTAINER IMAGE_NAME:TAG:创建某个container的镜像
docker save -o ubuntu_20_04.tar ubuntu:20.04:将镜像ubuntu:20.04导出到本地文件ubuntu_20_04.tar中 (迁移,将镜像保存为文件)
docker load -i ubuntu_20_04.tar:将镜像ubuntu:20.04从本地文件ubuntu_20_04.tar中加载出来
可以使用scp server1:ubuntu_20_04.tar . 复制到本地
容器(container)
相当于一个虚拟机
docker [container] create -it ubuntu:20.04: 利用镜像ubuntu:20.04创建一个容器。
docker ps -a:查看本地的所有容器其中有CONTAINER
docker [container] start CONTAINER:启动容器
docker [container] stop CONTAINER:停止容器
docker [container] restart CONTAINER:重启容器
docker [contaienr] run -itd ubuntu:20.04:创建并启动一个容器
docker [container] attach CONTAINER:进入容器(相当于进入了一个新的服务器/虚拟机)
先按Ctrl-p,再按Ctrl-q可以挂起容器,ctrl + d
docker [container] exec CONTAINER COMMAND:在容器中执行命令(先启动容器)
列如:docker exec 容器名字 命令(ls等命令)
docker [container] rm CONTAINER:删除容器
docker container prune:删除所有已停止的容器
容器本身也是可以保存为一个文件
docker export -o xxx.tar CONTAINER:将容器CONTAINER导出到本地文件xxx.tar中 (将容器保存为文件)
docker import xxx.tar image_name:tag:将本地容器xxx.tar导入成镜像,并将镜像命名为image_name:tag
;注导入的是容器也会成为镜像
docker export/import与docker save/load的区别:
export/import会丢弃历史记录和元数据信息,仅保存容器当时的快照状态(用这个方式导出的是容器的镜像,容器本身是不可以转移的
)
save/load会保存完整记录,体积更大
两种方式都可以迁移
下面要进入容器里面才能用
docker top CONTAINER:查看某个容器内的所有进程
docker stats:查看所有容器的统计信息,包括CPU、内存、存储、网络等信息(退出用Ctrl + C)
docker cp xxx CONTAINER:xxx
(路径
) 或 docker cp CONTAINER:xxx xxx:在本地和容器间复制文件
docker rename CONTAINER1 CONTAINER2:重命名容器
docker update CONTAINER --memory 500MB:修改容器限制
实战
进入AC Terminal,然后:
scp /var/lib/acwing/docker/images/docker_lesson_1_0.tar
server_name
: # 将镜像上传到自己租的云端服务器
sshserver_name
# 登录自己的云端服务器docker load -i docker_lesson_1_0.tar # 将镜像加载到本地
docker run -p 20000:22 --namemy_docker_server
-itd docker_lesson:1.0 # 创建并运行docker_lesson:1.0镜像docker attach my_docker_server #
进入创建的docker容器(相当于一个服务器)
passwd # 设置root密码
1.设置密码之后,在云端服务器里面可以登入,不过要先挂起容器,Ctrl + p 加 Ctrl + q,登入,ssh root@localhost -p 20000
2.去云平台控制台中修改安全组配置,放行端口20000。
返回AC Terminal,即可通过ssh登录自己的docker容器
:
ssh root@xxx.xxx.xxx.xxx -p 20000
# 将xxx.xxx.xxx.xxx替换成自己租的服务器的IP地址
以上步骤相当于在云服务器创建自己的一个服务器,在分配一个用户
然后,可以仿照上节课内容,创建工作账户acs。
usermod -aG sudo acs
#给用户添加sudo权限
最后,可以参考4. ssh——ssh登录配置docker容器的别名和免密登录。
用docker可以生成一个镜像,可以方便迁移项目。
作者:yxc
链接:https://www.acwing.com/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。