你可能不知道的 20 个 Git 命令

2025-05-25

你可能不知道的 20 个 Git 命令

如果你曾经浏览过git 手册(或运行git 命令man git),你就会注意到 git 的功能远比我们大多数人日常使用的要丰富得多。其中很多命令都非常强大,可以让你的工作更加轻松(其他一些命令虽然比较小众,但仍然值得了解)。

这篇文章概述了我最喜欢的 20 个未充分利用的 git 功能,您可以使用它们来提升您的开发流程,给您的同事留下深刻印象,帮助您回答 git 面试问题,最重要的是 - 玩得开心!

内容(和 TL;DR)


Git Web

运行git instaweb即可立即浏览 gitweb 中的工作存储库

Git 内置了基于Web 的可视化工具,可用于浏览本地代码库,让您能够通过浏览器中的 GUI 查看和管理代码库。它包含许多实用功能,包括:

  • 浏览和逐步检查修订并检查差异、文件内容和元数据
  • 直观地查看提交日志、分支、目录、文件历史记录和附加数据
  • 生成提交和存储库活动日志的 RSS 或 Atom 提要
  • 搜索提交、文件、更改和差异

要打开它,只需git instaweb在你的仓库中运行即可。你的浏览器会弹出并加载http://localhost:1234。如果你没有安装 Lighttpd,可以使用 标志指定一个备用 Web 服务器。其他选项可以通过标志(例如端口、打开的浏览器等)或在 git 配置中的代码块下-d进行配置。-p-b[instaweb]

还有git gui命令,可以打开基于 GUI 的 git 应用程序

Git GUI 的屏幕截图


Git 注释

用于git notes向提交添加额外信息

有时您需要向 git 提交附加额外的数据(不仅仅是更改、消息、日期时间和作者信息)。

注释存储在内.git/refs/notes,并且由于它与提交对象数据分开,因此您可以随时修改与提交相关的注释,而无需更改 SHA-1 哈希。

您可以git log使用 大多数 Git 图形界面应用程序或命令来查看注释git notes show。一些 Git 主机也会在提交视图中显示注释(尽管GH 不再显示注释)。


Git Bisect

git bisect可以使用二分搜索找到引入 bug 的提交

bisect 是最强大且易于使用的 git 命令之一,在调试时绝对是救星。启动 bisect 后,它会帮你检出提交,你可以告诉它该提交是good(无 bug)还是bad(引入了 bug),这样你就可以缩小范围,找到出现 bug 的最早提交。

首先运行,git bisect start然后使用 传递一个已知的正确提交git bisect good <commit-hash>和一个已知的错误提交(默认为当前提交)git bisect bad <optional-hash>。它会检出介于正确提交和错误提交之间的提交,然后使用git bisect good或 指定是否存在错误git bisect bad。之后,它会重复该过程,检出介于正确提交和错误提交之间的提交,直到找到导致错误的确切提交。您可以随时使用 取消git bisect reset

bisect 命令还有更多功能,包括重播、查看提交、跳过,因此下次调试时值得查看文档。


Git Grep

用于git grep搜索代码、文件、提交或整个仓库中的任何其他内容

你是否需要在 git 项目中的任何地方搜索字符串?使用 git grep,你可以轻松地在整个项目和分支中搜索任何字符串或正则表达式(就像更强大的Ctrl+ F!)。

git grep <regexp> <ref>

它包含许多选项,可用于缩小搜索范围或指定结果格式。例如,您可以-l仅返回文件名、-c指定每个文件返回的匹配数、-e排除符合条件的结果、--and指定多个条件以及-n按行号搜索。

由于 git grep 与正则表达式兼容,您可以更高级地使用要搜索的字符串。
您还可以使用它来指定文件扩展名,例如git grep 'console.log' *.js,它将显示 JavaScript 文件中的所有 console.log 文件。

第二个参数是引用,可以是分支名称、提交、提交范围或其他任何值。例如,git grep "foo" HEAD~1将搜索上一个提交。


Git 档案

用于git archive将整个 repo 合并为一个文件

共享或备份仓库时,通常倾向于将其存储为单个文件。使用 git archive 命令可以包含所有仓库历史记录,因此可以轻松地将其提取回原始格式。该命令还包含许多附加选项,因此您可以精确自定义存档中包含和不包含的文件。

git archive --format=tar --output=./my-archive HEAD
Enter fullscreen mode Exit fullscreen mode

Git 子模块

用于git submodule将任何其他存储库拉入您的存储库

在 Git 中,子模块允许你将一个仓库挂载到另一个仓库,通常用于核心依赖项或将组件拆分到单独的仓库中。更多信息,请参阅此博文

运行以下命令会将模块拉取到指定位置,并创建一个.gitmodules文件,以便在克隆代码库时始终下载该文件。使用--recursive标志可在克隆代码库时包含子模块。

git submodule add https://github.com/<user>/<repo> <path/to/save/at>
Enter fullscreen mode Exit fullscreen mode

还有git subtree,它可以做类似的事情,但不需要元数据文件。


Git Bug 报告

用于git bugreport编写错误单,包括 git 和系统信息

此命令将捕获系统信息,然后打开一个标准的 bug 模板(包括重现步骤、实际输出和预期输出等)。完成后的文件应该是一个非常完整的 bug 报告,包含所有必要的信息。

如果您是开源包的维护者并要求用户(开发人员)提出错误报告,这将非常方便,因为它可以确保包含所有必要的数据。

如果您要向核心 git 系统提交错误报告,您也可以运行该git diagnose命令,然后在此处提出您的问题。


Git Fsck

用于git fsck检查所有对象,或恢复无法访问的对象

虽然不经常需要,但有时你可能需要验证 git 存储的对象。这时,fsck(即文件系统检查)就派上用场了。它会测试对象数据库,并验证所有对象的 SHA-1 ID 及其建立的连接。

它还可以与--unreachable标志一起使用,以查找不再可从任何命名引用访问的对象(因为与其他命令不同,它包含中的所有内容.git/objects)。


Git Stripspace

用于git stripspace格式化给定文件中的空格

最佳实践是避免在行尾使用空格,避免出现多个连续的空行,避免在输入的开头和结尾出现空行,并在每个文件末尾添加一个新行。有很多特定于语言的工具可以自动完成这些操作(例如 Prettier),但 Git 也内置了此功能。

它适用于元数据(提交消息、标签、分支描述等),但如果您将文件通过管道传输到它,然后将响应通过管道传输回文件,它也可以工作。例如cat ./path-to-file.txt | git stripspacegit stripspace < dirty-file.txt > clean-file.txt

您还可以使用它来删除注释(使用--strip-comments),甚至注释掉行(使用--comment-lines)。


Git 差异

git diff可以比较两组代码之间的差异

你可能知道,你可以运行 diffgit diff命令来显示自上次提交以来的所有更改,或者用它git diff <commit-sha>来比较两次提交,或者比较一次提交与 HEAD 之间的差异。但 diff 命令的功能远不止于此。

您还可以使用它来比较任意两个文件diff file-1.txt file-2.txt(无需再访问diffchecker.com!)

或者使用以下方法比较两个分支或引用git diff branch1..branch2

请注意,双点 ( ..) 与空格相同,表示 diff 输入应该是分支的顶端。但您也可以使用三点 ( ...) 将第一个参数转换为两个 diff 输入之间共享的祖先提交的引用 - 非常有用!如果您只想跨分支比较单个文件,只需将文件名作为第三个参数传入即可。

您可能希望查看在给定日期范围内所做的所有更改,对于此用途git diff HEAD@{7.day.ago} HEAD@{0}(上周),这可以再次与文件名、分支名称、特定提交或任何其他参考配对。

还有git range-diff命令,它提供了一个用于比较提交范围的简单界面。

git diff 工具还有更多功能(以及使用您自己的 diff 检查器的选项),因此我建议查看文档


Git 钩子

用于hooks在发生给定的获取操作时执行命令或运行脚本

Hook 几乎可以让你自动化所有事情。例如:确保符合标准(提交消息、分支名称、补丁大小)、代码质量(测试、lint)、向提交附加附加信息(用户、设备、工单 ID)、调用 webhook 记录事件或运行管道等等。

大多数 git 事件都有可用的前置和后置钩子,例如提交、变基、合并、推送、更新、应用补丁等。

钩子存储在 中.git/hooks(除非你使用 在其他位置配置它们git config core.hooksPath),并且可以使用git hook命令进行测试。由于它们只是 shell 文件,因此可以用来运行任何命令。

Hook 不会被推送到远程仓库,因此为了在团队中共享和管理它们,你需要使用Hook 管理器,例如lefthookhusky。此外,还有一些第三方工具可以简化 Hook 的管理,我推荐overcommit

请记住,钩子总是可以被跳过(使用--no-verify标志),所以永远不要纯粹依赖钩子,特别是对于任何与安全相关的事情。


Git Blame

用于git blame显示特定修订和行的作者信息

经典做法是快速找出特定代码行的编写者(也就是哪个同事应该为这个 bug 负责!)。但它也有助于确定代码更改的时间点,并检查该提交及其相关元数据。

例如,要查看 index.rs 第 400 行至 420 行的作者和提交信息,您可以运行:

git blame -L 400,420 index.rs
Enter fullscreen mode Exit fullscreen mode

Git LFS

存储大文件以git lfs避免拖慢你的仓库

您的项目通常会包含较大的文件(例如数据库、二进制资产、存档或媒体文件),这会减慢 Git 工作流程并超出使用限制。这时,大文件存储就派上用场了——它使您能够将这些大型资产存储在其他地方,同时保持 Git 可跟踪它们,并保持相同的访问控制/权限。LFS 的工作原理是将这些较大的文件替换为 Git 中可跟踪的文本指针。

要使用它,只需运行git lfs track <file glob>,它将更新您的.gitattributes文件。您可以按扩展名(例如*.psd)、目录或单个文件指定文件。运行git lfs ls-files即可查看已跟踪的 LFS 文件列表。


Git 垃圾回收

用于git gc优化您的存储库

随着时间的推移,Git 仓库会积累各种类型的垃圾,占用磁盘空间,并降低操作速度。这时,内置的垃圾收集器就派上用场了。运行垃圾收集器git gc将删除孤立提交和无法访问的提交(使用git prune),压缩文件修订版本和存储的 Git 对象,以及执行一些其他常规的日常维护任务,例如打包引用、修剪引用日志、恢复元数据或过时的工作树以及更新索引。

添加--aggressive标志将积极优化存储库,丢弃任何现有的增量并重新计算它们,这需要更长的时间来运行,但如果您有一个大型存储库,则可能需要这样做。


Git 秀

用于git show轻松检查任何 git 对象

以易读的形式输出对象(blob、tree、标签或提交)。使用时,只需运行git show <object>。您可能还需要附加--pretty标志,以获得更清晰的输出,但还有许多其他选项可用于自定义输出(使用--format),因此此命令可以非常有效地显示您所需的内容。

此功能非常有用的一个例子是预览另一个分支中的文件,而无需切换分支。只需运行git show branch:file


Git 描述

用于git describe查找从提交中可访问的最新标签,并为其赋予一个人类可读的名称

运行git describe后,你会看到一个人类可读的字符串,它由最后一个标签名称和当前提交组合而成。你还可以将特定标签传递给它,

请注意,除非您附加了该标志,否则您必须已创建标签才能使其正常工作--all。Git describe 默认仅使用带注释的标签,因此您必须指定该--tags标志以使其也使用轻量级标签。


Git 标签

使用以下方式标记存储库历史记录中的特定点git tag

能够标记仓库历史记录中特定的重要点通常很有用,这些点最常用于表示发布的版本。创建标签非常简单git tag <tagname>,只需 ,或者您可以使用 标记历史提交git tag -a v4.2.0 <commit sha>。与提交一样,您可以使用 为标签添加一条消息-m

别忘了使用 推送标签到远程仓库git push origin <tagname>
要列出所有标签,只需运行git tag,并根据需要使用-l进行通配符搜索。
然后,您就可以使用 签出特定标签了。git checkout <tagname>


Git 引用日志

使用以下方式列出您的 repo 上所做的所有更新git reflog

Git 使用一种称为引用日志(或“reflogs”)的机制来跟踪分支末端的更新。它会跟踪各种事件,包括:克隆、拉取、推送、提交、检出和合并。能够找到事件引用通常很有用,因为许多命令都接受 ref 作为参数。只需运行git reflog即可查看最近的事件HEAD

reflog 的一个真正用处是恢复丢失的提交。Git 实际上不会丢失任何内容,即使在重写历史记录(例如变基或提交修改)时也是如此。reflog 允许你恢复到那些未被任何分支或标签引用的提交。

默认情况下,reflog 使用HEAD(你当前的分支),但你可以在任何引用上运行 reflog。例如git reflog show <branch name>,或者使用 来查看存储的更改git reflog stash。或者使用 显示所有引用git reflog show --all


Git 日志

用于git log查看提交列表

你可能已经熟悉如何运行 git loggit log来查看当前分支上的最近提交列表。但你还可以用 git log 做更多的事情。

使用git log --graph --decorate --oneline将显示一个漂亮整洁的提交图以及引用指针。

git log 输出示例

您还经常需要能够根据各种参数过滤日志,其中最有用的参数是:

  • git log --search="<anything>"- 搜索日志以查找特定的代码更改
  • git log --author="<pattern>"- 仅显示特定作者的日志
  • git log --grep="<pattern>"- 使用搜索词或正则表达式过滤日志
  • git log <since>..<until>- 显示两个引用之间的所有提交
  • git log -- <file>- 显示仅对特定文件的所有提交

或者,只需运行git shortlog一份提交的汇总列表。


Git Cherry Pick

用于git cherry-pick通过引用选择指定的提交并将其附加到工作 HEAD

有时您需要从其他位置拉取特定的提交到当前分支。这对于应用热修复、撤消更改、恢复丢失的提交以及某些团队协作设置非常有用。请注意,传统的合并通常是更好的做法,因为“择优”提交可能会导致日志中出现重复的提交。

使用方法很简单,只需运行git cherry-pick <commit-hash>。这会将指定的提交拉取到当前分支中。


Git 开关

使用git switch

在分支之间移动是我们经常做的事情,该switch命令就像是的简化版本git checkout,它可以用来创建和在分支之间导航,但与checkout不同的是,在分支之间移动时不会复制修改过的文件。

与 类似checkout -b,使用 switch 命令,您可以附加-c标志来创建一个新的分支,并直接跳转到该分支,例如git switch -c <new branch>。运行git switch -将丢弃您所做的任何实验性更改,并返回到上一个分支。


Git 站立

用于git standup根据 git 提交回顾上一个工作日所做的事情

我把这个放在最后,因为它不包含在大多数 git 客户端中,但您可以使用系统包管理器、使用一行 curl 脚本或通过从源代码构建来轻松安装它。

如果你的老板要求你每天开一次站会,汇报昨天的工作进展,但你却总是记不住自己具体做了什么——这个工具就是为你准备的!它会以格式清晰的列表形式,列出指定时间段内完成的所有工作。使用方法很简单,只需运行git standup,或者使用这些选项指定要显示的数据(作者、时间段、分支等等)。


奖金

Git 可以通过插件轻松扩展,添加执行实用任务的额外命令。最全面的扩展之一是@tj开发的git-extras。它提供了 70 多个额外的命令来自动执行常见的 git 任务。

有关更多有用的 git 附加组件的列表,请参阅stevemao/awesome-git-addons

如果您正在使用 GitHub 存储库,那么GitHub CLI可让您从命令行执行常见任务(管理 PR、问题、代码审查等)。


如果您喜欢这类东西
请考虑关注以了解更多:)
在 GitHub 上关注 Lissy93在 Twitter 上关注 Lissy_Sykes
文章来源:https://dev.to/lissy93/20-git-commands-you-probously-didnt-know-about-4j4o
PREV
开发者赚取额外收入的 50 种方法
NEXT
Elasticsearch 初学者指南