你可能不知道的 20 个 Git 命令
如果你曾经浏览过git 手册(或运行git 命令man git
),你就会注意到 git 的功能远比我们大多数人日常使用的要丰富得多。其中很多命令都非常强大,可以让你的工作更加轻松(其他一些命令虽然比较小众,但仍然值得了解)。
这篇文章概述了我最喜欢的 20 个未充分利用的 git 功能,您可以使用它们来提升您的开发流程,给您的同事留下深刻印象,帮助您回答 git 面试问题,最重要的是 - 玩得开心!
内容(和 TL;DR)
- Git Web -打开内置 GUI
- Git Notes -为提交附加额外信息
- Git Bisect -像专业人士一样调试
- Git Grep -搜索任何内容
- Git Archive -压缩项目以便共享
- Git 子模块-将其他仓库导入到你的仓库中
- Git Bugreport -使用系统信息编译错误报告
- Git Fsck -验证并恢复无法访问的对象
- Git Stripspace -删除尾随空格
- Git Diff -比较两个文件之间的变化
- Git Hooks -运行 git 命令时执行脚本
- Git Blame -显示谁写了给定的一行
- Git 大文件存储-在 git 中存储大文件
- Git 垃圾收集-优化你的 git 仓库
- Git Show -轻松检查任何 git 对象
- Git Describe -根据最后一个标签给出可读的名称
- Git Tag -在特定点创建版本标签
- Git Reflog -列出在 repo 上执行的所有 git 操作
- Git Log -查看提交日志和分支图
- Git Cherry Pick -将功能拉入你的分支
- Git Switch -在分支之间快速跳转
- 奖励——使用更多命令扩展 git!
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 注释
用于
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
Git 子模块
用于
git submodule
将任何其他存储库拉入您的存储库
在 Git 中,子模块允许你将一个仓库挂载到另一个仓库,通常用于核心依赖项或将组件拆分到单独的仓库中。更多信息,请参阅此博文。
运行以下命令会将模块拉取到指定位置,并创建一个.gitmodules
文件,以便在克隆代码库时始终下载该文件。使用--recursive
标志可在克隆代码库时包含子模块。
git submodule add https://github.com/<user>/<repo> <path/to/save/at>
还有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 stripspace
或git 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 管理器,例如lefthook或husky。此外,还有一些第三方工具可以简化 Hook 的管理,我推荐overcommit。
请记住,钩子总是可以被跳过(使用--no-verify
标志),所以永远不要纯粹依赖钩子,特别是对于任何与安全相关的事情。
Git Blame
用于
git blame
显示特定修订和行的作者信息
经典做法是快速找出特定代码行的编写者(也就是哪个同事应该为这个 bug 负责!)。但它也有助于确定代码更改的时间点,并检查该提交及其相关元数据。
例如,要查看 index.rs 第 400 行至 420 行的作者和提交信息,您可以运行:
git blame -L 400,420 index.rs
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 --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 开关
在分支之间移动是我们经常做的事情,该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、问题、代码审查等)。
文章来源:https://dev.to/lissy93/20-git-commands-you-probously-didnt-know-about-4j4o