Skip to content

Git 速查表:专家必备的 14 个 Git 命令

本文译自:Git Cheat Sheet: 14 Essential Git Commands For Experts
原文链接:https://initialcommit.com/blog/git-cheat-sheet-expert
本系列共有三篇文章,本文是第三篇:

  • Git Cheat Sheet: 12 Essential Git Commands For Beginners
  • Git Cheat Sheet: 12 Essential Git Commands For Intermediate Users
  • Git Cheat Sheet: 14 Essential Git Commands For Experts(本文)

介绍

在之前的文章中,我们讨论了一些适用于初学者和中级用户的 Git 命令。

在本文中,我们将讨论专家必备的 14 个 Git 命令。

git submodule

使用 Git 子模块,用户可以在 Git 仓库的子目录中保留和维护另一个 Git 仓库。Git 子模块是指向外部仓库中特定提交的引用。默认情况下,运行 git submodule 命令会显示当前仓库中现有子模块的状态。

用户可以使用以下命令添加新的子模块仓库:

shell
git submodule add <remote-git-submodule-repo-url>

子模块就像一个普通的 Git 仓库,但它嵌套在现有的 Git 仓库中。每个子模块都有自己的 .git/ 隐藏目录,其中包含子模块的对象数据库和 Git 配置信息。您可以像普通仓库一样在子模块中操作文件,例如进行更改、添加到暂存区、提交更改以及将更改推送到远程分支。

但是,您需要在父仓库中提交任何对子模块的更新(无论提交的代码是本地更改还是从远程拉取的),以确保子模块引用的是最新的代码版本。这使得子模块可以被视为父项目的依赖项。还有其他一些子模块命令,您可以通过运行命令 git help submodule 了解它们。

git show

git show 命令显示当前仓库中 Git 对象的元数据。如果不带任何参数运行此命令,则会显示有关 HEAD 提交的信息,包括提交作者、日期、消息、更改的文件和更改的行。

例如,要查看特定 commit ID 的日志消息和文本差异,用户可以运行:

shell
git show <commit-id>

除了指定 commit ID,您还可以使用 branch,tag,blob hash 或者 tree hash。在每种情况下,git show 将显示该对象的内容。

git clean

Git clean 命令会从工作树中删除未跟踪的文件。如果没有提供路径,则从当前目录递归地删除未跟踪的文件。默认情况下,未跟踪的目录会被忽略,但可以通过添加 -d 标志来包含未跟踪的目录。如果提供了路径,则 git clean 仅会影响与该路径匹配的文件。

由于该命令会永久删除文件,因此最好首先使用 --dry-run 选项运行该命令。使用此选项,用户可以查看命令将删除哪些文件。

shell
git clean --dry-run

在确认要删除的文件列表后,可以执行不带 --dry-run 选项的 git clean 命令。

git fsck

Git fsck 命令会检查 Git 仓库中对象的连通性和有效性。使用此命令,用户可以确认仓库中文件的完整性并识别任何已损坏的对象。此命令还将通知用户仓库中是否存在任何悬空对象。这些对象可能占用了仓库中不必要的空间,可以通过运行 git gc 命令来删除它们。

shell
git fsck

下面是 git fsck 命令的一些示例输出:

shell
Checking object directories: 100% (256/256), done.
Checking objects: 100% (3475/3475), done.
dangling blob 2f42ad266a192bd843cd65b2c1cd913e0c97b5d2
dangling blob 31c80610b88c73e8862461db80fb4af3ace39a16
dangling blob b448bc1853b62fe673e0212bb703b2ebe5c45705
dangling commit 9ad0b2fbc1def3fcf1fa98e29460e28e67c95239
dangling blob 19d17737b2de1d1d196d0121a04d8bb0876c472e
dangling blob e2920e4c6c2c8e18334668a443cb89affd59feb7
dangling blob ea188a38f03b5843f9c78687a887110a9e972db5
dangling commit 6324ab475307efbfa79e628a500d747a4bb3a91f

git gc

Git gc 命令会在当前仓库中触发 Git 的垃圾回收。该命令将删除所有无法访问的(孤立的)提交,并压缩存储的 Git 对象,从而释放内存空间。Git 垃圾回收会在像 git pull、merge、rebase 和 commit 这样的命令中自动运行,但手动运行该命令可以帮助清理更新频繁的仓库。

shell
git gc

这是执行 git gc 命令后的一些样例输出:

shell
Enumerating objects: 6538, done.
Counting objects: 100% (6538/6538), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4045/4045), done.
Writing objects: 100% (6538/6538), done.
Total 6538 (delta 3329), reused 3413 (delta 1763)
Computing commit graph generation numbers: 100% (546/546), done.

请注意,在运行了 git gc 命令后再运行 git fsck,我们不会再看到任何的悬空对象:

shell
git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (6538/6538), done.

git reflog

使用 git reflog 命令可以查看本地分支的历史提交记录。默认情况下,git reflog 显示 HEAD 引用的历史信息。为了查看特定引用的 reflog,用户可以通过引用名称进行标识:

shell
git reflog show ref-name

或者,用户可以执行以下命令查看所有引用的 reflog:

shell
git reflog show --all

git cat-file

git cat-file 命令用于显示仓库中指定对象的内容或类型。用户必须提供对象的名称,可以是 blob、tree、commit 或 tag。用户需要添加以下三个标志中的一个来指定显示的内容:使用 -t 标志显示对象类型,使用 -s 标志显示对象大小,使用 -p 标志显示对象的内容。例如,可以使用 -p 显示提交的树、父提交、作者、提交者和提交消息:

shell
git cat-file <commit-id> -p

git write-tree

Git write-tree 命令根据暂存区索引在对象数据库中创建一个新的树。若要根据子目录创建一个树,用户可以添加 --prefix 标志并指定子目录的名称。运行此命令后,新树的哈希值将被打印到标准输出。

例如,要基于当前仓库中的一个子目录写入一个树,用户可以执行以下命令:

shell
git write-tree --prefix=subdirectoryPath

git read-tree

Git read-tree 命令将一个已存在的 Git 树对象的状态复制到索引中。默认情况下,此命令不会更新现有的文件。通过添加 -m 标志,此命令也可以用于将一个或多个树合并到索引中。例如,为了将一个已存在的树合并到索引,开发者可以使用以下命令:

shell
git read-tree -m <tree-hash>

git commit-tree

Git commit-tree 命令根据提供的树创建一个新的提交对象。与普通提交不同,这种提交并不设定新的 HEAD 状态。相反,它仅根据现有树的状态创建一个提交对象,并将其内容的哈希值保存在对象数据库中。运行此命令后,commit ID 会被打印到标准输出。当用户希望在对象数据库中创建一个提交,但又不更新工作分支的历史记录时,此命令可能会很有用。

shell
git commit-tree

git show-ref

Git show-ref 命令列出了本地仓库中所有可用的引用及其关联的 commit ID。默认情况下,此命令显示所有的 tag、head 和远程引用。如果只想显示标签,用户可以添加 --tags 标志;如果只想显示 head,可以添加 --head 标志。此命令也可以用于检查与特定模式匹配的任何现有对象。

例如,为了检查任何与名为 master 的引用匹配的情况,开发者可以使用以下命令:

shell
git show-ref master

若要仅获取与精确路径匹配的对象,用户可以添加 --verify 标志。例如,为了定位在 refs/heads/master 的一个分支,开发者可以使用以下命令:

shell
git show-ref --verify refs/heads/master

git update-ref

Git update-ref 命令用于使引用指向一个新的 Git 对象。例如,为了更新当前分支的 HEAD 以指向一个新的对象,开发者可以使用以下命令:

shell
git update-ref HEAD <new-ref>

如果用户想在更新当前引用之前检查新对象是否与旧对象相同,可以在命令中将旧对象的哈希值作为第三个参数。这样只有当对象的值匹配时,引用才会被更新。例如,如果新对象匹配当前对象,要更新当前分支的 HEAD 以指向新对象,开发者可以使用以下命令:

shell
git update-ref HEAD <new-ref> <current-ref>

git rev-list

Git rev-list 命令按照时间的逆序列出来自一个或多个引用的对象。为了从特定引用获取对象,用户可以将那个引用作为参数包含进来:

shell
git rev-list <ref>

此命令还支持添加参数以指定某些对象。例如,用户可以添加 --all 标志来从所有引用获取对象,添加 --branches 标志来从所有分支 HEAD 获取对象,以及添加 --tags 标志来从所有 tag 获取对象。

git verify-pack

git verify-pack 命令用于确认 Git packfile 的有效性。该命令要求用户提供与所查询的 Git packfile 相关联的 .idx 文件的路径。该 .idx 文件用于快速定位相关 packfile 中的对象。Git packfile 是在 Git 仓库中组织大量文件的有效方式。要获取 packfile 中所有对象的列表,用户可以添加 -v(详细)标志:

shell
git verify-pack packfile.idx -v

总结

通过这些高级命令,开发人员可以执行管理任务,以高效地处理和维护他们的 Git 仓库。对于经常有多个用户进行贡献的仓库,这些命令可能是维护一个干净项目的必要工具。