前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >20个你(可能)不知道的Git命令

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

作者头像
前端小智@大迁世界
发布2023-02-03 11:25:00
7860
发布2023-02-03 11:25:00
举报
文章被收录于专栏:终身学习者终身学习者

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势,学习途径等等。 本文 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应用

image.png
image.png

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 goodgit bisect bad来指定错误是否存在。然后它将重复这个过程,在坏和好的中间检查出一个提交,一直到你找到引入该错误的确切提交。用git bisect reset随时取消。

bisect命令还有很多内容,包括重放、查看提交、跳过,所以下次调试的时候值得看看文档。

Git Grep

》 使用git grep来搜索代码、文件、提交或其他任何东西,跨越你的 repo

有没有发现自己需要在git项目的任何地方搜索一个字符串?使用git grep,您可以轻松地在整个项目中搜索任何字符串或RegEx,也可以跨分支搜索(就像一个更强大的Ctrl + F!)。

代码语言:javascript
复制
git grep <regexp><ref></p><p>

它包括很多选项来缩小搜索范围,或指定结果格式。例如,使用 -l 只返回文件名,-c 指定每个文件的匹配数量,-e 排除符合条件的结果,--and 指定多个条件,-n 用行号搜索。

由于git grepregex兼容,你可以对你搜索的字符串进行更高级的处理。 你也可以用它来指定文件的扩展名,比如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 stripspacegit 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 不会被推送到远程仓库,所以要在你的团队中分享和管理它们,你需要使用一个钩子管理器,比如lefthookhusky。也有一些第三方工具,使管理 hooks 更容易,我推荐overcommit

记住,hooks 总是可以被跳过的(用--no-verify标志),所以永远不要纯粹依赖钩子,特别是与安全有关的东西。

Git Blame

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

一个经典的方法,快速找出谁写了一行特定的代码(也就是你的同事要为这个错误负责!)。但它也可以用来确定在哪个时间点改变了什么,并检查该提交和相关元数据。

例如,要查看index.rs第400至420行的作者和提交信息,你需要运行。

代码语言:javascript
复制
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。

image.png
image.png

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

  • 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 已收录,有一线大厂面试完整考点、资料以及我的系列文章。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Git Web
  • Git Notes
  • Git Bisect
  • Git Grep
  • Git Archive
  • Git Submodules
  • Git Bug Report
  • Git Fsck
  • Git Stripspace
  • Git Diff
  • Git Hooks
  • Git Blame
  • Git LFS
  • Git GC
  • Git Show
  • Git Describe
  • Git Tag
  • Git Reflog
  • Git Log
  • Git Cherry Pick
  • Git Switch
  • Git Standup
    • 交流
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档