Git 基础指令速查

本文列出了 Git 常用基础指令的速查表。

初次运行 Git 前的配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 查看 Git 现有配置及其所在文件
git config --list --show-origin
# 设置 Git 用户名,用于提交
git config --global user.name "YourName"
# 设置 Git 用户邮箱,用于提交
git config --global user.email your@email
# 设置 Git 调用的文本编辑器
git config --global core.editor vim
# 查看 Git 所有能找到的配置
git config --list

获取 Git 仓库

在现有目录中初始化仓库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 进入需要创建仓库的文件夹
cd ~/MyProject
# 初始化一个空的 Git 仓库
git init
# 添加需要追踪的文件
git add *.c *.h *.sh *.py Makefile
# 查看仓库状态,决定哪些文件无需追踪,可忽略
git status
# 提交更新
git commit

克隆已有仓库

1
2
3
4
5
6
# 克隆本地仓库
git clone /path/to/repository
# 克隆远程服务器上的仓库,使用 SSH 传输协议
git clone username@hostname:/path/to/repository
# 克隆远程服务器上的仓库,使用 https:// 协议
git clone https://github.com/path/to/repository

忽略的文件及文件夹

  • 所有空行或者以 # 开头的行为注释。
  • 可以使用标准的 glob 模式匹配,且会递归地应用在整个仓库中。
    • glob 模式指 shell 所使用的简化了的正则表达式。
    • ? 匹配任意1个字符;
    • [abc] 匹配列在方括号中的任意1个字符;
    • [0-9] 匹配两个字符范围内的任意1个字符;
    • * 匹配任意0个或多个字符;
    • a/**/z 匹配任意中间目录,如 a/z, a/b/z, a/b/c/z 等。
  • / 开头可防止递归。
  • / 结尾可指定特定目录。
  • ! 开头可取反,即指明需要追踪的文件。

创建并编辑 Git 仓库根目录中的 .gitignore 文件以列出可忽略的文件及文件夹:

1
vim .gitignore
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 忽略所有以 .a 结尾的文件
*.a
# 但追踪所有 lib.a 即使前面忽略了 .a
!lib.a
# 只忽略当前目录下的 TODO 文件
/TODO
# 忽略任意目录下的 build 文件
build/
# 忽略 doc/notes.txt, 但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf

Git 基础操作

查看仓库当前状态

1
2
3
4
# 查看仓库当前状态
git status
# 以简洁的输出格式查看仓库当前状态
git status -s

跟踪新文件/暂存新修改

1
2
# 跟踪新文件/暂存新修改
git add <filename>

对比查看修改

1
2
3
4
# 查看尚未暂存的修改,对比已暂存的快照
git diff
# 查看已暂存的修改,对比上一次提交的结果
git diff --staged, --cached

提交修改

1
2
3
4
5
6
7
8
9
# 提交修改
git commit
# 显式提交修改
git commit -m "This is a new commit."
# 跳过暂存步骤,直接提交所有对已追踪文件的修改
git commit -a
# 相当于以下两条命令
git add *
git commit

移除文件

1
2
3
4
# 移除对文件 <filename> 的追踪
git rm <filename>
# 移除仓库中的文件 <filename> ,但仍将文件保留在本地磁盘
git rm --cached <filename>

移动/重命名文件

1
2
3
4
5
6
# 移动/重命名文件
git mv <oldfile> <newfile>
# 相当于运行了下面三条命令
mv <oldfile> <newfile>
git rm <oldfile>
git add <newfile>

查看提交历史

 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
# 查看提交历史
git log
# 查看每次提交更新的内容
git log -p, --patch
# 查看每次提交的简略统计信息
git log --stat
# 查看提交历史,以特定的显示格式
git log --pretty=oneline, short, full, fuller
git log --pretty=format:"%h - %an, %ar : %s"
# 以 ASCII 图形显示分支与合并历史
git log --graph
# 查看最近的 n 条提交历史
git log -n
# 查看给定时间范围内的提交历史
git log --since=, --after=, --until=, --before=
# 查看特定作者/提交者的提交历史
git log --author=, --committer=
# 查看提交说明中包含指定字符串的提交历史
git log --grep=
# 查看提交内容中包含指定字符串的提交历史
git log -S function_name
# 查看提交历史时隐藏合并提交
git log --no-merges
# 查看特定目录或文件的提交历史,相关路径须放在最后,并以 -- 与之前的选项隔开
git log --pretty="%cr : %s" --author="newverse" --since="2023-01-01" -- mysite/

撤销操作

1
2
3
4
5
6
7
8
# 撤销提交,即用新的提交操作覆盖最近一次提交信息而非记录一个新的提交
# 可稍微改进最近一次提交,避免笔误、遗漏等非必要的提交信息污染仓库历史
git commit --amend
# 撤销暂存操作,确保未对文件 <filename> 做其他修改
git add *
git reset HEAD <filename>
# 撤销对文件 <filename> 所做的修改,还原成最近一次提交的状态
git checkout -- <filename>

git reset HEAD <filename> 命令以及 git checkout -- <filename> 命令都是危险的命令,有可能导致文件在本地的修改彻底消失且无法恢复,请务必谨慎使用。

远程仓库的使用

基础操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 查看本地追踪的远程仓库,显示远程仓库在本地的简称
git remote
# 查看本地追踪的远程仓库的简称及其对应的 URL
git remote -v
# 添加远程仓库并为其指定一个简称 <shortname>,后续可使用该简称代替相应的 URL
git remote add <shortname> <url>
# 查看远程仓库 <remote> 的信息
git remote show <remote>
# 重命名远程仓库在本地的简称
git remote rename <oldname> <newname>
# 移除在本地追踪的远程仓库 <remote> 及其相关的远程追踪分支和配置信息
git remote remove <remote>

与远程仓库的交互

1
2
3
4
5
6
7
# 从远程仓库 <remote> 中抓取 (fetch)
# 将远程仓库中的数据下载到本地仓库,不会自动合并或修改当前工作
git fetch <remote>
# 从远程仓库中拉取 pull,抓取远程仓库后合并跟踪的远程分支到当前分支
git pull
# 将本地分支 <branch> 推送到远程仓库 <remote>
git push <remote> <branch>

标签的使用

创建标签

Git 支持两种标签:轻量标签 (lightweight) 与附注标签 (annotated) 。

  • 轻量标签:指向某个特定提交的引用。
  • 附注标签:存储在 Git 数据库中的一个完整对象,包含创建标签者的名字、邮件,创建标签的时间以及对应的标签信息(类似于提交信息)。
1
2
3
4
5
6
# 为最近一次提交创建轻量标签
git tag <tagname>
# 为最近一次提交创建附注标签
git tag -a <tagname> -m "tag description"
# 为之前的某次提交创建附注标签,需给出该提交所对应的检验和(或部分检验和)<checksum>
git tag -a <tagname> <checksum>

使用 git log --pretty=oneline 命令列出提交历史,显示结果中每一行代表一次提交。每行的前半部分即为该提交的检验和,其由无规律的数字和字母组成。我们可以选取检验和的前n位字符作为指向相应提交的检验和的简写(即部分检验和),要求选取的这前n位字符不与其他提交的检验和的前n位重复,即可唯一定位该提交。

查看标签

1
2
3
4
# 查看标签
git tag
# 按照给定的通配符查看标签
git tag -l, --list "v1.*"

检出标签

1
2
# 检出标签,查看某个标签所指向的文件版本
git checkout <tagname>

这会使本地仓库处于“分离头指针 (detached HEAD) “状态。在此状态下的新提交将不属于任何分支,且只能通过确切的提交哈希值才能访问。

删除标签

1
2
# 删除标签
git tag -d <tagname>

远程仓库标签互动

默认情况下,git push 命令并不会将标签推送到远程仓库中,必须显式推送标签到远程仓库。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 推送标签到远程仓库
git push <remote> <tagname>
# 将所有不在远程仓库中的标签全部推送至远程仓库
# 推送的标签并不会区分轻量标签或附注标签,没有简单的选项只推送某一类标签
git push <remote> --tags

# 删除远程仓库中的标签
git push <remote> --delete <tagname>
# 将 `:` 前的空值推送到远程标签名,从而高效地删除标签
git push <remote> :refs/tags/<tagname>

Git 别名

可以通过 git config 文件来为某些常用命令设置便于输入的别名,如:

1
git config --global alias.ci commit

此后可输入 git ci 来代替 git commit 以提高效率。

还可以添加一个 last 命令来方便的查看最近一次提交:

1
git config --global alias.last 'log -1 HEAD'

此后可输入 git last 来查看最近一次提交。


参考资料:

0%