Linux学习记录

目录

基础知识

目录

基本指令

tmux+vim

tmux

vim

shell语法

基础知识

常用命令

expr命令

read命令

echo命令

printf命令

test命令和判断符号[]

条件语句、循环语句和函数

条件语句

循环语句

函数

exit命令

文件重定向

引入外部脚本

ssh和git

ssh

git

git基本概念:

git常用命令


基础知识

目录

绝对路径:从根目录(/)开始描述

相对路径:从当前位置开始描述的路径

.         当前目录

..         上一级目录

~/      家目录

基本指令

ctrl c        取消命令,并且换行

ctrl u        清空本行命令

tab        补全命令,如果补全不了,按两下,给出提示

↑        给出之前输入的命令

ls        展出列表(蓝色文件夹 白色普通文件 绿色可执行文件)

  1. -l        文件的读写执行信息,大小信息,修改时间
  2. -lh      大小信息读写更加人性化(K,M等)
  3. .         开头的文件是隐藏文件
    1. mv .a.txt a.txt 将隐藏文件变成非隐藏文件
  4. -a      显示所有文件
  5. -A      不显示当前目录和上层目录
  6. pwd   显示当前文件目录
  7. cd      切换到某个目录下
    1. cd ..     切换到上一级目录
    2. cd -      切换到上一次待过的目录
  8. cp xxx yyy   将xxx文件复制到yyy,也可以重命名
    1. cp = 复制+粘贴+重命名
  9. cp xxx yyy -r     将xxx文件夹复制到yyy文件夹下,-r是递归处理
  10. mv     同cp,相当于剪切,同样可以重命名
  11. 文件名有空格      转移字符(/)+空格
  12. mkdir xxx:创建目录
  13. mkdir a/b/c -p:创建多级目录
  14. history   指令输入的历史
  15. rm xxx      删除文件
  16. rm xxx -r      删除文件夹(-r递归删除,-f删除受保护的文件)
    1. rm * -rf      删除该目录下所有文件,包括受保护的文件
  17. touch xxx      创建文件
  18. cat xxx      查看文件内容

tmux+vim

tmux

tmux的功能:

  1. 分屏,从而"实现两个黑框可以互抄"
  2. 在断开连接(关掉黑框,断网等)之后,继续运行(挂在云端去运行)

tmux可以开启很多session,每个session可以开启很多window,每个window可以开启多个pane,每个pane可以开启一个shell  (正常1session1window多pane就够用了)

常见指令:

  1. tmux:开启一个session(session-window-pane)
  2. 开启一个新的pane:ctrl+a松开,shift+5(%)   左右各一个pane
  3. 关闭一个pane      ctrl+d
  4. 开启一个新的pane(上下分成两个部分) ctrl+a松开,shift+'(")
  5. 鼠标可以选择 pane
  6. ctrl+a松开,再移动方向键可以选择需要的pane
  7. 鼠标拖动pane之间的分割线,可以调整分割线的位置
  8. 按住ctrl+a,移动方向键来调整分割线的位置
  9. ctrl+a松开,按z     可以使当前pane全屏或者取消分屏
  10. ctrl+a松开,按d     挂起当前session
  11. tmux a    打开之前挂起的session
  12. ctrl+a松开,按s      选择其它session
    1. ↑     选择上一项
    2. ↓     选择下一项
    3. →   展开当前项
    4. ←   闭合当前项
  13. ctrl+a松开,按c     在当前session中创建一个新的window(为了更清楚,常常1session对于1window)
  14. ctrl+a松开,按w     选其它window
  15. ctrl+a松开,按pageUp     翻阅当前pane内的内容
  16. 鼠标滚轮    翻阅当前pane内的内容
  17. 在tmux中选中文本时,需要按住shift
  18. tmux ls 列出所有session
  19. tmux kill-session -t session名

vim

vim的功能:

  1. 命令行模式下的文本编辑器
  2. 根据文本扩展名自动判别编程语言,支持代码缩进,代码高亮等功能
  3. 使用方式 vim filename 如果已有该文件,则打开它;否则打开一个新的文件,并命令位filename

vim的三种模式:

  1. 一般命令模式:输入命令,支持复制(y)粘贴(p)删除(d)等操作
  2. 编辑模式
    1. 输入i:进入编辑模式(insert)
    2. 退出编辑模式:Esc键
  3. 命令行模式:
    1. 按下:/?三个字母的任意一个就会进入命令行模式(命令行在下面)
    2. 命令行模式可以进行查找(/),替换(:),保存(w),退出(q),配置编辑器等
    3. 退出:wq保存+退出
  4. 如何判断在哪个模式下,可以在编辑框中输入,那就是在编辑模式,如果可以在下方输入,那就是在命令行模式;如果两个地方都不能输入,那就是在一般命令模式

常见指令:

  1. 以下都是在一般命令模式下:
    1. h:左,l:右,j:下,k:上
    2. n<space>:n表示数字,按下数字后再按空格,光标会向右移动这一行的n个字符
    3. n<tab>:下标往下移n行
    4. 0或home键,光标回到本行开头
    5. $光标移到本行结尾
    6. G光标移到最后一行
    7. nG或者:n  移到第n行
    8. gg  到第一行
    9. v选中文本:配合移动光标的指令使用(n<space>,0,$,nG,gg,G)
      1. 按两下Esc取消选中
    10.  剪切选中的文本
    11. dd  剪切当前行
    12. y 复制选中的文本
    13. yy  复制当前行
    14. p    将复制的数据在光标的下一个位置粘贴
    15. u    撤销
    16. ctrl+r     取消撤销
    17. shift+>   将选中的文本整体向右移动
    18. shift+<   将选中的文本整体向左移动
    19. gg=G    将全文代码格式化
    20. ggdG    删除全文
    21. ctrl+q    当vim卡死时,可以取消当前正在执行的命令
  2. 以下都是在命令行模式下
    1. /str   从下查找第一个字符串
    2. ?str  从上查找第一个字符串
    3. n 重复前一个查找操作   N反向重复前一个查找操作(一般命令模式,配合查找)
    4. :n1,n2s/str1/str2/g:n1,n2使数字,在第n1行和第n2行之间查找str1,并将其替换成str2
    5. :1,$s/str1/str2/g:将全文的str1替换成str2
    6. :1,$s/str1/str2/gc:将全文的str1替换成str2,且在替换前要求用户确认(每一个)
    7. :w    保存
    8. :w!   强制保存
    9. :q     退出
    10. :q!    强制退出
    11. :wq   保存并退出
    12. :set paste    设置成粘贴模式,取消代码自动缩进(防止多重缩进)
    13. :set nopaste    取消粘贴模式,开启代码自动缩进
    14. :set nu     显示行号(number)
    15. :set nonu     隐藏行号
    16. :noh    关闭查找关键字高亮
  3. 编辑模式下,
    1. 粘贴shift+fn+insert
    2. 复制ctrl+fn+insert
    3. (系统的剪切板)
    4. d y p vim内部的剪切板

异常处理:

  1. 每次用vim编辑文本时,会自动创建一个.filename.swp的临时文件.如果打开某个文件时,该文件的swp文件已存在,则会报错(读写冲突).此时解决方法有两种:
    1. 找到正在打开该文件的程序,并退出
    2. 直接删除该swp文件即可

shell语法

基础知识

shell是我们通过命令行与操作系统沟通的语言。shell脚本可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复用。命令行输入的各个指令可以看成是一个“shell脚本在逐行执行”。

Linux中常见的脚本有:

  1. Bourne Shell(/usr/bin/sh或/bin/sh)
  2. Bourne Again Shell(/bin/bash)
  3. C Shell(/usr/bin/csh)
  4. K Shell(/usr/bin/ksh)

这里学习的是bash中的语法。文件开头使用的是 #! /bin/bash。指明bash为脚本解释器

第一个tesh.sh文件

#! /bin/bash
# 这是一条注释
echo "hello,world" #这也是一条注释

将test.sh变成可执行文件

chmod +x test.sh

运行该脚本文件

./test.sh # 当前目录下运行

也可以解释器执行(输入bash命令,会睡眠原进程,而开一个新的子进程,退出进程输入exit或者Ctrl+D)

bash test.sh

单行注释

#! /bin/bash
# 这是一条注释
echo "hello,world" #这也是一条注释

# 多行注释,EOF可以被替换成其它字符串
:<<EOF
注释1
注释2
...
EOF

变量定义

name=gx      # 可以不加引号
name1='gx'   # 可以加单引号
name2="gx"   # 可以加双引号

使用变量

echo ${name}
echo ${name1}
echo ${name2}

使变量只读:使用readonly或者declare

readonly name
declare -r name  # 两种写法均可

删除变量:unset

unset name

自定义变量(局部变量,子进程不能访问)和环境变量(全局变量,子进程可以访问的变量)

自定义变量变成环境变量

export name   # 方式1
declare -x name # 方式2

环境变量变成自定义变量

declare +x name

字符串

  1. 字符串可以用单引号,也可以用双引号,也可以不用引号
  2. 单引号与双引号的区别:
    1. 单引号中的内容会原样输出,不会转义以及取变量;
    2. 双引号中的内容可以转义、可以取变量等,同不加引号;
name1=gaoxiang
echo 'hello,${name} \"hh\"'
echo "hello,${name} \"hh\""
echo hello,${name} \"hh\"

        3.获取字符串长度

echo ${#name1}

        4.提取子串

name3=hello,gaoxiang
echo ${name3:0:5}

默认变量

  1. 文件参数变量:在执行shell脚本时,可以向脚本传递参数。$1是第一个参数,$2是第二个参数,以此类推。特殊的,$0是文件名(包含路径)
echo "文件名:" $0
echo "第一个参数:" $1
echo "第二个参数:" $2
echo "第三个参数:" $3
echo "第四个参数:" $4

        2.其它参数相关变量

$#文件传入的参数个数
$*由所有参数构成的用空格隔开的字符串(一对双引号)
$@每个参数分别用双引号括起来的字符串(多对双引号)
$$脚本当前运行的进程ID
$?上一条命令的退出状态(exit code),0表示正常退出
$(command)返回command这条命令的stdout(可嵌套)
`command`返回command这条命令的stdout(不可嵌套)

数组

  1. 数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。数组下标从0开始。 
  2. 数组用小括号表示,元素之间用空格隔开
array=(0 abc "def" gx)

     3.也可以直接定义数组中某个元素的值,数组定义不需要是连续的

array[1000]=1000

      4.读取数组中某个元素的值

echo ${array[0]}
echo ${array[1]}
echo ${array[2]}
echo ${array[3]}

      5.读取整个数组

echo ${array[@]}
echo ${array[*]}

      6.获取数组长度

echo ${#array[@]}
echo ${#array[*]}

常用命令

expr命令

expr命令用于求解表达的值

注意:

  1. 用空格隔开每一项
  2. 用反斜杠放在shell特定的字符前面(发现表达式运行错误时,可以试试转义)
  3. 对包含空格和其他特殊字符的字符串要用引号括起来
  4. expr会在stdout中输出结果。后接逻辑表达式,为真,stdout为1
  5. expr的exit code。后接逻辑表达式,为真,exit code为0

1.返回字符串长度

str="string"
expr length ${str}

2.返回字符第一次出现的位置(下标从1开始)

expr index ${str} "ACWing"

3.得到字符串子串(location length不为正数,那么返回原字符串)

expr substr ${str} 1 3

4.整数字符串 + - * / % ()改变优先级

  • 注意:复杂表达式求值,先写出原始表达式,在开始加空格和转义
a=3
b=4
expr ${a} + ${b}
expr ${a} - ${b}
expr ${a} \* ${b}
expr ${a} / ${b}
expr ${a} % ${b}
# expr 复杂表达式求值,先写出原始表达式,在开始加空格和转义
expr \( ${a} + 1 \) \* \( ${b} + 1 \)

5.逻辑关系表达式 | & < <= > >= = == != ()

  • 注意:| & 具有短路原则,即|第一个参数非空且真,那么第二个参数不计算,直接返回第一个参数;&第一个参数为空或为假,那么第二个参数不计算,直接返回0
a=3
b=4
expr ${a} \> ${b}
# 特殊符号用引号也行
expr ${a} '>' ${b}
expr ${a} '<' ${b}
expr ${a} '<=' ${b}
expr ${a} \<\= ${b}

c=0
d=5
expr ${c} '&' ${d}  # 两个都非空且非0,返回第一个参数,否则返回0
expr ${c} '|' ${d}  # 第一个参数非空且非0,返回第一个参数,否则返回第二个参数
expr ${a} '&' ${b}
expr ${a} '|' ${b}

read命令

read命令用于从标准输入中读取单行数据。当读到文件结束符(ctrl+d)时,exit code为1,否则为0。

参数说明:

  • -p: 后面可以接提示信息
  • -t:后面跟秒数,定义输入字符的等待时间,超过等待时间后会自动忽略此命令
read Name
echo "hello,${Name}"
# read两个参数 -p后面接提示信息 -t后面接秒数,表示输入命令的等待时间,超过则忽略该命令
read -p "请输入你的名字" -t 5 NAme
echo ${NAme}

echo命令

echo用于输出字符串

1.显示普通字符串

echo "hello,shell"
echo hello,shell
echo 'hello,shell'

2.显示转义字符

# 显示转义字符
echo "\"hello,shell\""
# 单引号不会转义
echo '\"hello,shell\"'
# 不加引号可以转义
echo \"hello,shell\"

 3.显示变量

NAME=gx
echo "my name is ${NAME}"

4.显示换行

# 显示换行 -e开启转义 echo自带换行
echo -e "HI\n"
echo "shell"

 5.显示不换行

# 显示不换行  -e开启转义 \c不换行
echo -e "Hi \c"
echo "shell"

6.显示结果定向至文件

echo "hello,shell" > output.txt

 7.原样输出字符串,不进行转义或取变量(用单引号)

name00=gxxxx
echo '${name}\"'

8.显示命令的执行结果

echo `date`   # echo $(date)

printf命令

printf命令用于格式化输出。默认不会在字符串末尾添加换行符。

printf "%10d.\n" 123  # 占10位,右对齐
printf "%-10.2f.\n" 123.123123123 # 左对齐,保留两位小数
printf "My name is %s\n" "gx" # 格式化输出字符串
printf "%d * %d = %d\n" 2 3 `expr 2 \* 3`

test命令和判断符号[]

1.逻辑运算符 && ||

  1. 两者具有短路原则:对&&,第一个参数为假,第二个参数不计算;对||,第一个参数为真,第二个参数不计算
  2. 表达式的exit code为0表示真

2.test命令

  • 在命令行中输入man test,可以查看test命令的用法。
  • test命令用于判断文件类型,以及对变量做比较。
  • test命令用exit code返回结果,而不是使用stdout。0表示真,非0表示假。
test 1 -lt 2  # less than
echo $?  # 输出上一个指令的返回值
  •  文件类型判断 -e文件是否存在 -d文件是否为文件 -d文件是否为文件夹
# test命令可用作判断语句
# test -e filename 判断文件是否存在,存在返回0
test -e test.sh && echo "exist" || echo "not exist"
test -e test0.sh && echo "exist" || echo "not exist"

# 文件类型判断
# test -e filename 判断文件是否存在
test -e test.sh
echo $?
# test -f filename 判断是否是文件
test -f test.sh
echo $?
# test -d filename 判断是否是文件夹
test -d test.sh
echo $?
test -d homework
echo $?
  • 文件权限判断 -r是否可读 -w是否可写 -x是否可执行 -s是否为空文件
# 文件权限判断
test -r test.sh  # 判断是否可读
echo $?
test -w test.sh  # 判断是否可写
echo $?
test -x tesh.sh  # 判断是否可执行
echo $?
test -s tesh.sh  # 判断是否为非空文件
echo $?
  • 整数间的比较 -eq是否相同 -ne是否不等 -gt是否大于 -lt是否小于 -ge是否大于等于 -le是否小于等于
# 整数间的比较
a=1
b=2
test ${a} -eq ${b} && echo "a==b" || echo "a!=b"
test ${a} -ne ${b} && echo "a!=b" || echo "a==b"
test ${a} -gt ${b} && echo "a>b" || echo "a<=b"
test ${a} -lt ${b} && echo "a<b" || echo "a>=b"
test ${a} -ge ${b} && echo "a>=b" || echo "a<b"
test ${a} -le ${b} && echo "a<=b" || echo "a>b"
  • 字符串比较 -z是否为空 -n是否非空 ==是否相同 !=是否不等
# 字符串比较 -z字符串是否为空 -n字符串是否为非空 == 字符串是否相同
str1=abc
str2=abc
test -z str1 && echo "${str1}为空" || echo "${str1}非空"
test -n str2 && echo "${str2}非空" || echo "${str2}为空"
  • 多重条件判断 -a是否同时满足(and) -o是否满足一个(or)  !取反
# 多重条件判断
# -a 两条件是否同时成立 and
# -o 两条件是否至少一个成立 or
# ! 取反
test -r test.sh -a -w test.sh && echo "test.sh可读可写" || echo "test.sh不可读又可写"
test -r test.sh -o -w test.sh && echo "test.sh可读或/且可写" || echo "test.sh不可读不可写"
test ! -x test.sh && echo "test.sh不可执行" || echo "test.sh不可执行"

 3.判断符号[]

[]与test用法几乎一模一样,更常用于if语句中。另外[[]]是[]的加强版,支持的特性更多。

注意:

  • []内的每一项都要用空格隔开
  • 中括号内的变量,最好用双引号括起来
  • 中括号内的常数,最好用单或双引号括起来
[ 1 -lt 2 ]
echo $?
[ -e test.sh ] && echo "exist" || echo "not exists"
[ -e test2.sh ] && echo "exist" || echo "not exist"
NAME="njust gx"
# [ ${NAME} == "njust gx"] 报错,因为左边是 njust gx,相当于两个参数
[ "${NAME}" == "njust gx" ] && echo "equal" || echo "not equal"

条件语句、循环语句和函数

条件语句

  • if ... then .... fi
a=3
b=4
if [ "${a}" -lt "${b}" ] && [ "${a}" -gt "2" ]
then
    echo "${a}在范围内"
fi
  • if ... then ... else ... fi
if [ "${a}" -lt "${b}" ]
then
    echo "${a}小于${b}"
else
    echo "${a}不小于${b}"
fi
  •  if ... then ... elif ... then ... else ... fi
if [ "${a}" -lt 1 ]
then
    echo "${a}小于1"
elif [ "${a}" -lt 2 ]
then
    echo "${a}小于2"
else
    echo "${a}不小于2"
fi
  • case ... esac ... 类似于switch语句
case "${a}" in
    1)
        echo "${a}等于1"
        ;;                 # 相当于break
    2)
        echo "${a}等于2"
        ;;
    *)                     # 相当于default
        echo "其它"
        ;;
esac

循环语句

  • for ... in ... do ... done
for i in a b c
do
    echo ${i}
done
for i in `ls`  # 指令的输出序列
do
    echo ${i}
done
for i in $(seq 1 10)
do
    echo ${i}
done
for i in {1..10} # {10..1} {a..z}
do
    echo ${i}
done
  • for ((...;...;...)) do ... done
for ((i=1;i<=12;i++))
do
    echo ${i}
done
  •  while ... do ... done
# 文件结束符是ctrl+d,当输入ctrl+d后,read指令返回false
while read name
do
    echo "${name}"
done
  • until ... do ... done
# 条件为真时,结束循环
until [ "${str}" == "yes" ] || [ "${str}" == "YES" ]
do
    read -p "请输入yes/YES来结束循环" str
done
  •  break 跳出当前一层循环。不能跳出case语句(就是必须有;;)
while read name
do
    for ((i=0;i<=10;i++))
    do
        case ${i} in
            5)
                break
                ;;
            *)
                echo ${i}
                ;;
        esac
    done
done
  • continue 跳出本次循环
for((i=0;i<=10;i++))
do
    if [ `expr ${i} % 2` -eq 0 ]
    then
        continue
    fi
    echo ${i}
done
  •  死循环的处理
    • ctrl + c
    • 关闭进程:top找到进程号 kill -9 PID

函数

  • bash中函数返回值是exit code,取值是0-255,0表示正常结束
  • 若要获取函数的输出结果,使用echo输出到stdout,然后使用$(func_name)获取stdout的结果,此时只将输出返回到$(),而不输出
  • return值使用$?获取,不写return,默认是return 0
func() {
    name=gx
    echo "hello ${name}"
}

func

echo $(func)
echo $?
  • 函数的输入参数
    • $1表示第一个输入参数 $2表示第二个输入参数...$0表示文件名
    • 递归函数内的echo并不是直接输出,而是被$(func)接收($(func xxxx),$()会读取函数的stdout而不直接输出出来
func() {
    word=""
    while [ "${word}" != "y" ] && [ "${word}" != "n" ]
    do
        read -p "是否进入func($1)函数?请输入y/n" word
    done
    if [ "${word}" == "n" ]
    then
        echo 0
        return 0
    fi
    if [ $1 -le 0 ]
    then
        echo 0
        return 0
    fi
    sum=$(func $(expr $1 - 1))
    echo $(expr $sum + $1)
}

echo $(func 10)
  • 函数内的局部变量:作用范围仅在当前函数内。local 变量名=变量值
func() {
    local name111=gx
    echo ${name111}
}
func
echo ${name111}

exit命令

  • exit 退出当前进程。并返回一个退出状态
  • 使用$?接收退出状态
  • exit可以接收一个整数值作为参数,代表退出状态,如果不指定,默认状态值为0
  • exit退出状态是一个介于0~255之间的整数,其中0表示成功,其它均表示失败
  • return是结束整个函数
  • exit是结束整个shell脚本
if [ $# -ne 1 ]
then
    echo "arguments not valid"
    exit 1
else
    echo "arguments valid"
    exit 0
fi

文件重定向

  • 每个进程默认打开3个文件描述符
    • stdin 标准输入,从命令行读取数据,文件描述符为0
    • stdout标准输出,向命令行输出数据,文件描述符为1
    • stderr标准错误输出,向命令行输出数据,文件描述符为2
  • 可以用文件重定向将这3个文件描述符重定向到其它文件中
    • command > file 将stdout重定向到file中
    • command < file 将stdin重定向到file中
    • command >> file 将stdout以追加方式重定向到file中
    • command n> file 将文件描述符n重定向到file中
    • command n>> file 将文件描述符n以追加方式重定向到file中
echo -e "hello \c" > output.txt
echo "shell" >> output.txt
read str < output.txt
echo ${str}

引入外部脚本

.filename 或者 source filename

test6.sh脚本

#! /bin/bash

name=gx

 引入外部脚本

source test6.sh

read a
read b
echo $(expr "$a" + "$b") # expr表达式注意空格
#echo $(expr "$a"+"$b")

echo "My name is ${name}"

将input.txt里面的数据当作test.sh的输入,并将tesh.sh的输出写入到output.txt中

./test.sh < input.txt > output.txt

ssh和git

ssh

  • 远程登陆服务器:ssh user@hostname
    • user:用户名
    • hostname:IP地址或者域名
  • 第一次连接需要确认安全,一路回车即可。服务器的信息会记录在~/.ssh/known_hosts文件中。然后输入密码即可。
  • 指定端口登录:ssh user@hostname -p 22
  • 配置服务器别名登录。在~/.ssh/config文件中写入
Host myserver
    HostName IP地址或者域名
    User 用户名 
  • 以后直接 ssh myserver就可以连接服务器
  • 免密登录
    • 本地创建密钥:ssh-keygen
    • 一路回车。执行完毕之后,在~/.ssh目录下会有两个文件
      • id_rsa:私钥
      • id_rsa.pub:公钥
    • 向免密登录哪个服务器,就将公钥传给哪个服务器。即,如果想免密登录myerver服务器,就将公钥信息复制到myserver服务器中的~/.ssh/authorized_keys文件中即可。
    • 或者使用命令一键添加公钥:ssh-copy-id myserver
  • 在本地对远程服务器执行命令:ssh myserver command (-p是创建多级目录时)
ssh myserver ls -a
或者
# 单引号中$i可以求值:单引号$i不会在本地解析,传过去就是$i,所以可以正常输出0,1,2,..
ssh myserver 'for ((i = 0; i < 10; i ++ )) do echo $i; done'
# 双引号中$i不可以求值:双引号$i在本地解析,传过去$i=null,所以不能正常输出0,1,2,...
ssh myserver "for ((i = 0; i < 10; i ++ )) do echo $i; done"
  • scp传文件
    • 基本命令 scp source destination:将source目录下的文件复制到destination下
    • 一次复制多个文件scp source1  source2 source3 destination
    • 复制文件夹 scp -r source destination
    • destination是本地当前文件夹,用.表示
    • scp命令下的-r -p等参数尽量加在source,destination之前
    • 使用scp配置其它服务器的vim和tmux
      • scp ~/.vimrc ~/.tmux.conf myserver:
    • 服务器的家目录下myserver:homework或者myserver:~/homework
    • 服务器的根目录下myserver:/home/

git

git基本概念:

  • 工作区:仓库的目录,工作区是独立于各个分支的(每个版本都有自己的工作区)
  • 暂存区:数据暂存的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的(每个版本都有自己的暂存区)
  • 版本库:存放所有已经提交到本地仓库的代码版本
  • 版本结构:树结构,树中的每个节点代表一个代码版本(维护历史版本)
  • 工作区 放入 暂存区 提交 版本库(变成一个点)
  • HEAD是指向当前版本的指针

git常用命令

  • 配置git信息
    • 新建文件.config
    • git config --global user.name xxx:设置全局用户名,信息记录在~/.gitconfig文件中
    • git config --global user.email xxx@xxx.com:设置全局邮箱地址,信息记录在~/.gitconfig文件中
  • 创建项目:mkdir project
    • cd project
    • git init:使该目录变成git工作区,信息记录在隐藏的.git文件夹中。在该目录下创建修改文件
  • 将本地项目删除,从云端下载项目到本地:git clone git@git.acwing.com:xxx/xxx.git
  • 单人开发常用指令
    • git pull:将远程仓库的当前分支与本地仓库合并(就是将远程仓库当前分支拉到本地)
      • git pull origin xxx
    • git add xxx:将xxx文件添加到暂存区
      • git add .:将所有待加入暂存区的文件加入暂存区
      • 删除文件xxx之后也是,git add xxx,这是将对xxx的修改(包括创建、删除、修改)保存在暂存区
    • git commit -m "xxx":将暂存区的内容提交到当前分支,需要备注信息
    • git push -u :将当前分支推送到远程仓库(第一次需要-u)
      • git push origin xxx:将xxx分支推送到远程仓库
    • git status:查看仓库状态
    • git diff xxx:查看xxx文件相对暂存区的改变(工作区和暂存区的区别)
    • git rm --cached xxx:将xxx文件从删除
    • git restore --staged xxx:将xxx文件从暂存区拿出来,还有
    • git restore xxx:将对xxx文件的修改撤回,工作区中,未放入暂存区
    • git log:从起点到HEAD这条分支上的版本信息
      • git log --pretty-oneline:单行显示
    • git reflog:HEAD指针的移动历史
    • git reset --hard HEAD^^/HEAD~:将HEAD回滚两个版本
      • git reset --hard HEAD~100:回滚100个版本
      • 回滚之后的工作区就是当前指针所指版本的工作区
  • 将本地版本信息提交到git云端
    • 在云端创建空项目(取消使用自述文件初始化文件)
    • 添加SSH密钥:将本地服务器的公钥复制即可。(将本地与git云端绑定,从而可以直接从本地上传版本到git云端)
    • git remote add origin git@git.acwing.com:flyhigh/project.git:将本地仓库关联到远程仓库
    • git push -u origin master(-u第一次才需要):将master分支推送到远程仓库
  • 分支操作
    • git checkout -b xxx:创建并切换到xxx这个分支
    • git branch:查看所有分支和当前所处分支
    • git checkout xxx:切换到xxx这个分支
    • git merge xxx:将分支xxx合并
    • git branch -d xxx:删除本地仓库的xxx分支
      • 在本地将分支删除,云端并不会被同步的删除
      • 删除云端分支:git push -d origin xxx
    • git branch xxx:创建新分支
    • 合并分支时会有冲突,手动编辑文件到需要的状态即可
    • git push:将分支上传到git云端,在哪个分支,就能将该分支推到云端
      • 先要在云端创建该分支,git push --set-upstream origin xxx
    • 将云端的分支传到本地:
      • 首先在本地创建分支 git checkout -b xxx
      • 然后将云端分支与本地分支绑定
        • git pull origin xxx --allow-unrelated-histories(下面那个出错时运行该命令)
        • git branch --set-upstream-to=origin/xxx xxx
      • 最后将云端最新内容拉到本地 git pull
    • 将云端当前分支与本地当前分支合并
      • git pull origin xxx
      • pull将云端同步到本地,push将本地同步到云端
  • 栈操作
    • git stash:将工作区和暂存区中尚未提交的修改存入栈中
    • git stash apply:将栈顶存储的修改恢复到当前分支,但不删除栈顶元素
    • git stash drop:删除栈顶存储的修改
    • git stash pop:将栈顶存储的修改恢复到当前分支,同时删除栈顶元素(恢复到当前分支,但是需要重写add commit)
    • git stash list:查看栈中所有元素
  • 多人协作:多人对同一个文件操作,可能产生冲突,此时单独对这个文件vim即可
  • 错误:fatal:remote origin already exists(遇到错误直接网上查询处理方法即可)
    • git remote remove origin
    • git remote add origin xxx(clone地址)
    • git push -u origin master
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值