ZhangYang's Blog

vim、linux、git命令行

vim命令行基础

  • vim是一个操作文本的编辑器,对文本进行添加、删除、复制、粘贴.

常用命令入门

  • 查看文件:cat test.html
  • 查看并编辑:vim test.html ,按下 i 会发现左下角出现 –INSERT– 表示可以输入内容
  • 保存文件:按 esc , shift + : ,左下角出现 : ,输入 w 表示保存 ,输入 q 表示退出 ,输入 wq 表示保存退出
  • 光标操作:按 esc ,使用 k 上一行, j 下一行 , h 向前, l 向后,也可以使用键盘箭头键来实现
  • 删除内容:按 esc ,使用光标移动到想要删除的位置 dd 删除当前行, x 删除当前一个, 5x删除后面5个, 5X 删除前面5个, u 恢复前一次操作
  • 快速翻页:按 ctrl + d 向下滚动半屏, ctrl + u 向上滚动半屏, ctrl + f 向下滚动一屏, ctrl + d 向上滚动半屏
  • 给文本添加行号: 按 esc ,输入 :set nu , ctrl + g 显示此时光标所在位置的行号和总列数,输入 :set nonu取消行号,快速切换行号按 esc ,输入 : 0 切换到头部,例如输入:20光标切换到20行号位置.
  • 跳转段落结尾: 按 esc , shift + ( 跳转到上一段落, shift +) 跳转到后一段落
  • 实现复制和粘贴: 按 esc ,在光标所在位置按下 yy 表示复制当前行 , p 表示粘贴
  • 查找某个字符串: 按esc , 输入:/foo 表示搜索字符串foo

常用命令基础

光标移动

命令 作用
h,j,k,l 分别表示左,下,右,上
ctrl + f 上一页
ctrl + b 下一页
o 开启新的一行
^ 一行的开始
$ 一行的结尾
gg 文档的第一行
[N]G 文档的第N行或者最后一行

编辑

命令 作用
r 分别表示左,下,右,上
J 合并下一行到上一行
s 删除光标所在的一个字符,光标还在当行
S 删除光标所在的一行,光标还在当行,不同于dd
u 撤销上一步操作
ctrl + r 恢复上一步操作
. 重复最后一个命令
~ 变换为大写

插入模式

命令 作用
i 插入到光标前面
I 插入到行的开始位置
a 插入到光标的后面
A 插入到行的最后位置
o,O 新开一行
Esc 关闭插入模式

退出

命令 作用
:w 保存
:wq 保存并关闭
:q 关闭(已保存)
:q! 强制关闭

剪切/赋值

命令 作用
v 选中一个或多个字符
V 选中一行
dd 删除一行
dw 删除一个单词
x 删除后一个字符
X 删除前一个字符
D 删除一行最后一个字符
[N]yy 复制一行或者N行
yw 复制一个单词
p 粘贴

>>简明vim命令行


Linux命令行基础

常用命令行

  • pwd 查看当前完整路径
  • ls 不包括隐藏文件
  • ls -a 查看当前目录下所有文件(包括隐藏文件)
  • ls -al 查看当前目录下所有文件(包括隐藏文件)的详细信息
  • cd 切换目录(cd /c/project、cd code、cd ../css、cd ~/Desktop)
  • touch 创建文件 (touch readme.md)
  • rm 删除文件,不能删除文件夹(rm readme.md)
  • rm -rf 删除文件夹(rm -rf node_modules)
  • mv 重命名文件(mv readme.md README.md)
  • mkdir 创建文件夹(mkdir projects)
  • mkdir test; mv test test2; rm -rf test2; 组合操作,分号间隔,若第一个命令错了也会依次执行后面的命令
  • mkdir test && mv test test2 组合操作,&&间隔,若第一个命令错了则不会执行后面的命令
  • cp 复制,复制文件用法cp a b(两个参数);复制文件夹用法cp -r test test2
  • echo 1 > test.txt 表示在test.txt输入1,但是后续再次输入会将上一次的覆盖
  • cat 把文件内容输出出来,用法cat test.txt; cat test.txt | less 可以一页页的看,K往上看,G往下看,Q退出
  • head 显示文本的前几行,要确定是前几行的用法为head -n 3 test.txt,这是显示文本的前三行
  • tail 与head相反,是显示文本的后几行
  • du 显示目录大小
  • du -sh 总的大小
  • -xxx –help xxx -h man xxx 查看帮助文档
  • which xxx 表示命令在哪里

文件路径

  • cd / 根目录
  • cd ~ 家目录
  • cd books(cd ./books) 当前目录
  • cd ..(cd ../css) 上级目录

Git命令行基础

  • Git是一款免费、开源的分布式版本控制系统(CVS),用于敏捷高效地处理任何或小或大的项目

建立公钥与私钥的练习

  • 本地库与远程库需要配置,才能正常链接

>>ssh配置

常用命令

  • git config user.name 用户名(加–global表示以后都不用再输入了)
  • git config user.email 电子邮箱(加–global表示以后都不用再输入了)
  • git init 在本地生成库
  • git add xxx 将xxx文件添加进缓存区
  • git add . 将所有的文件都添加进缓存区
  • git commit -am “代码提交信息” 提交代码至本地仓库,并产生版本号
  • git clone git@github.com:someonexxxx.git 将代码仓库clone到本地
  • git status -sb 查看文件状态
  • git push origin master(本地分支名):master(远程分支名) 推送到远程仓库
  • git pull origin master 同步github库的内容
  • git remote add origin xxxxx 在本地添加远程仓库
  • git branch xxx 创建新分支并命名
  • git branch 查看有多少分支
  • git checkout xxx 移动到xxx分支上
  • git merge 合并分支
  • git branch -d xxx 删除分支
  • git reset commit 回滚到指定的commit(后面的信息删除)
  • git revert commit 撤销指定的commit(只是增加一个信息撤销)

简单使用

  • github必须先新建一个空仓库

基本概念(四个区)

  • 工作文件夹:不加入缓冲区git不管
  • 暂存区 Stage:纳入git管理记录
  • 本地仓库 Local:纳入版本控制(是本地的库,其他人不生效)
  • 远程仓库 Remote:在远程服务器,可使用ssh/git/https协议

操作步骤

  • 已修改(modified) 修改了某个文件,但还没有提交保存(touch a.md、echo “hello” > a.md)
  • 已暂存(staged) 把已修改的文件放在下次提交时要保存的清单中(git add a.md、git add .)
  • 已提交(mommitted) 该文件已经被安全地保存在本地数据库中了(commit add -am “add a.md”)

image

起步

  • 初次使用需要设置姓名和邮箱
1
2
git config --global user.name "你的姓名"
git config --global user.email johndoe@example.com

clone 项目

  • 用于把一个GitHub是的项目clone(下载)到本地变为本地仓库
1
2
3
git clone git@github.com:jirengu/blog.git
cd blog

新增文件并写入内容

1
2
3
4
5
6
# 创建文件
touch a.md
# 在文件里写入一个字符串
echo "hello" > a.md
# 查看文件状态
git status

保存文件到缓存区

1
2
3
4
# 把当前目录下的新增和修改的文件添加到暂存区
git add .
# 查看文件状态
git status

提交到本地库

1
2
3
# 把暂存区的更新提交到本地库
git commit -am "add file"
git status

推送到远程库

1
2
# 把当前本地库里的改动推送到远程库(origin)的master 分支
git push origin master

修改删除文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 把远程仓库的变动更新合并到本地仓库
git pull
# 修改文件
vim a.md
git add .
# 这里需要注意,如果提交消息包含大量字符串,提交参数不用加 m
# 此时会进入 vim 界面,按下i进入编辑状态,进行编辑
# 编辑完成后按下 esc 进入命令态, 输入 :wq 保存退出 vim
git commit -a
git push origin master
rm -rf a.md
git add .(git rm a.md)
git commit -am "删除a.md"
# 如果之前已经git push origin master 过,后面可以直接简化成 git push
git push

复杂使用

  • 本地创建一个 git 项目推送到远程空仓库

新建文件夹初始化git仓库,增加文件并写入内容,保存到缓存区,并提交到本地库

1
2
3
4
5
6
7
8
9
10
11
12
13
mkdir newProject
cd new Project
# 把一个文件夹初始化成一个本地 git 仓库
# 注意 仓库和文件夹的区别在于仓库下有一个隐藏的 .git文件夹,里面有一些信息
# 对于一个仓库,删除.git文件夹,就变成一个普通文件夹了
git init
touch index.html
echo "hello" > index.html
git add .
git commit -am "init"

查远程库地址,给远程库地址添加标签,推送本地库到远程库

1
2
3
4
5
6
7
# 查看本地库里记录的远程库地址,还没有建立联系
git remote -v
# 这里把远程库的地址添加个标签叫origin
git remote add origin git@github.com:jirengu/blog2.git
# 推送到远程库地址
git push origin master

增、删、改远程库的标签及对应地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#慎用,这样会强制推送,会覆盖别人的代码
git push -f origin master
# 在添加一个远程库的标签
git remote add gitlab git@gitlab.com:abc/blog.git
# 推送到gitlab标签的地址上
git push gitlab master
# 删除gitlab 标签
git remote remove gitlab
# 修改origin标签对应的地址
git remote set-url origin git@github.com:jirengu/blog3.git
# 把 gitlab 标签改名为coding
git remote rename gitlab coding

分支操作

1
2
3
4
5
6
7
8
9
10
11
12
# 创建本地库dev 分支
git branch dev
# 切换到dev 分支
git checkout dev
touch b.md
git add .
git commit -am "add b.md"
# 推送到origin地址的dev分支上
git push origin dev

分支合并

1
2
3
4
git checkout master
# 把 dev 分支上的内容合并到当前分支(master) 上
git merge dev

冲突

  • 当自己和别人改同一个文件的同一个地方,在执行gitpull时更新本地合并时会出现冲突

解决冲突

  • 修改冲突文件
  • 重新提交

模拟多人操作

  • 前提先在github手动创建一个仓库test

新建本地文件与远程仓库联系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 新建文件夹test,查找test,新建文件readme.md
midir test
cd test
touch readme.md
# 初始化暂存库,将所有修改添加到缓存区
git init
git add .
# 提交缓存区到本地库
git commit -am "add readme"
# 为远程库添加标签,并将本地库推送到远程库
git remote add origin git@github.com:zy343134464/test.git
git push -u origin master

第一个人的操作

  • 在master上拉一个分支来增加新功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 查看本地分支和远程分支
git branch -a
# 更新本地当前同名分支的代码(防止远程同名分支有修改,同一个分支的更新)
git pull (origin master)
# 创建并切换分支dev
git branch dev
git checkout dev
# 将当前分支推送到远程仓库并命名dev分支
git push -u origin dev
# 切换到dev分支并更新下当地分支dev
git checkout dev
git pull(origin dev) 更新dev分支防止有人在远程库修改
# 增加文件index.html并修改readme.md
touch index.html
vim readme.md
# 将修改新增文件添加缓存区,缓存区提交到本地库
git add .
git commit -am "new index.html,modift readme"
# 本地库推送到远程库dev分支
git push -u origin dev
# 当dev已经完成,要最后的发布,先将远程master合并到本地dev
git merge master(将最新的远程master合并到你的本地dev,这时候dev是最新)
# 最后的发布
git push -u origin dev
# 本地切换到master,将远程的dev合并到本地的master,发布最新版的master
git checkout master
git merge dev
git push -u origin master

第二个人的操作

  • 再第二个人开发完后已经合并master的分支上拉一个分支
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 查看本地分支和远程分支
git branch -a
# 更新本地当前同名分支的代码(防止远程同名分支有修改,同一个分支的更新)
git pull (origin master)
# 创建并切换分支branch-test
git branch-test
git checkout branch-test
# 将当前分支推送到远程仓库并命名branch-test分支
git push -u origin branch-test
# 切换到dev分支并更新下当地分支branch-test
git checkout branch-test
git pull(origin branch-test) 更新branch-test分支防止有人在远程库修改
# 修改readme.md
vim readme.md
# 将修改新增文件添加缓存区,缓存区提交到本地库
git add .
git commit -am "modify readme"
# 本地库推送到远程库branch-test分支
git push -u origin branch-test
# 当branch-test已经完成,要最后的发布,先将远程master合并到本地branch-test
git merge master(将最新的远程master合并到你的本地branch-test,最新版本)
# 出现了冲突,原因是readme.md文件第一个人也修改了,git不知道听谁
# 解决冲突,找到readme.md,商量要留哪部分,保留要的部分
# 并将修改添加到缓存库,提交到本地库,发布到远程库
git add .
git commit -am "merge master"
git push -u origin branch-test
# 本地切换到master,将远程的branch-test合并到本地的master,发布最新版的master
git checkout master
git merge branch-test
git push -u origin master

查看代码提交记录,回溯代码

1
2
3
4
5
6
7
8
# 查看前三次操作的信息
git log -l 3
# 回溯到指定的commit(回到commit,删除commit之后的所有操作信息)
git reset --hard bcfe87a4e61076324a58a96af3e6e9cc87eddfec
# -f强制提交
git push -f -u origin dev
1
2
3
4
5
# 查看前三次操作的信息
git log -l 3
# 回溯到指定的commit(只是撤销指定的commit,增加一版本删除指定的commit)
git revert bcfe87a4e61076324a58a96af3e6e9cc87eddfec