目录
基础知识
目录
绝对路径:从根目录(/)开始描述
相对路径:从当前位置开始描述的路径
. 当前目录
.. 上一级目录
~/ 家目录
基本指令
ctrl c 取消命令,并且换行
ctrl u 清空本行命令
tab 补全命令,如果补全不了,按两下,给出提示
↑ 给出之前输入的命令
ls 展出列表(蓝色文件夹 白色普通文件 绿色可执行文件)
- -l 文件的读写执行信息,大小信息,修改时间
- -lh 大小信息读写更加人性化(K,M等)
- . 开头的文件是隐藏文件
- mv .a.txt a.txt 将隐藏文件变成非隐藏文件
- -a 显示所有文件
- -A 不显示当前目录和上层目录
- pwd 显示当前文件目录
- cd 切换到某个目录下
- cd .. 切换到上一级目录
- cd - 切换到上一次待过的目录
- cp xxx yyy 将xxx文件复制到yyy,也可以重命名
- cp = 复制+粘贴+重命名
- cp xxx yyy -r 将xxx文件夹复制到yyy文件夹下,-r是递归处理
- mv 同cp,相当于剪切,同样可以重命名
- 文件名有空格 转移字符(/)+空格
- mkdir xxx:创建目录
- mkdir a/b/c -p:创建多级目录
- history 指令输入的历史
- rm xxx 删除文件
- rm xxx -r 删除文件夹(-r递归删除,-f删除受保护的文件)
- rm * -rf 删除该目录下所有文件,包括受保护的文件
- touch xxx 创建文件
- cat xxx 查看文件内容
tmux+vim
tmux
tmux的功能:
- 分屏,从而"实现两个黑框可以互抄"
- 在断开连接(关掉黑框,断网等)之后,继续运行(挂在云端去运行)
tmux可以开启很多session,每个session可以开启很多window,每个window可以开启多个pane,每个pane可以开启一个shell (正常1session1window多pane就够用了)
常见指令:
- tmux:开启一个session(session-window-pane)
- 开启一个新的pane:ctrl+a松开,shift+5(%) 左右各一个pane
- 关闭一个pane ctrl+d
- 开启一个新的pane(上下分成两个部分) ctrl+a松开,shift+'(")
- 鼠标可以选择 pane
- ctrl+a松开,再移动方向键可以选择需要的pane
- 鼠标拖动pane之间的分割线,可以调整分割线的位置
- 按住ctrl+a,移动方向键来调整分割线的位置
- ctrl+a松开,按z 可以使当前pane全屏或者取消分屏
- ctrl+a松开,按d 挂起当前session
- tmux a 打开之前挂起的session
- ctrl+a松开,按s 选择其它session
- ↑ 选择上一项
- ↓ 选择下一项
- → 展开当前项
- ← 闭合当前项
- ctrl+a松开,按c 在当前session中创建一个新的window(为了更清楚,常常1session对于1window)
- ctrl+a松开,按w 选其它window
- ctrl+a松开,按pageUp 翻阅当前pane内的内容
- 鼠标滚轮 翻阅当前pane内的内容
- 在tmux中选中文本时,需要按住shift
- tmux ls 列出所有session
- tmux kill-session -t session名
vim
vim的功能:
- 命令行模式下的文本编辑器
- 根据文本扩展名自动判别编程语言,支持代码缩进,代码高亮等功能
- 使用方式 vim filename 如果已有该文件,则打开它;否则打开一个新的文件,并命令位filename
vim的三种模式:
- 一般命令模式:输入命令,支持复制(y)粘贴(p)删除(d)等操作
- 编辑模式
- 输入i:进入编辑模式(insert)
- 退出编辑模式:Esc键
- 命令行模式:
- 按下:/?三个字母的任意一个就会进入命令行模式(命令行在下面)
- 命令行模式可以进行查找(/),替换(:),保存(w),退出(q),配置编辑器等
- 退出:wq保存+退出
- 如何判断在哪个模式下,可以在编辑框中输入,那就是在编辑模式,如果可以在下方输入,那就是在命令行模式;如果两个地方都不能输入,那就是在一般命令模式
常见指令:
- 以下都是在一般命令模式下:
- h:左,l:右,j:下,k:上
- n<space>:n表示数字,按下数字后再按空格,光标会向右移动这一行的n个字符
- n<tab>:下标往下移n行
- 0或home键,光标回到本行开头
- $光标移到本行结尾
- G光标移到最后一行
- nG或者:n 移到第n行
- gg 到第一行
- v选中文本:配合移动光标的指令使用(n<space>,0,$,nG,gg,G)
- 按两下Esc取消选中
- d 剪切选中的文本
- dd 剪切当前行
- y 复制选中的文本
- yy 复制当前行
- p 将复制的数据在光标的下一个位置粘贴
- u 撤销
- ctrl+r 取消撤销
- shift+> 将选中的文本整体向右移动
- shift+< 将选中的文本整体向左移动
- gg=G 将全文代码格式化
- ggdG 删除全文
- ctrl+q 当vim卡死时,可以取消当前正在执行的命令
- 以下都是在命令行模式下
- /str 从下查找第一个字符串
- ?str 从上查找第一个字符串
- n 重复前一个查找操作 N反向重复前一个查找操作(一般命令模式,配合查找)
- :n1,n2s/str1/str2/g:n1,n2使数字,在第n1行和第n2行之间查找str1,并将其替换成str2
- :1,$s/str1/str2/g:将全文的str1替换成str2
- :1,$s/str1/str2/gc:将全文的str1替换成str2,且在替换前要求用户确认(每一个)
- :w 保存
- :w! 强制保存
- :q 退出
- :q! 强制退出
- :wq 保存并退出
- :set paste 设置成粘贴模式,取消代码自动缩进(防止多重缩进)
- :set nopaste 取消粘贴模式,开启代码自动缩进
- :set nu 显示行号(number)
- :set nonu 隐藏行号
- :noh 关闭查找关键字高亮
- 编辑模式下,
- 粘贴shift+fn+insert
- 复制ctrl+fn+insert
- (系统的剪切板)
- d y p vim内部的剪切板
异常处理:
- 每次用vim编辑文本时,会自动创建一个.filename.swp的临时文件.如果打开某个文件时,该文件的swp文件已存在,则会报错(读写冲突).此时解决方法有两种:
- 找到正在打开该文件的程序,并退出
- 直接删除该swp文件即可
shell语法
基础知识
shell是我们通过命令行与操作系统沟通的语言。shell脚本可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复用。命令行输入的各个指令可以看成是一个“shell脚本在逐行执行”。
Linux中常见的脚本有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- 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
字符串
- 字符串可以用单引号,也可以用双引号,也可以不用引号
- 单引号与双引号的区别:
- 单引号中的内容会原样输出,不会转义以及取变量;
- 双引号中的内容可以转义、可以取变量等,同不加引号;
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}
默认变量
- 文件参数变量:在执行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(不可嵌套) |
数组
- 数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。数组下标从0开始。
- 数组用小括号表示,元素之间用空格隔开
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命令用于求解表达的值
注意:
- 用空格隔开每一项
- 用反斜杠放在shell特定的字符前面(发现表达式运行错误时,可以试试转义)
- 对包含空格和其他特殊字符的字符串要用引号括起来
- expr会在stdout中输出结果。后接逻辑表达式,为真,stdout为1
- 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.逻辑运算符 && ||
- 两者具有短路原则:对&&,第一个参数为假,第二个参数不计算;对||,第一个参数为真,第二个参数不计算
- 表达式的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 pull:将远程仓库的当前分支与本地仓库合并(就是将远程仓库当前分支拉到本地)
- 将本地版本信息提交到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