学习linux的笔记

梦开始的地方

路径、目录

  1. 绝对路径:pwd,/开始
  2. 相对路径:就是当前文件开始
  3. 当前目录:.
  4. 上级目录:…
  5. 家目录:~/ 等价 /home/acs
  6. 复制:按住shinft,鼠标拉动,在按Ctrl + insert;
  7. 粘贴: shinft + insert;
  8. top 看进程

命令ctrl

  1. ctrl + C: 可以终止当前运行或者换一行并清空

  2. ctrl + U: 可以清除一行

  3. teb:可以补全,按两次有提示

  4. ↑ 键:可以上一条命令

  5. ls:看当前的文件,蓝色文件夹,绿色可执行文件,白色普通文件

    • ls -1:详细文件信息
    • ls -lh:加一个h:更加详细
    • ls -a:可以看隐藏文件
    • ls -A:不显示
    • ls -la:详细文件信息,包括隐藏文件
    • ls | wc -1: 查看有多少个文件
  6. cd:切换目录

    • cd … :返回上一级目录
    • cd - : 返回之前的目录
  7. cp xxx xxx :复制文件,(要加路径),复制时可以重命名,如:cp a/tmp.txt b/tmp2.txt

    • 复制目录:cp a b -r
    • 复制到当前目需要重命名:cp a b -r
    • -r:意思意思是递归
  8. mkdir xxx: 创建文件夹

    mkdir xxx/xxx/xxx: 连续创建文件

    mkdir --h:看命令

  9. history:查看历史命令

  10. touch xxx:创建文件

  11. rm :删除

    • rm *.txt : 删除所以的.txt文件
    • rm xx -r :递归删除,就是强制删除
    • rm a/* : 删除a文件下的所有文件
  12. mv指令:剪切加粘贴,可重命名;

    1. 如:mv a/a.txt b :把a文件夹中的a.txt文件移到b文件夹中
    2. mv a/a.txt b/b1.txt 把a文件夹中的a.txt文件移到b文件夹中并改名b1;也可以mv a.txt b.txt 直接改名
    3. 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中改了键)

  1. tmux:新建一个session,其中包含一个window,window中包含一个pane,pane里打开了一个shell对话框。

  2. Ctrl + a 松手,再按 %,当前pane左右分;

  3. Ctrl + a 松手,再按 ",当前pane上下分;

  4. Ctrl + d :关闭当前pane;如果当前window的所有pane均已关闭,则自动关闭window;如果当前session的所有window均已关闭,则自动关闭session。

  5. tmux attach -t <sission-name>选择window

  6. tumx ls 查看会话

  7. 复制张贴:复制Ctrl + a,松手按左挎号,粘贴Ctrl + a,松手按右挎号

  8. 挂机tmux : ctrl + a 在按 ctrl + z ,在一次进来的话使用fg

  9. 多个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

      1. Ctrl + a :按c:在当前session中创建一个新的window。
      2. Ctrl + a :按w:选择其他window,操作方法与(6)完全相同。
      3. Ctrl + a :按PageUp,PageDn:翻阅当前pane内的内容,或者直接滚轮。
      4. 在tmux中选中文本时,需要按住shift键。仅支持Windows和Linux,不支持Mac,不过该操作并不是必须的,因此影响不大)
        • tmux中复制/粘贴文本的通用方式:
          • (1) 按下Ctrl + a后松开手指,然后按insert
          • (2) 用鼠标选中文本,被选中的文本会被自动复制到tmux的剪贴
          • (3) 按下shinft + insert,内容粘贴到光标处
          • 复制:shinft + 鼠标选中,在按ctrl + insert
          • 粘贴:shinft + insert

vim 三个模式

功能:

  • 命令模式下的文本编辑器
  • 根据文件扩展可自动判别编程语言,支持代码缩进
  • 使用方法: vim filename
    • 文件已经有,直接打开
    • 文件没有,直接并打开
  1. 一般命令模式

    默认模式。命令输入方式:类似于打游戏放技能,按不同字符,即可进行不同操作。可以复制、粘贴、删除文本等。

  2. 编辑模式

    在一般命令模式里按下i,会进入编辑模式。按下ESC会退出编辑模式,返回到一般命令模式。

  3. 命令行模式

    在一般命令模式里按下:/?三个字母中的任意一个,会进入命令行模式。命令行在最下面。可以查找、替换、保存、退出、配置编辑器等。

操作
  • 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/gn1与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! # 脚本输出

注释

  1. 每行中#之后的内容均是注释。
  2. 多行注释:<<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 # 输出空行

变量类型

  1. 自定义变量(局部变量) 子进程不能访问的变量
  2. 环境变量(全局变量) 子进程可以访问的变量
  3. 遍历的定义习惯大写。

自定义变量改成环境变量:

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开始。

  1. 定义 : 数组用小括号表示,元素之间用空格隔开。例如:

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。如果为逻辑关系表达式,则结果为真,stdout1,否则为0
  • exprexit code:如果为逻辑关系表达式,则结果为真,exit code0,否则为1,相当于return。
字符串的表达式:
  • length string 返回string 的长度

  • index STRING CHARSET

    CHARSET中任意单个字符在STRING中最前面的字符位置,下标从1开始。如果在STRING中完全不存在CHARSET中的字符,则返回0

  • substr STRING POSITION LENGTH

    返回STRING字符串中从POSITION开始,长度最大为LENGTH的子串。如果POSITIONLENGTH为负数,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 code0,表示真;为非零,表示假。(与C/C++中的定义相反)
test命令

test命令用于判断文件类型,以及对变量做比较。

test命令用exit code返回结果,而不是使用stdout。0表示真,非0表示假。

例如:

test 2 -lt 3 # 为真,返回值为0
echo $? # 输出上个命令的返回值,输出0

acs@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

测试参数代表意义
-eqa是否等于b
-nea是否不等于b
-gta是否大于b
-lta是否小于b
-gea是否大于等于b
-lea是否小于等于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登入

基本用法

  1. 远程登录服务器:

    ​ 主要是用来的登入服务器的。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:查看栈中所有元素

存到服务器
  1. 创建一个项目

  2. 设置公钥:在.ssh文件夹中id_rsa.pub,复制出来,在ACgit中添加公钥

  3. 本地运行添加:git remote add origin git@git.acwing.com:jlc/project.git建立本地和云端链接

  4. 在运行:git push -u origin master

  5. 从云端复制下来: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: # 将镜像上传到自己租的云端服务器
ssh server_name # 登录自己的云端服务器

docker load -i docker_lesson_1_0.tar # 将镜像加载到本地
docker run -p 20000:22 --name my_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
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值