粉丝8.7万获赞79.5万

今天讲一下怎么提交本地项目到开元中国的这个马云。首先第一步就是在远程仓库新建一个仓库,就是叫特色山, 然后直接创建, 然后现在就可以得到这个远程仓库的这个地址,这是第一步。第二步的话在本地创建一个项目, 也叫特色的。三, 现在本地和远程这两个项目,然后没有关联起来,就相当于是第一次把这个项目提交到远程仓库, 怎么关联起来呢?点这个 vcs 远程仓库这个菜单,点这个音破的导入他人称仓库,点这个创建 ge 的仓库,这一步是在本地创建这个仓库 ge 的仓库, 就直接选择刚才这个项目的这个末路,作为这个 g 的仓库的末路。 在创建 g 的本地仓库之前是没有这个没漏的,现在的话有了这个没漏,这个是仓库的这个信息,然后 接下来就是把这个本地的这个项目提交到远程仓库去。怎么做呢?直接右键, 然后 come 的选择指定的文件提交到远程仓库,随便填一个这个提交信息。 第一次直接点这个 come 的提交文件到本地仓库, 现在已经提交成功, 然后再把本地仓库的代码更新,就是刚才提交了,然后复习到远程仓库去。 怎么做呢?直接点这个右键,然后 get, 然后仓库,然后直接点这个 pose。 第一次因为这个本地和远程没有关联起来,然后要点这个迪范 末的就是要填这个远程仓库的这个地址,其实就是把本地和远程关联起来,这个要填一下这个远程仓库的这个地址, 直接把刚才这个远程仓库地址复制过来, 然后现在已经变成这个样子,然后直接点这个剖析就可以把刚才就是本地这个提交更新,剖析到远程昌过去直接点剖析 谱写本地的主干道,一个新的远程的主干谱写成功, 然后看一下远程仓库剖析成功。好,谢谢。

兄弟们,本节将学习如何查看 get 的提交历史记录。在程序开发过程中,了解项目的演变历史非常重要,因为它可以帮助您更好的理解代码库并跟踪文件的变化。 get 为我们提供了 get log 工具,用于查看 get 代码库中的提交历史记录。 首先,我们先打开终端,进入项目目录,然后输入 get log 命令。按回车键后,您将看到一个包含所有提交信息的长列表。在默认情况下,他会按时间顺序列出了所有提交,并提供有关每个提交的详细信息。输出格式包括,提交哈西值、作者、提交日期、提交信息。 哈西值是一种唯一且固定长度的字符串,由哈西函数根据输入数据计算而来。他通常用于检测数据完整性和安全性。因为哈西函数是一种单向函数,他将输入数据转换为一个固定长度的哈西值,并且该过程不可逆, 还可以用于数据锁引或加密等领域。 get log 还提供很多选项参数,帮助我们更好的查看信息。例如 pretty, 它用于指定在输出中显示提交信息的格式,允许用户自定义输出的样式。 pretty 等于 one line, 可以把提交标记和信息显示在一行内。我们还可以用多种方式来控制输出结果,比如只显示某个作者的提交。 还有一些常用的命令,比如显示最近的两个提交记录,显示从五分钟前的所有提交记录,显示五分钟内的所有提交记录,以及显示当前分支上所有的提交历史。还有非常多的选项, 我们可以使用 get lock help 命令去查看帮助文档。随着提交越来越多,我们可以使用此条命令来显示提交信息,他可以整洁的显示我们所需要的信息。具体的含义我已经列出来了,大家自行暂停或者截图查看。 get 还集成了一个让我们查看日志的图形化界面。 get, 我们在仓库目录输入 get 就会弹出这个工具。

哈喽,大家好,我是鱼仔,这是来自网上的一张 get 提交记录的图片,不知道大家看到有什么感觉,如果想看一下代码做了什么调整,光看 get 提交记录根本看不出任何东西。 由于每个人不同的编码风格,一个项目的 get 提交记录是十分混乱的,因此在项目组内部统一 get 提交规范是十分重要的,既能更方便的去做版本管理,又能和一些自动化工具打通, 制定规范简单,但执行很难,于是我就在网上搜索相关的工具,还真被我找到了。一款 id 插件,能让提交记录变得更加规范,插件的名字叫做 get commit message helper。 在插件市场搜 get commit 插件的时候,还有一款下载量更高的插件,叫做 get commit template, 但是支持的版本实在有限,且很久没更新了。 安装很简单,下载下来后在 idea 中使用离线安装的方式进行安装,接下来就可以直接使用了。比如我现在修复了一个 bug, 打开了 get 提交页面,在 get 提交记录上面有一个编辑的图标,点击之后就进入到了分多模块的提交页。首先选择提交类型,我是修复 bug 就选择 fix, 接着根据实际的需要进行填写,首先是变更范围,填写需要变更的模块,接着是简短描述,简单介绍这次提交的内容, 详细描述,更加详细的描述提交的内容,如果有对应的 yesus id, 也可以在这里填写,这里的内容都是按需填,填完相关内容后点击 ok, 之后一个规范的 get 提交记录就生成了。这个插件更实用的地方在于可以自定义提交记录的格式,在设置的阿泽 c 顶中 找到配置。一方面可以自定义生成的模板内容,按需修改模板的内容,并且也可以根据实际需要增加或减少提交类型,形成自己项目组或者公司的规范,还是一个比较不错的插件。以上就是本期视频的全部内容了,我是鱼仔,我们下期再见。

分享一个 ai 技巧,五秒钟教会你用 get 仓库提交代码,非常简单啊,你有这个仓库的地址, http 的 这个地址,然后呢,有账号密码就可以了,就当前项目,你打开 ai 工具, 你告诉他把当前项目提交到下面的这个 get 仓库。哎呢,就是拉取呢,其实也一样啊,就把下面的 仓库代码拉取到本地,他就开始自己操作了啊,有如果有冲突的,他也自己解决啊。这个非常简单啊,非常适合小白,你不用再想什么命令了,可以试试。

我们再来看一下这个第二个问题啊,就是如何解决我们这个冲突。解决冲突的话我们先看一下这个冲突是怎么发生的。比如说我们现在的话有一个远程的,当然就是在这个远程的话,大家就是把这个当做是一个人,就是一个张三条代码。好比如说这个张三的话 把第一行代码改了,就是两个人对同一行代码做了更改的话,就会产生冲突,就是他改了,你也改了,这时候的话,就比如说张三的话,这边的话张三然后一一好,这时候改成张三一一了,他就被我们提交了 好比如比如说现在这个李四的话不知道我们继续啊,就是在这面好,这个他还以为是这个,然后他不知道这边的话他他也改了。这边的话李四,比如 改的东西就是第一次好,然后把它改成二二了,好这首吗?然后他保存,然后改成嗯爱的的,然后把他也提交了 修改啊,修改了,修改之后他做了一下 gettypose 好,然后更新远程的一个代码,好,这时候的话大家可以看到就发生了我们这个冲突, 他说哪个文件发生冲突好了,我的他们就是看一下这个好,这边的话他就产生了这个冲突。大家可以看到 这个冲突的话就是说前面这一部分就是焊的,后面的这一部分的话就是你自己的一个修改隐私的一个修改,然后后面的这个抖号,后面的话就是说 是一个远程,你更新过来给他一个冲突,比如说我们现在的话解决冲突要么你就要这个理思性过来的,要么就要你自己的,我们首度解决一下,如果说两个都要的话,你就把中间这些东西全都删掉,然后把它保存。如果说只要一个的话,那你就比如说不想要 张三的话,你就把它删掉,然后把你的提交,如果两个都要的话就保留,然后改成我们看一下啊。好,这首话他说改了,我们给他提交一下吧,改成 app 解决冲突,然后的话贴这 pose, 我们 pose 一下,然后把东西提交到远程仓库。好,这边的话也 应该就改了。好,这时候还就要的意思,我们再给他铺试一下,应该是最新的。好,这时候的话冲突就已经解决了。我们再来说一下怎么样回退到指定的一个版本,比如说我们现在的话修改一个文件吧,就是这面再添加个都行。 嗯,贴啊一好,这时候我们把东西都已经提交了,给拆 add 吧, 这边只有随便选的东西, 然后的话这时候的话已经提交到本地仓库了,比如说我现在回推的话,用这个该车提高的车,尴尬肯定是回推不了的。我,我想回推到之前那个版本,怎么回推呢? 看一下啊,现在提交记录, 我们用这个面来看一下, 当前这个就是我们刚刚写的这个被褥,随便写的,就是当前的害的所在位置,就是最新的一个 一次提交的一个记录。好,我们回到上一个版本的话,我们就可以直接输入他或者是我这边也给大家写了,就是我们需要指定回到指定的版本的话,我们就可以跟一个 就是当写 ad 的一个名字,或者比如说你想回到这边这个提交记录的话,你就写他,比如说 get breathe santa, 然后的话 hadrd 把这个名, 然后把它跟上,然后就可以回到我们这个对应的一个就是提交的一个记录,比如说我们回头的他的话就直接输入他就可以了,一个杠杠,然后大家可以看到现在的话就回到这个版本了, 我们看一下啊,就是说他现在的话已经大家看啊,就是之前这个风质指向的话就是备注是 ss 这个,但是现在的话他说已经更新到这个哈喽沃的,就是更新了哈喽沃的这个版本之前了。好,那那我们怎么样回去呢?就是我 这首的话,大家可以看到就是之前我们这个提交的这个季度已经没有了,我们怎么回到之前那个版本呢?我们这边的话给他给我们提供了一个,就是我们可以用 refer 这个的话就可以看我们这个提交的就是我们执行的一些命 你的一个记录。好,这时候大家可以看到,就可以看到我们这边执行的所有命令,我们做哪些提交原始的是什么啊之类的,都会有这个分支的一个版本号,我们只需要把这个版本号说一下就可以了。 比如说我们之前的话那个版本的话应该是多少了?应应该我们知道的话,就是如果说没有关屏幕的话,我们就可以直接输入他就可以了,如果说我们关了屏幕的话,我们就在这边找一下就可以了, 我们就在这边的话就可以找到他的一个就是之前的一个版本的一个季度,我们还记得就是他这个,这一次提交的一个季度就是 ss, 然后对应的版本号就是他不是说我们没有了就可以用这个命令,然后 get 有钱财,有钱财 然后的话把这个输进去,好,这时候的话他就又回到了之前那个白本,这就是他的一个白本的回退。

如果想要查询 get 提交的一个记录,可以用 get log 打开这个 get 的 命令框,输入 get log, 就 可以看到这样子的一个一条一条的记录, 这是一条,这是一条,这是一条,这是很多条记录,这记录里面的每一条信息。 commit, 你 可以认为是一个 id, 或者是这就是一串哈西码,它代表的是这一次提交的一个唯一码。 author 呢,是作者以及邮箱, date 是 你提交的一个时间。这个 modify 呢? 是这样啊,每次提交的时候尽可能输入一下修改了什么内容,我这个因为是自己写的 demo, 我 就只写了 modify jmp file, 但事实上我们尽可能的要写清楚你修改了哪一个文件,为什么要修改,以及修改了哪些内容,或者是你修复了什么样子的问题。我们的 log 非常多的时候,我们可以使用键盘上的一个上下箭头来翻页查看,如果不想看要退出的话,按键盘的 q 去退出就可以了。 筛选怎么做?如果想要通过时间筛选,我们可以用 getlog 后面加刚刚 sense 等于,比如说这个,那我们就是筛选这个以后的 getlog, 刚刚 elsear 等于,这个是通过作者来筛选, 通过关键词来筛选的话,就用 getlog 刚刚 group 后面加上你的关键词,查询的就是这里的内容包含的一些关键词。

小伙伴们,你的 get 提交信息是不是也经常写 fix、 bug, update 或者搞定了这样的内容呢?这样的提交记录时间久了,根本看不懂当时改了什么。想要写出专业的提交信息,其实很简单,记住这个模板就够了。 首先是类型加作用域,然后是简短描述,空一行后写详细说明,在空一行可以放关联的一绪信息。我们来拆解一下每个部分。 tab 指的是提交类型,比如新功能用 fit, 修复 bug 用 fix, 文档更新用 docs。 scope 是 指这次修改影响的模块。比如登录功能就写 log in subject 是 简短描述,要以动词开头,比如增加修复这样的词。 body 部分用来详细说明做了什么。 福特可以关联相关的艺术编号。看一个完整的例子,比如 fit logan, 增加短信验证码登录功能,然后在详细说明里写集成第三方短信服务 api, 添加验证码,输入,组建相关单元,测试已通过, 最后加上 close, 一 二三关联一序。这样的提交记录既清晰又专业,团队写作效率会大大提升。赶紧收藏这个规范模板吧,从规范提交信息开始,让你的代码管理更高效,团队效率提升就从这些小细节开始做起。

嘿,欢迎回来,咱们已经学到第四章了,你看啊,我们之前不是一直在做提交吗?这就好像在为我们的项目写一本厚厚的历史书。但问题来了,万一写错了怎么办? 别担心,今天咱们就来学习怎么当一个时间旅行者,我教你怎么看懂这段历史,还会给你三颗 get 的 后悔药,让你能随心所欲地在代码时间线上来回穿梭,不管什么错误都能轻松搞定。 你来想象一下这个场景啊,你不再是个普通的程序员了,你现在是代码世界的钟表匠,你不只是在咔哒咔哒的记录时间,你甚至有能力让时钟倒着走回到过去,把那个不小心写错的地方给他修正过来。 没错,这个超能力就是我们今天要掌握的核心技能,完完全全的掌握代码的时间线。 好,那咱们这就出发吧!作为一个合格的时间旅行者,第一步是什么?当然是得学会看地图啊,你在哪,要去哪,都得清楚。在 get 的 世界里,这张历史地图就是要用 get log 这个命令来展开的。 你看,如果你直接在终端里敲一个 git log, 回车就会看到这么一大堆东西,是不是有点眼花缭乱?这感觉就像是一本水流势障,信息倒是挺全的,但又长又乱,想一眼看出整个项目是怎么一步步发展过来的,太难了。 但是如果我们稍微变通一下呢?你看这个,我们只要加上几个小参数,比如杠 one、 line、 杠 graph, 还有杠 o。 哇,瞬间就不一样了, 那本乱糟糟的流水账,一下子就变成了一张超级清晰的拓谱地图,你看所有分支怎么分叉的,又在哪里合并的,都一目了然。我跟你说,这玩意你一定要设个别名,比如 git l g。 相信我,这绝对会是你每天用得最爽、效率最高的拿倒工具。 ok? 如果说 log 是 给我们看宏观的地图,那 diff 命令就是我们手里的显微镜,专门用来观察微观的细节。不过用这个显微镜有个诀窍,你必须非常清楚,你到底在比较哪两个东西。 比如说光秃秃一个 get diff, 它看的是你手头正在改的文件和赞存区之间的差别, 加上杠 stage 的 呢,他看的就是赞存区和上一次提交的版本库有啥不一样?甚至你还可以像 get diff head 杠杠二这样直接穿越时空,比较现在和两个版本之前的代码差异是不是很强大? 好,到现在我们已经学会看地图,也会用显微镜了。但你有没有想过一个根本问题, git 他 是怎么知道我们现在到底在哪儿的?他怎么知道当前是哪个时间点? 嗯,这就要讲到 git 时间机器的核心了。一个叫 head 的 东西,它是个指针,你可以把它想象成老式唱片机上面那个唱针,唱针指到哪里,唱片机就播放哪里的音乐。在 git 里, head 指到哪里,你的工作区就显示哪个版本的代码。 我发现啊,很多人一听到 had 就 觉得,哇,好神秘,好复杂,其实一点儿也不,它的原理特别简单,你就记住它是个指向,指真的指。 这么说可能有点绕,我换个说法, had 它很懒,它不直接去指某一次,具体的提交它干嘛呢?它指向你当前所在的分支,比如说 master, 这个分支指征才是真正指向最新那次提交的。 所以每次你一提交 master 指征就往前走一步, had 呢?就好像骑在 master 上面一样,也就跟着往前走了。明白了吗? 注意!注意!前方高能预警,这儿有一个锯坑,新手特别容易掉进去。就是什么呢?就是当你用 checkout 直接跳到一个过去的 commit hash 值上时,这时候你的 had 就 好像脱轨了一样,不再指向任何分支了。 这就叫分离头指真状态,或者叫游离状态。在这个状态下写代码做提交是极度危险的。 为什么?因为你这些新的提交,它不属于任何一个分支。等你一切换回别的分支,这些提交就成了没人要的孤魂野鬼,过不了多久就会被 get 的 垃圾回收机制给彻底清理掉,那就真的找不回来了。 ok, 既然我们搞懂了 had 是 怎么回事,那接下来就好办了,我们就可以开始学习怎么去操控它,真正地去改变历史了。 get 官方给我们准备了三颗效果不同的后悔药,它们的名字分别叫 reset, revert, 还有 restore。 记住啊,这三颗药药效和副作用那可是天差地别。 咱们先说药效最猛的这坎儿, yet reset, 它就是个名副其实的时光机,它有三种模式。第一种, dash soft 模式,这是轻度后悔药, 它只会把 head 指针挪回去,但你改的东西都好端端地待在暂存区里。这就好比你刚把信装进信封,又后悔了,于是你小心翼翼地把信封拆开,信纸还在,啥都没丢。 第二种, dash mixed, 这是默认模式,药效中等。它不仅移动 head, 还会把暂存区清空,把你改的东西退回到工作去。这就像你把信纸拿出来,还把它揉成一团,但至少信纸还在,你可以重新把它抚平。 最后一种 dash heart 模式啊,这是强力后悔药,也是最危险的。它会把 head、 暂存区、工作区里的所有相关修改通通给你销毁的一干二净。这就像你一怒之下把信和信封一起扔进了碎纸机,咔嚓一下全没了。所以用这个一定要小心! 好!说到这儿,我们必须强调一条在团队协助里的绝对红线,听好了 reset 这个命令,因为它会粗暴地修改甚至抹掉历史,所以它只能也只应该用在你自己的还没跟别人分享的私有分支上。 一旦你的代码被推送到大家都能看到的公共分支,比如 main 或者 develop, 你 就绝对绝对不能再用 reset 了。那怎么办? 这时候就该用 revert, revert 不 会删除历史,它很文明,它会创建一个全新的提交,这个提交的内容刚好是把之前那个错误的提交给反向操作一遍。你看,这才是对队友负责任的做法,因为它保留了完整的历史记录。 那么问题又来了,如果我没犯那么大的错,我只是不小心把某一个文件给改乱了,我也不想去动什么提交历史,就想把这一个文件恢复原样。怎么办? 很简单,这时候咱们的第三颗药 get restore 就 该登场了,你可以把它想象成一把手术刀,非常精准。它能帮你把某个文件嗖第一下恢复到上一个版本的状态,或者把它从暂存区里给撤销出来。整个过程非常干净利落,不会影响到任何历史记录。 讲到这里,我猜你心里可能会有一个最大的恐惧在悄悄冒头。就是万一我真的手滑了,真的犯了个灾难性的错误。比如不小心用了一下那个最可怕的 reset hard, 那 是不是一切都完蛋了?代码是不是就灰飞烟灭了? 对,就是这个问题,想想都后怕对吧?你辛辛苦苦写了一整天的代码,结果脑子一抽,一个 reset hard 敲下去,回车瞬间工作区干净了,历史记录也没了。 那种感觉是不是天都塌下来了?你的心血真的就这么永远消失了吗?别慌,先别急着辞职。 get 的 涉及者早就想到了这一点,他给我们留了一个终极保险,一个最后的救命稻草。 它的名字叫 relog, 你 可以把它想象成是飞机的黑瞎子,它默默地记录了你的 head 指真每一次的移动轨迹。所以,只要你的代码曾经被提交过,哪怕后来被 reset 无情地删掉了,你都可以在 relog 里找到它的遗骸。 然后你只需要一个简单的命令,就能让它起死回生,是不是瞬间安心了?所以你看,咱们现在可以把这些工具总结成一个非常清晰的决策指南了,来,跟我一起记。只是把某个文件改乱了,用手术刀 restore 在 自己的私有分支上,想退倒重来,用时光机 reset, 不小心把错误推送到公共分置了。快用安全气囊 revert, 万一感觉自己把整个仓库都给毁了,天塌下来了,别怕,咱们还有黑匣子 reflog! 你 把这张图记在脑子里,以后不管遇到什么需要后悔的场景,都能从容应对了。 那么到今天为止呢,你已经完全掌握了在一条单一的时间线上来回穿梭修改历史的超能力了。但这也引出了一个更有意思也更脑洞大开的问题,如果时间并不只是一条直线呢?如果它能分叉,能创造出无数个平行宇宙呢? 没错,下一章我们就将一起探索, get 最核心、最强大的功能分支与合并,咱们下回见!

作为一名程序员,防止敏感文件进入 git 仓库是必须的。意外提交点 envo 文件可能会泄露生产环境的密钥。隆重介绍 cryptokeyim, 你 的 git 守护者,它采用军事级别的加密技术,在敏感文件进入你的仓库之前自动检测并进行加密。 操作非常简单,但安全却无懈可击。扫描你的项目加密敏感文件,然后就可以自信地提交了, 从此你再也不用担心生产环境的密钥会暴露在 get 中。现在就去保护你的 get 仓库吧!访问 kryptokyim, 构建一个绝对防泄露的开发工作流。

昨天有个粉丝问,提到代码的时候如果有冲突怎么解决?可以看一下这一个图,它一般是报这样子的错误, 然后我们用 get status 可以 看一下它的状态,它会告诉我们 boost modifier, 就是 说两个用户同时修改了这一个文件,那这种情况下我们要怎么去解决? 这有个使用技巧,就是我们先从源头上解决,避免经常遇到冲突。第一个是每次你修改代码的时候,你就先拉一下远端的最新的代码,修改后呢你要立刻去提交,你不要攒着攒很久再提交。 第二点是作为测试工程师,一般是分模块测试的,每个模块你最好是用不同的文件,每一个模块有不同的负责人,所以就是不同的负责人,你去负责对应的测试文件,那你每次 只改自己的文件,只提交自己的文件的话,那遇到冲突的可能性是比较小的。但是如果还是遇到的冲突,你要做的就是首先你要确定留哪一部分,比如说刚才这个报错的冲突是这样子的,上面这一片是我自己的代码,下面这个是远端的代码, 然后这两个代码这个同一个位置,它不一样,要手动的去改这一部分,怎么样?手动修改,重新确定保留哪一部分,或者是合并两边的逻辑也是可以的。修改代码之后,删掉所有的不是代码的这一部分,然后重新去提交就可以了。 另外如果你想放弃本地的改动,直接用远端,那你也可以用这两个命令强制去拉取远端的代码,但是这个一定要小心一点,因为你本地的所有的改动都会被覆盖。 另外如果命令不太熟的话,你也可以直接用 get 的 可缩化工具,比如说 sos tree 这种工具。

兄弟们大家好,今天我给大家分享一下关于我平时 get 的 使用。首先第一个就是 get clone, 是 比如说平时我们要拉拉一些开源的项目,或者拉我们自己呃工作当中要拉的系统的话, 嗯,那原码的话,其实我们要通过 get clone 把项目拉下来。其次就是 get add, 比如说我们在项目当中改动了一个需求,那其实 get states 是 去看这个需求的变更, get add 是 相当于是把啊这个需求提交了,而 get commit 其实就相当于一个 commit 的 命令。之后一般我们 get commit 的 时候会比如说添加一些备注,比如说文档, 文档内容的优点,而 get pushed 就是 相当于我们本地的提交和远程的提交,我平常那个,呃,其次还有 get remote, 就是 就是 remote, remote 就是 比如说我们拉到一个本地的一个项目之后,要和远程的项目建立一个连接,通过 get remote。 其次还有一个平时不不怎么用的,就是我们平时可能项目当中其实会遇到一些什么问题呢?就是我们要回滚一个版本,回滚一个版本的话,那其实,嗯 嗯,那其实我们其实要回滚到某个版本,相当于我们可能会跨越版本之后把那个版本回滚了。那首先我们要 get log 先找到那个版本,比如说我现在要回滚的版本是回滚到变更标题的这个版本,也就说前面的版本我现在不要了, 那我们其实通过 git log, 呃呃,那个 git logs 先找到,先找到我们,呃要跳的那个版本,也就是变更标题这个版本,对吧?我们把它的 版本拉过来,拉过来之后 git 这个版本号 啊,那我们看一下是不是这个相当于这个版本就已经提交过来了。那如果说我们,嗯,当然啊,这个我们在通过 getstate 状态,其实发现我们已经跳过两个版本了。嗯,如果说我们不需要, 呃,跳过这个版本,我们也可以,比如说,呃通过 git pull 的 话还原,如果我们就是需要提交的话,正常的 git push 是 提交不了的,要 git push 杠 f 之后提交到远程的 master, 远程的 master origin master 才行。今天就分享这一点点吧。嗯,感谢大家。

有段时间,公司需要统计每个人的 commit 改了多少行代码,于是我一个不小心把一个七夕学习模型 git commit 了好几万行。我的 git 目录一下变成了几百页。 结果就是同事要克隆我这个仓库,得等十几分钟。于是我赶紧删掉模型,再次 commit, 但 git 并没有变更小。然后我试了各种办法, git ignore 等等等等都没有用。那一刻,我突然意识到,我其实根本不懂 git 是 怎么工作的,我只是记住了各种命令。 这个视频将用五分钟向你解释 git 是 怎么工作的。我保证,看完这期视频,你会是周围人中最懂 git 的 那个。简单来说, git 其实是依靠三种对象的引用来工作的。 三个对象分别叫做 commit tree 和 blob。 commit 就是 我们每次改动代码后的提交,它会指向一个 tree 对 象, tree 对 象表示这次 commit 发生时的目录,然后 tree 对 象再指向 blob 对 象。 blob 对 象就存储了文件的具体样子, 这些对象都存储在 get 目录中的 object 里。举个例子,这是我一个全新的项目,它还没有任何 commit。 我 刚刚新增了一个文件 text 一, 里面只有一行文本,然后我要提交一个 commit, 叫 commit one, 然后提交。 提交之后我们就可以看到这里有了我们刚刚的提交,它的哈希值是 e, d, d, f。 如果你不太了解哈希值,可以查看我之前的一个视频。简单来说,它是根据这个 commit 内容产生的唯一标识。 我们来看一下这个 commit 具体里面是什么样子的。我们需要使用一个 get 命令, get hit file, 然后参数 p 后面接。这次 commit 哈希值只需要写前几位就可以了。 于是我们就可以看到了这个 commit 里面的东西。我们可以看到它引用了一个去对象,这个去对象的哈希值是 c, a, a, e 以及这个 commit 的 作者是谁,这个 commit 的 提交者是谁,以及这个 commit messaging。 我 们继续看一下这个去对象里面是什么。 同样只用这个命令,然后使用去对象的哈希值, 就会看到这个 tree 对 象引用了一个 blob 对 象。 blob 对 象的哈希值是七三七 c 以及这个 blob 对 象所对应的文件的名称。我们再看一看这个 blob 对 象里面是什么。 改成 blob 的 哈希值就会看到它存储了文件原本的内容。通过这个例子,我们看到了 commit tree 和 blob 之间的引用。这样做的好处在于节省空间, 因为每个 commit 它都需要记录完整的结构信息,但如果将所有的文件都存储一遍,那这样耗费的空间就太大了。所以通过引用的方式,对于没有变化的文件,新的 commit 依然引用原本的 blob。 对 于变化或者新增的文件才引用新的 blob。 比如说我现在要新增一个文件,叫做 text 二,然后对于这个新增的 text 二,我提交一个 commit, 这 commit 就 叫 commit 二。简单点,那我们回到我们的提交历史,可以看到 commit 二,它的哈希值是九五七 c, 我 们再来看这个九五七 c 里面是什么样的。 可以看到同样有 tree or the commit 和 message 四个蓝位,但多出了一个刚刚我们没有见过的蓝位,叫做 parent。 parent 是 e、 d, d, f, 刚好和我们的 commit 一 的哈希值是一样的,所以这个阈尾它表示的是这一次 commit, 它是从哪个 commit 衍生而来。那我们再看看这个 commit 二所引用的 tree 对 象是什么样的。使用这个 tree 对 象的哈希值看一下啊, 可以看到它引用了两个 blob 对 象,一个依然是我们刚刚用的七三七 c, 就 像这里用的是七三七 c。 另一个是新增的一个 block 对 象一六九 d, 它对应的是我们新增的 text 二。 这样 text 一 的 blob 对 象就被再次利用了,不需要再存储一遍,节省了一些空间。但是 blob 对 象一旦被创建, 就不会再被修改或者删除。也就是说,即使我修改或者删除了 text 二,这个一六九 d 的 blob 对 象都将永远存在。比如我现在删除这个 text 二,然后再提交一个 commit, 可以 看我现在提交了第三个 commit, 删除了 text 二文件。那么看一看我们的 git object, 下面 我们还是可以找到这个一六九 d。 这个文件就是我们的 blob 对 象,它的命名方式是文件夹的名称加上文件的名称,就是全部的哈希值。到这里 你应该就能明白视频开头我的 get 步入那么大的原因了,因为表示我模型的 blob 对 象一旦生成了就不会消失。 但解决方案你可能也想到了,我可以先删除提交模型的这次 commit, 让模型的 blob 对 象成为没有被引用的悬空对象,再删除掉没有被引用的对象。 总之, commit tree、 blob 这三种对象就是 get 工作的本质。你可能会疑惑,哎,我们熟悉的 branch 去哪了? branch 不是 一个对象, 只是对某个 commit 的 引用。我们每次 check 到一个分支上,其实也只是跳到某个 commit 而已。我们随时可以指定任何 commit 作为任何 branch。 我 们还可以删除 branch, 但不会影响 commit。 你 可以在 git 目录下的 revs 下面找到各个 branch, 它存储在 head 下面。 像我的这个仓库,目前就只有 main 分 支。打开看看,你可以看到它的文件内容是九八 e a, 刚好和我的 commit 三的哈希值是一样的。以上就是本次视频的全部内容,现在的你应该完全理解了 git 是 怎么工作的,并且应该再也没有任何 git 问题会难住你了。感谢你的观看,我们下次再见。