git 单分支快照
包含 init
add
tag
reset
restore
等子指令
创建仓库
在所在文件夹中创建空的仓库(即创建 .git 文件夹)
1 | git init |
记录变动
查看文件状态
展示文件是否在工作树被改变、是否被记录在暂存区
1 | git status [--] [<pathspec>…] |
<pathspec>
用来指定查看哪些文件
添加工作树改动到暂存区
将工作树文件的变动记录到暂存区
1 | git add [-i] [-f] |
一般地,有 添加(新文件)、修改(已有文件)、删除(已有文件) 三种操作
-i
交互式操作-f
强行添加,能够添加被忽略文件(“被忽略文件”见《git 其余操作》)<pathspec>
记录指定文件的变动- 当不指定文件路径时,对于工作树所有文件:
--all
(使用.
路径同理) 记录被 修改、添加、删除 了的文件--no-all
记录被 修改、添加 了的文件--update
添加全部被 修改、删除 了的文件
提交暂存区到版本库
将暂存区中记录下来的变动“打包”为一个版本,保存到版本库
1 | git commit [-a] [--amend] |
-a
自动add --update
全部--amend
改写最近的 commit(改变历史,罪恶!)-m <msg>
命令行指定commit说明;不指定则使用文本编辑器
还原文件
使用 restore
指令,本质上是逆向应用了变动
还原工作树文件
以下两条命令的 --worktree
可省略
-
暂存区 -> 工作树
1
git restore --worktree [--] <pathspec>…
-
版本库 -> 工作树
1
git restore --worktree -s <commit> [--] <pathspec>…
-s
指定想要采用的版本;不指定则默认HEAD
- 在仓库还没有 commit 的时候不可用
- 注意这个操作能够删除工作树文件
- 配合
git rev-list -n 1 HEAD -- <filename>
可搜索曾经被删除的文件
还原暂存区文件
-
版本库 -> 暂存区
1
git restore --staged -s <commit> [--] <pathspec>…
省略 -s <commit>
则默认代表还原至 HEAD
一般用于将记录的变动从暂存区去除
在仓库还没有 commit 的时候不可用
管理版本库
查看 commit 历史
1 | git log --graph --all --oneline |
--graph
使用树状图示--all
显示全部 commit--oneline
简化显示信息
查看 commit 具体信息
1 | git show <commit-ish> |
抵消版本历史(推荐)
以提交一个新 commit 的形式,抵销以往变动,直至版本与指定的 commit 一致
1 | git revert <commit>… |
回退到历史上的 commit (尽量少用)
将本地版本库的 HEAD 回退到某个 commit
1 | git reset [--soft | --mixed | --hard] <commit> |
--soft
切换 HEAD--mixed
切换 HEAD 、丢弃暂存区(默认操作)--hard
切换 HEAD、丢弃暂存区、还原工作树
删除第一个 commit (为什么会被用到?)
第一个也是唯一的 commit
1 | git update-ref -d HEAD |
切换到任意 commit(小心!)
注意!此操作后会产生“分离了的HEAD”!
1 | git switch --detach [<commit-ish>] |
如果出了问题
- 如果不知道 HEAD 现在在哪里了:
- 可以参照《设置及其他》中 查看操作历史 一节,使用
git reflog
获取HEAD
的历史位置,再用git reset
回去 - 可以尝试通过
git log --all
看到所有尚且存在(对误操作的git reset
无效)的 commit 并reset
回去 - 如果进行了《远程相关操作》,
git pull
视情况也可以帮忙
- 可以参照《设置及其他》中 查看操作历史 一节,使用
- 如果出现“分离了的HEAD”问题,可以
switch
到分支,以恢复;见《多分支操作》 - 如果不小心在旧 commit 上创建了新 commit,可以把它创建成一个新分支再处理;见《多分支操作》
- 如果出现“历史不匹配”问题,用
merge
可以将它们合并;见《多分支操作》
查看各区间文件差异
工作树 vs 暂存区
1 | git diff [--] [<path>…] |
工作树 vs 版本
1 | git diff <commit> [--] [<path>…] |
暂存区 vs 版本
1 | git diff --cached [<commit>] [--] [<path>…] |
版本 vs 版本
-
指定版本
1
git diff <commit> <commit> [--] [<path>…]
-
指定范围
1
git diff [<options>] <revision range> [--] [<path>…]
<revision range>
有以下两种形式<commit1>..<commit2>
双点等同于^<commit1> <commit2>
其中^
代表不显示<commit1>...<commit2>
三点表示仅显示二者不同的部分(A…B == A…B + B…A)
给 commit 打标签
如果出错并推送了,处理起来会很麻烦
添加 tag
1 | git tag [-f] [-m <msg>] <tagname> [<commit>] |
-f
强制替换标签-m
标签信息
删除标签
1 | git tag -d <tagname>… |
列出标签
1 | git tag -l |
推送 tag
1 | git push <remote> tag <tag name> |