git 单分支快照

回到笔记目录

包含 init add tag reset restore 等子指令

创建仓库

在所在文件夹中创建空的仓库(即创建 .git 文件夹)

1
git init

记录变动

查看文件状态

展示文件是否在工作树被改变、是否被记录在暂存区

1
git status [--] [<pathspec>…​]
  • <pathspec> 用来指定查看哪些文件

添加工作树改动到暂存区

将工作树文件的变动记录到暂存区

1
2
3
git add [-i] [-f]
[--all] [--no-all] [-u | --update]
[--] [<pathspec>]

一般地,有 添加(新文件)、修改(已有文件)、删除(已有文件) 三种操作

  • -i 交互式操作
  • -f 强行添加,能够添加被忽略文件(“被忽略文件”见《git 其余操作》)
  • <pathspec> 记录指定文件的变动
  • 当不指定文件路径时,对于工作树所有文件:
    • --all (使用. 路径同理) 记录被 修改、添加、删除 了的文件
    • --no-all 记录被 修改、添加 了的文件
    • --update 添加全部被 修改、删除 了的文件

提交暂存区到版本库

将暂存区中记录下来的变动“打包”为一个版本,保存到版本库

1
2
git commit [-a] [--amend]
[-m <msg>]
  • -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
2
git log --graph --all --oneline
[<revision range>] [[--] <path>…​]
  • --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>