微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势,学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。
如果你曾经浏览过git手册(或运行man git
),那么你会注意到git
的内容比我们大多数人日常使用的多得多。这些命令中有很多是非常强大的,可以让你的生活变得更轻松(其他的则有点小众,但还是要知道的)。
这篇文章概述了我最喜欢的20个不常用的git功能,你可以使用它们来提升你的开发过程,给同事留下深刻印象,帮助你回答git面试问题,最重要的是 - 让你有乐趣!
Git Web
运行 git instaweb 可以立即在 gitweb 中浏览你的工作存储库。
Git有一个内置的web-based visualiser
的可视化工具,用于浏览本地仓库,让你通过浏览器的GUI来查看和管理你的仓库。它有很多有用的功能,包括。
- 浏览和浏览修订版,检查差异、文件内容和元数据
- 直观地查看提交日志、分支、目录、文件历史和附件数据
- 生成提交和版本库活动日志的RSS或Atom feeds
- 搜索提交、文件、更改和差异
要打开它,只需在你的版本库中运行git instaweb
。你的浏览器应该弹出,并加载http://localhost:1234
。如果你没有安装Lighttpd,你可以用-d
标志指定一个替代的网络服务器。其他选项可以通过标记(比如-p
表示端口,-b
表示浏览器打开,等等),或者在你的git config
中的[instaweb]
块下配置。
还有git gui
命令,它可以打开一个基于GUI的git应用
Git Notes
使用
git notes
为提交添加额外信息
有时您需要为一个 git 提交附加额外的数据(不仅仅是更改、消息、日期时间和作者信息)。
这些注释存储在 .git/refs/notes
中,由于它与提交对象数据分开,您可以随时修改与提交相关的注释,而不会改变 SHA-1
哈希值。
你可以用git log
、大多数git GUI应用程序或git notes show
命令来查看注释。一些git主机也在提交视图中显示注释(尽管GH不再显示注释)。
Git Bisect
使用git bisect
,您可以通过二进制搜索找到引入错误的提交。
这是最强大但又最容易使用的git命令之一--当涉及到调试时,bisect
绝对是个救星。启动bisect后,它为你检查提交,你告诉它该提交是好的(没有bug),还是坏的(引入了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
来搜索代码、文件、提交或其他任何东西,跨越你的 repo
有没有发现自己需要在git项目的任何地方搜索一个字符串?使用git grep
,您可以轻松地在整个项目中搜索任何字符串或RegEx,也可以跨分支搜索(就像一个更强大的Ctrl F!
)。
git grep <regexp><ref></p><p>
它包括很多选项来缩小搜索范围,或指定结果格式。例如,使用 -l
只返回文件名,-c
指定每个文件的匹配数量,-e
排除符合条件的结果,--and
指定多个条件,-n
用行号搜索。
由于git grep
与regex
兼容,你可以对你搜索的字符串进行更高级的处理。
你也可以用它来指定文件的扩展名,比如git grep 'console.log' *.js
会显示所有JavaScript文件中的console.logs
。
第二个参数是ref
,可以是分支名、提交、提交范围,或者其他任何东西。例如,git grep "foo" HEAD~1
会搜索前一个提交。
Git Archive
使用
git archive
把整个版本库合并成一个文件
当分享或备份一个版本库时,通常倾向于将其存储为一个单一的文件。使用 git archive
将包括所有的 repo
历史,所以它可以很容易地被提取回它的原始形式。该命令还包括很多额外的选项,所以你可以准确地定制哪些文件包括在归档中,哪些不包括。
git archive --format=tar --output=./my-archive HEAD
Git Submodules
使用
git submodule
将任何其他仓库拉入你的仓库
在git
中,submodules
让你把一个版本库装入另一个版本库,通常用于核心依赖关系或把组件分割成独立的版本库。更多信息,请看这个帖子。
运行下面的命令将把一个模块拉到指定的位置,同时创建一个.gitmodules
文件,这样当 repo
被克隆时就会一直下载它。使用 --recursive
标志,在克隆 repo
时包括子模块。
Git Bug Report
使用git bugreport来编写一份bug ticket,包括git和系统信息
这个命令将捕获系统信息,然后打开一个标准的bug模板(重现步骤,实际 预期输出,等等)。完成的文件应该是一个非常完整的bug报告,包括所有必要的信息。
如果你是一个开源包的维护者,并要求用户(开发者)提出一个bug报告,这就非常方便了,因为它可以确保包括所有必要的数据。
如果你要向核心git系统提出一个bug报告,你也可以运行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 Diff
用 git diff
可以比较两组代码之间的差异
您可能知道,您可以运行 git diff
来显示自上次提交以来的所有更改,或者使用 git diff <commit-sha>
来比较 2 个提交,或 1 个提交到 HEAD。但你可以用diff
命令做的事情还有很多。
你也可以用它来比较任意两个文件,比如 diff file-1.txt file-2.txt
(不用再访问 diffchecker.com
了!)。
或者用git diff branch1...branch2
来比较两个分支,或者相互参照。
注意,双点(...
)与空格相同,表示diff
输入应该是分支的顶端,但你也可以用三点(...
)将第一个参数转换成两个diff
输入之间共享的共同祖先提交的ref--
非常有用 如果你只想在不同分支间比较一个文件,只需将文件名作为第三个参数传入。
你可能想看某个日期范围内的所有改动,为此使用git diff HEAD@{7.day.agree} HEAD@{0}
(上周),这也可以与文件名、分支名、特定提交或任何其他参数配对。
还有git range-diff
命令,它提供了一个比较提交范围的简单接口。
git diff
工具还有很多功能(以及使用你自己的diff
检查器的选项),所以我建议你去看看文档。
Git Hooks
当一个给定的获取动作发生时,使用 hooks 来执行命令或运行脚本。
Hooks 可以让你实现几乎任何事情的自动化。例如:确保符合标准(提交消息、分支名称、补丁大小),代码质量(测试、lint),为提交附加额外信息(用户、设备、ticket ID),调用webhook记录事件或运行管道,等等。
大多数git事件都有前钩和后钩,比如提交、重定位、合并、推送、更新、applypatch等。
钩子存储在.git/hooks
中(除非你用git config core.hooksPath
在其他地方配置它们),并且可以用git hook
命令来测试。由于它们只是shell
文件,它们可以用来运行任何命令。
Hooks 不会被推送到远程仓库,所以要在你的团队中分享和管理它们,你需要使用一个钩子管理器,比如lefthook
或husky
。也有一些第三方工具,使管理 hooks 更容易,我推荐overcommit
。
记住,hooks 总是可以被跳过的(用--no-verify
标志),所以永远不要纯粹依赖钩子,特别是与安全有关的东西。
Git Blame
使用
git blame
来显示特定修订和行的作者信息
一个经典的方法,快速找出谁写了一行特定的代码(也就是你的同事要为这个错误负责!)。但它也可以用来确定在哪个时间点改变了什么,并检查该提交和相关元数据。
例如,要查看index.rs
第400至420行的作者和提交信息,你需要运行。
git blame -L 400,420 index.rs
Git LFS
使用
git lfs
存储大文件,不拖累你的 repo
通常你的项目会包含较大的文件(如数据库、二进制资产、档案或媒体文件),这将拖慢git的工作流程并超出使用限制。这就是大文件存储的作用--
它使你能够将这些大的资产存储在其他地方,同时保持它们在git中的可追踪性,并保持相同的访问控制/权限。LFS的工作原理是将这些大文件替换成文本指针,在git中进行跟踪。
要使用它,只需运行git lfs track <file glob>
,它将更新你的.gitattributes
文件。你可以通过文件的扩展名(比如*.psd
)、目录或单独指定文件。运行git lfs ls-files
可以查看被追踪的LFS文件的列表。
Git GC
使用 git gc 来优化你的版本库
随着时间的推移,git 仓库会积累各种类型的垃圾,这些垃圾会占用磁盘空间,并拖慢行动。这就是内置垃圾收集器的作用。运行git gc将删除无主的和不可访问的提交(用git prune
),压缩文件修订和存储的git对象,以及其他一些一般的内务工作,如打包Refs、修剪reflog、revere metadata或陈旧的工作树和更新索引。
添加 --aggressive
标志将积极地优化版本库,丢弃任何现有的deltas并重新计算,这需要更长的运行时间,但如果你有一个大的版本库,可能会需要。
Git Show
使用 git show 可以轻松检查任何 git 对象。
输出对象(blob、树、标签或提交)以易于阅读的形式。要使用,只需运行 git show <object>
。您还可能希望附加 --pretty
标志,以获得更清晰的输出,但还有许多其他选项可以自定义输出(使用 --format
),因此此命令对于显示您需要的内容非常有用。
一个很有用的例子是,在另一个分支中预览文件,而无需切换分支。只需运行 git show branch:file
。
Git Describe
使用
git describe
找到一个提交中可触及的最新标签,并给它一个人类可读的名字
运行git describe
,你会看到一个人类可读的字符串,它是由最后一个标签的名字和当前提交的内容组合而成的,生成一个字符串。你也可以向它传递一个特定的标签。
请注意,你必须已经创建了标签才行,除非你附加了 --all 标志。Git describe 默认情况下只使用带注释的标签,所以你必须指定 --tags 标志,让它也使用轻量级标签。
Git Tag
使用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 Reflog
使用
git reflog
列出你的 repo上的所有更新
Git 使用一种叫做参考日志,或 "reflogs "的机制来跟踪分支顶端的更新。各种事件被追踪,包括:克隆、拉、推、提交、签出和合并。能够找到一个事件的参考往往很有用,因为许多命令都接受参考作为参数。只要运行git reflog
来查看HEAD
上最近的事件。
reflog
非常有用的一件事是恢复丢失的提交。Git 从来不会丢失任何东西,即使是在重写历史的时候(比如重写或修正提交)。Reflog 允许你回到提交,即使它们没有被任何分支或标签所引用。
默认情况下 reflog 使用 HEAD
(你当前的分支),但你可以在任何 ref 上运行 reflog。例如 git reflog show <branch name>
,或者用 git reflog stash
来查看隐藏的修改。或者用git reflog show --all
来显示所有的引用。
Git Log
使用 git log 来查看提交列表
你可能已经很熟悉运行 git log
来查看当前分支上最近的提交列表了。但你还可以用 git log
做一些别的事情。
使用 git log --graph --decorate --oneline
会显示一个漂亮的、整齐的提交图以及 ref pointers。
你还经常需要能够根据各种参数来过滤日志,其中最有用的是。
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 switch
在分支间移动是我们经常做的事情,switch
命令就像是 git checkout
的简化版,它可以用来创建和浏览不同的分支,但与 checkout 不同的是,在分支间移动时不会复制修改过的文件。
与 checkout -b
类似,switch
命令可以附加 -c
标志来创建一个新的分支,并直接跳入其中,例如 git switch -c <新分支>
。而运行git switch
- 会丢弃你所做的任何实验性修改,并返回到你之前的分支。
Git Standup
使用git standup来回忆你在上一个工作日所做的事情,基于git提交的内容
我把这个放在最后,因为它不包括在大多数git客户端中,但你可以用你的系统包管理器,用一个单行的curl脚本,或者从源码构建来轻松安装它。
如果你的老板要求你每天做一个总结,对昨天的工作进行更新,但你总是记不住你到底做了什么--这个是为你准备的 它将显示一个格式良好的列表,列出在给定时间范围内所做的一切。使用方法很简单,只要运行git standup
,或者使用这些选项来指定应该显示的数据(作者、时间范围、分支等。
原文:https://leerob.substack.com/p...
编辑中可能存在的bug没法实时知道,事后为了解决这些bug,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。
交流
有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。