你可能不知道的20个Git命令,但真的很实用

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

如果您曾经浏览过git 手册(或 run man git),那么您会注意到 git 的功能比我们大多数人每天使用的要多得多。很多这些命令都非常强大,可以让你的生活更轻松(其他命令有点小众,但仍然很高兴知道)。

 

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

主要包含以下的命令

  • Git Web -打开内置 GUI
  • Git注释 -将额外信息附加到提交
  • Git Bisect -像专业人士一样调试
  • Git Grep -搜索任何东西
  • Git Archive -压缩项目以供共享
  • Git 子模块-将其他存储库导入您的
  • Git错误报告-使用系统信息编译错误报告
  • Git Fsck -验证和恢复无法访问的对象
  • Git Stripspace -删除尾随空格
  • Git Diff -比较两个文件之间的变化
  • Git Hooks -在运行 git 命令时执行脚本
  • Git Blame -显示给定行的作者
  • Git Large File Storage -在 git 中存储大文件
  • Git Garbage Collection -优化你的 git repo
  • Git Show -轻松检查任何 git 对象
  • Git Describe -根据最后一个标签给出可读的名称
  • Git Tag -在特定点创建版本标签
  • Git Reflog -列出在回购上所做的所有 git 操作
  • Git Log -查看提交日志和分支图
  • Git Cherry Pick-将功能拉入您的分支
  • Git Switch -在分支之间快速跳转
  • 奖励-使用更多命令扩展 git!

接下来详细聊聊这些命令

1、网页版

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

Git 有一个内置的基于 Web 的可视化工具,用于浏览本地存储库,它允许您通过浏览器中的 GUI 查看和管理您的存储库。它包含许多有用的功能,包括:

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

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

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

 

2、Git 笔记

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

有时您需要将其他数据附加到 git 提交(除了更改、消息、日期时间和作者信息之外)。

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

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

3、Git 一分为二

您可以使用git bisect二进制搜索找到引入错误的提交

这是最强大但易于使用的 git 命令之一 - bisect 在调试时绝对是救命稻草。在开始对分后,它会为您检查提交,然后您告诉它提交是good(没有错误)或bad(引入错误),这可以让您缩小出现错误的最早提交的范围。

要开始,运行git bisect start然后传递给它一个已知的好提交git bisect good <commit-hash>和一个已知的坏提交(默认为当前)git bisect bad <optional-hash>。然后它将检查好提交和坏提交之间的提交,然后您指定 bug 存在的天气与git bisect good或git bisect bad。然后它会重复这个过程,在好与坏的中心检查一个提交,一直到你找到引入错误的确切提交。随时取消git bisect reset。

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

3、Git Grep

用于git grep在您的存储库中搜索代码、文件、提交或任何其他内容

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

git grep <regexp> <ref>

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

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

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


4、Git 存档

用于git archive将整个存储库合并到一个文件中

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

git archive --format=tar --output=./my-archive HEAD

5、Git 子模块

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

在 git 中,子模块让您可以将一个存储库挂载到另一个存储库中,通常用于核心依赖项或将组件拆分到单独的存储库中。有关详细信息,请参阅这篇文章。

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

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

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

6、Git 错误报告

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

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

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

如果你向核心 git 系统提出错误报告,你也可以运行git diagnose命令,然后在这里提出你的问题。

7、git fsck

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

虽然不经常需要,但有时您可能必须验证 git 存储的对象。这就是 fsck(或文件系统检查)发挥作用的地方,它测试对象数据库并验证所有对象的 SHA-1 ID 及其建立的连接。

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

8、Git 条带空间

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

最佳做法是避免在行尾尾随空格,避免有多个连续的空行,避免输入的开头和结尾出现空行,并以新行结束每个文件。有很多特定于语言的工具可以自动为您执行此操作(例如 prettier),但 Git 也内置了此功能。

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

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

9、Git 差异

你git diff可以比较2组代码之间的区别

您可能知道您可以运行git diff以显示自上次提交以来的所有更改,或者用于git diff <commit-sha>比较 2 次提交或 1 次提交到 HEAD。但是您可以使用 diff 命令做更多的事情。

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

或者比较 2 个分支,或者相互引用,使用git diff branch1..branch2

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

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

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

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

10、Git 钩子

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

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

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

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

钩子不会被推送到远程存储库,因此要在您的团队中共享和管理它们,您需要使用钩子管理器,例如lefthook或husky。还有几个3rd-party 工具,可以让管理钩子更容易,我推荐overcommit。

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

11、Git 责备

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

一个经典的,快速找出谁写了特定代码行(也就是你的哪个同事应该为这个错误负责!)。但它也有助于确定在哪个时间点发生了某些更改并检查该提交和关联的元数据。

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

git blame -L 400,420 index.rs

12、Git 语言文件系统

存储大文件git lfs,以免拖累您的存储库

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

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

13、垃圾收集器

用于git gc优化您的存储库

随着时间的推移,git repos 会积累各种类型的垃圾,这些垃圾会占用磁盘空间并减慢操作速度。这就是内置垃圾收集器的用武之地。运行git gc将删除孤立的和不可访问的提交(使用git prune),压缩文件修订和存储的 git 对象,以及一些其他一般的内务处理任务,如打包引用、修剪引用日志、尊重元数据或陈旧工作树和更新索引。

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

14、Git 显示

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

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

这非常有用的一个实例是在另一个分支中预览文件,而无需切换分支。赶紧跑git show branch:file

15、Git 描述

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

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

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

16、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>

17、Git 刷新日志

使用列出对您的回购所做的所有更新git reflog

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

reflog 真正有用的一件事是恢复丢失的提交。Git 永远不会真正丢失任何东西,即使是在重写历史时(比如变基或提交修改)。Reflog 允许您返回提交,即使它们没有被任何分支或标记引用。

默认情况下 reflog 使用HEAD(您当前的分支),但您可以在任何 ref 上运行 reflog。例如git reflog show <branch name>,或查看隐藏的更改git reflog stash。或显示所有参考资料git reflog show --all

18、Git 日志

用于git log查看提交列表

您可能已经熟悉运行git log以查看当前分支上最近提交的列表。但是您可以使用 git log 做更多的事情。

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

 

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

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

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

19、Git 樱桃采摘

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

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

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

20、Git 开关

利用git switch

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

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

21、Git 站会

用于git standup根据 git commits 回忆你在上一个工作日做了什么

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

如果您的老板要求您每天站立一次,以更新昨天的工作,但您永远记不起自己到底做了什么——这个适合您!它将显示一个格式良好的列表,列出在给定时间范围内完成的所有事情。用法很简单,只需运行git standup,或使用这些选项指定应显示哪些数据(作者、时间范围、分支等)。

22、奖金

Git 可以通过附加组件轻松扩展,以添加执行有用任务的额外命令。最完整的扩展之一是@tj的git-extras。它为您提供了 70 多个额外的命令来自动执行常见的 git 作业。

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

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

如果你正在学习前端,Git是一定要开始学习的,我们在讲完html标签属性之后就开始给大家讲解了git和markdown使用!上次和大家分享Git命令很多同学表示看不懂,不能理解!的确才开始学习Git不适合用这样复杂的方法,可以通过先通过鼠标操作的方式学习,很荣幸我们的30天课程设计在教大家入门Git的时候就是鼠标操作的,如果需要相关教程,可以私聊我!

 

为帮助到一部分同学不走弯路,真正达到一线互联网大厂前端项目研发要求,首次实力宠粉,打造了《30天挑战学习计划》,内容如下:

HTML/HTML5,CSS/CSS3,JavaScript,真实企业项目开发,云服务器部署上线,从入门到精通

  • PC端项目开发(1个)
  • 移动WebApp开发(2个)
  • 多端响应式开发(1个)

共4大完整的项目开发 !一行一行代码带领实践开发,实际企业开发怎么做我们就是怎么做。从学习一开始就进入工作状态,省得浪费时间。

从学习一开始就同步使用 Git 进行项目代码的版本的管理,Markdown 记录学习笔记,包括真实大厂项目的开发标准和设计规范,命名规范,项目代码规范,SEO优化规范

从蓝湖UI设计稿 到 PC端,移动端,多端响应式开发项目开发

  • 真机调试,云服务部署上线;
  • Linux环境下 的 Nginx 部署,Nginx 性能优化;
  • Gzip 压缩,HTTPS 加密协议,域名服务器备案,解析;
  • 企业项目域名跳转的终极解决方案,多网站、多系统部署;
  • 使用 使用 Git 在线项目部署;

这些内容在《30天挑战学习计划》中每一个细节都有讲到,包含视频+图文教程+项目资料素材等。只为实力宠粉,真正一次掌握企业项目开发必备技能,不走弯路 !

过程中【不涉及】任何费用和利益,非诚勿扰 。

如果你没有添加助理老师微信,可以添加下方微信,说明要参加30天挑战学习计划,来自博客园!老师会邀请你进入学习,并给你发放相关资料。

30 天挑战学习计划 Web 前端从入门到实战 | arry老师的博客-艾编程

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6