粉丝1.9万获赞22.1万

好,现在统一说一下这个 get 一个 null 文件啊,很多同学不知道这个文件里边该咋写。呃,主要的问题呢在于这个文件里边有很多种写法啊,你要清楚,第一种写法呢,就是你直接输写一个单词,它表示啥意思呢?表示 匹配的是你整个工程里边所有的 diss 目录或者 diss 文件,不管这个目录和文件埋的有多深,比方说你这里去新建一个文件叫 diss, 这个文件呢,你看就会被排除掉。 或者是呢,你去新建一个类似目录,那么这个目录呢,他也会被排除掉,你看变灰了是吧?而且他不管他埋的有多深,比方说他可能是一个子目录也没关系,他也会被排除,看到没啊, 我这里放大一点啊。好,就这种写法好。第二种写法呢,就是带斜杠的写法了。带斜杠呢,其实也有两种情况,一种呢是斜杠在前面或中间, 比方说你写到前面的话,表示啥意思呢?它表示的是从当前这个 get 一个 no 文件出发,去寻找相应的这个目录或文件。那你看这样子寻找的话,这个东西就匹配不上了,它就没有被排除, 是吧?那如果是把它拉出来呢?哎,那就能匹配上,它就被排除掉了,对不对?那跟第一种做法是不是有区别?第一种做法不带斜杠的做法,是不是不管它埋的有多深, 它都能匹配?但是呢,你给了斜杠过后,它就要从当前目录出发去寻找了啊,这个斜杠在前面,那么斜杠在中间呢,是一样的道理啊,那么这个写法呢,也是一样道理,从当前目录出发去找到 a 目录下面的 guest, 然后把它排除掉,那么你看现在呢,在根目录下,它就不会被排除,它到子目录下呢,它才会被排除。 看到没好,就是斜杠在前面和中间的情况,那么斜杠还有一种情况就是在末尾,这啥意思呢?那这种写法的话,就跟那个第一种写法就是啥也不写,就直接写个单词,这种写法呢,差不多有一点点区别。什么区别呢?就是这种写法呢,它只排除目录,它表示说我要排除的是这个 disk 目录,而不是排除 disk 文件 啊,不管他埋的有多深,你看这个目录埋在 a 里边能不排除吗?是不是也能被排除?放到根目录下面呢?是不是也能被排除?但是呢,这样子的文件是不能被排除的啊,不要说把这个删掉,建立个文件,你看这个文件是没有被排除的,懂这意思吧?啊?他在区分目录和文件的 打字给斜杠的写法啊,像我讲的一些小知识小点啊,如果说对你有帮助的话,那么强烈建议你啊,一定要来看看我的大师课,大师课是完全免费的,来领取,完事了,小知识小点呢,他能解决一些小问题,特别是工作当中的一些小问题,但是他对薪资的高低和职业发展 关系不大啊,不能说完全没关系,他关系不大,你真要想解决职业发展的问题和薪资高低的问题,就需要成体系的核心知识。那这些知识呢,都在咱们大师课里边,而且学这些知识花不了多少时间,几天的时间搞定,因为我非常清楚同学们缺在什么地方,是哪些地方出了问题,导致你现在的困境 没有那么复杂,你把这些问题一个一个解决了就完事了。你说大师课来干嘛的?是来解决问题的,解决什么问题?解决的是最大化影响你薪资高低和职业发展的问题,要什么事件循环,浏览器渲染原理,框架的原理,原码优化。所以同学们平时不太愿意去啃的东西,大师课就要让你直接面对他, 并且我跟你讲的准确度和深度是你一定从来没有接触过的。你把这些问题搞定了,无论是在就业环境还是在工作环境,一定能建立巨大的竞争优势。永远记住啊,咱们玩的是一个竞技游戏,我们不在乎绝对的强弱,在乎的是相对的优势,你比别人强就可以了。关 键是咱们大师课已经帮助过很多同学完成的就业掌心,相信对底也是能够起到作用。关注这个课呢,目前可以免费领啊,怎么领?在咱们账号主页,点击头像进入账号主页,根据提示领取,完事了。 这是斜杠的写法啊。第三种呢,就是一些特殊符号了啊,比方说像这个星号,星号呢,表示通配符,它匹配零个或多个字母,但是不包括斜杠,它是不匹配斜杠的。比方说,我们经常会写什么呢?比方说我们经常会匹配这么些文件啊,后缀名为 log, 前面的无所谓。那么这样子能匹配什么呢?它就能够匹配所有的日制文件,像这里的 log 是 吧?是不能匹配对吧?变灰了是吧? 摆在任何一个目录下边的 log, 它也能被匹配,你看你变灰了。好,当然通配符呢,也可以跟随其他的规则联合使用,比如说我们经常会这样写啊,日制的话,一般是放到 log 文件里边是吧?好,那么这边一般放日制,那我要匹配的是什么呢? log 文件里边的所有日制,看到没,就可以这样写,那么外边的日制呢,我就不匹配了,比方外边还有个日制,我就不匹配了,对吧? 好,那么除了这个新号写法之外呢,还有一个写法,就是问号的写法。问号的写法呢,它跟新号不一样的地方就在于问号呢,只匹配一个字母,所以说你可以看到啊,这个一点 log 呢,匹配上了,这 dead 呢?没有匹配上。好,除了这个问号写法呢,还有个中括号的写法,它也是只匹配一个字母,但是呢,它可以进一步约束,比方说字母呢,必须是零到九的数字,那你看这一点 log 能匹配, 那如果说我写这么一个 a 点 log 呢啊,你看它就不能匹配,能理解这意思吗?是不是非常简单?好,这是一些匹配制服的写法,其实还有一个制服啊,就是两个信号,比方说我们经常会看到这种写法,两个信号,斜杠,信号点 log。 这个两个信号啊,它跟一个信号的区别就在于两个信号呢,它是可以匹配任意制服的,包括斜杠。 那么这个表啥意思?表示我匹配的是 log 目录下边,不管你埋的有多深,只要你是 log 文件,我都能匹配。但是如果说你不给两个信号的话,你看一下,你看这个就匹配不上,看到没啊,就是区别好,除了这些匹配制服的写法之外呢,还有一种写法也挺常见的,就是感叹号表示排除,就是在前边匹配的基础上,我排除掉一些东西。 那这种写法经常见于什么情况呢?比方说咱们这里呢,是一个服务端的开发,服务端的开发呢,可能会有这么一个文件夹啊,叫做 upload 上传文件,就是来保存用户上传过后的文件,那用户会在这里边上传很多东西,是吧?可能有图片,也有可能是有些纸目录, 目录下边呢,可能会上传一些什么压缩包之类的乱七八糟东西啊,总之用户上传东西都保存在这个 upload 的 里边,那么往往的情况是啥呢?就是用户上传的东西呢,我们是不需要去跟踪的动态的,是吧?他不需要跟踪,所以说呢,我们往往会这样写,我要匹配 upload 的 下面的所有的 文件,你看把这东西全部排除掉,但是如果说你真的这么去做了,会导致一个什么问题呢?会导致的是你这个目录下面所有东西都没有被跟踪,是吧?他就不会上传到远程仓库,也就是说远程仓库那边他是没有这个目录的,连目录都没有,那到时候呢, 可能会出一些问题,就是我现在希望的是什么呢?这个目录呢,你得给我保留这个目录里边的其他东西呢?我不需要匹配,我不需要跟踪,但是目录你得跟踪,但是呢,这个地址它又不跟踪目录咋办呢?那么我们经常的做法是这样啊,在这个目录下面呢,去建立一个文件,叫做 gitkey, 这个文件里边啥也没有,啥也不用写, 我希望的是你要跟踪这个,你只要跟踪这个文件,那你想啊,这个文件在哪里?是不在 upload 的 目录下面,那么目录就被跟踪了啊,这个文件经常就是起这么一个作用的啊,应该有不少同学看到过这个文件啊,但是呢,我们现在的问题是啥呢?就是我这样子一写吧,它里面的所有东西全部被 移除了,那我要做一件什么事呢?我要在这个基础上排除掉 disk keep, 那 么我就会这么写一个感叹号, disk keep 就是你其他东西正常进行,但是 keep 呢,你必须要给我保留。这个感叹号的意思就是在前面的匹配结果上,我去掉这东西,你得跟踪这个啊,这是一个非常非常常见的写法啊,那么这样子一来,你看这个文件就被跟踪了,这个文件一被跟踪,这个目录就被跟踪了,那么到远程仓库的时候呢,远程仓库里面就会建立这么一个 upload 的 目录,然后呢,里边只包含一个文件。 keep 主要起这么一个作用啊,那就说的差不多了吧,还有啥呢?其实就差不多了吧,就是这个规则里边还是有很多东西啊,一些犄角旮旯的规则就不扯了,我们比较常见的呢,就是这一些东西啊,这东西呢已经能够覆盖绝大部分的开发场景了。

好,我们接下来简单的来介绍下,就是我们呃, get 怎么在这个 vs go 的 中进行一个使用啊?其实原理本质跟那个原理都差不多,然后 其实我们只要把这个底层的这些个命令,包括它简单的学员理理解了,其实这种图形化操作是很好操作的 啊,这是我们刚才的这样的一个项目,我们首先我们切换到我们这个 delete 部分值吧,我们也是同样,我们可能在这个下面我们进行一个一个更改,比如说我们新建一个项目叫 test, 呃,叫 test 零三 零三点,这样吧, 然后我们简单写一行代码,这块就让,嗯随便写一个代码吧,比如说我们写一个 public, 从这复制吧, 等于三,然后进行一个保存。然后通常情况下呢,我们需要,呃, 这个代码写完了,我们需要进行一个项目管理,我们点击这个右侧这块有一个原代码管理啊,原代码管理之后呢,可能有三个板块,第一个就是图形界面这个板块,然后又有更改为村支部,如果看不到的话,大家就把这个原代码管理把这块都勾勾起来啊,就可以了。 然后呢,呃,我们点击这个更改,嗯,其实就直接进行一个提交就可以了,其实你点这个小加号就把它放到这个 get a d, d, 然后 get commit, 点不点都可以啊,我们简单就进行一个提交,比如说我们就是,嗯,新建 新新,新建文件零三,然后我们点击提交啊,同样这个代码已经提交好了,我们可以看一下这个图形和界面啊,可以看到这块有已经有了一个新建, 哎,见不见咱的 development 啊,咱们点击一个新建终端这块,就能够把所有的这个树形都能够看得到, 比如说我们 d l 部分呢?就新建的这个文件零三嘛,对吧?然后我们现在给他需要同步到远程上,我们就点这个同步更改,但前提下你就要把这个远程库给添加上去,点一个三个小箭头,然后这块有一个远程添加远程库, 也是把那个 get 仓库员给放在上面就可以了,我们进行一个同步更改,这块我已经添加好了,就不需要再看到了啊,我们看一下这个界面有没有,我们可以看到这块已经有文件零三了,对不对? 同理的话,大部分情况下我们更改完之后需要也需要把它推送到这个主分支上嘛,对不对?主分支上,但是我们 现在只是在这个,呃,迪拜那么本地分支上进行主分支上,你看其实还没有这个文件,我们需要同样先给他合并吧,就是我们需要先合并到这个可能设备的不是那么特别好,我们用命令吧,那就这个大家还是推荐的, 推荐的大家去使用这个,嗯,但是他这个插件是花钱的,我们使用命令也是一样的, 就是只要理解这个过程就行,这块没有命令编辑,不对,没找到那个再看一下吧,然后我们现在是 get get log, 然后我们找到这个基本的一个操作,找到看查看分之 get brush 啊,然后我们当前在主分支我们进行合并就行了。这块有一个他这个比较好敲,我就不是他这个直接复制,我就不敲了, 然后给他名改过 diy 不 就行。 d e l o p。 好 哎,已经更改过来了,这回我们再上 vs go 的 看一下。看到了吗?我们主分支已经更改过来了啊。 嗯,其实他这个适配的并不是呢,不跟戴尔店适配那么特别好,我们主要需要。嗯,骑着面包车敲也可以啊,这样的话我们再把它推送到远程也是同样的原理啊。嗯, 心心见了颜色同步更改,确定给他拉上就行了。这会已经有了,同样我们就给他仓库,然后切换到这个慢分值, 然后也是有的稍写一下。 那可以看到 这样都是同步了的。好,就介绍到这里。

嗯,今天给大家简单的介绍就是我们,嗯, get 怎么在 idea 中去使用的? 嗯,我们大部分情况下呢,都是学的这个 get 的 一个基础理论,嗯,比如在网上搜这种 啊 git 的 教程,它一般都是让你简单了解 git 的 一个工作原理,然后你会用这种命令来在终端里进行一个使用,但是我们 可能在开发环境中结会结合着我们这个 vs code 或者是呃 ide 去使用到啊,我今天就给大家来简单介绍一下。首先我新新创建了一个文件目录, 如果我们想把它啊开始进行一个代码管理,我们手机首先就要呃把这个文件目录进行一个抽象,抽象成我们的代码仓库, 我们首先点击这个更多窗口命令,这块有一个提交,然后这块有一个创建 get 仓库,我们点击啊,这块会直接到你那个文件目录下,我们点点击打开啊,这样的话就已经出水话好了,我们可以看到 啊,已经有了一个慢分之。然后呢,我们在这个目录下进行一个编写代码,比如我们就简单写一个 test 类吧, t 在私立。然后呢,我们呃这块他会问你是否将呃以下文件添加到 get 处,我们可以选择取消或者添加这个,我们一会就呃手动添加吧,点点取消 啊。比如说我们简单的写一串代码吧,写一串代码的话写个慢方法,然后呃这块就 csma 的 第一次 测试提交好,这个代码已经写完了,现在我想嗯,进行一个嗯,提交管理嘛, 通常情况下我们是会 get enit, 然后 get 把这个代码文件进行一个 get edd, 但是我们在第二中呢,就不需要这么做,直接这块有提交,我们点击这个勾选,其实勾选这一步就相当于我们在命令行中 get edd 的, 把它 加入到我们这个暂存区,然后我们再 get commit, commit 会让你写一个提交信息嘛, 其实我们在这块写一个提交心,就是第一次提交,然后我们点一个提交的话,就类似于我们面板上窗口这个 get commit, 然后我们点击提交,这块没加上, 那我重新点击好,这样的话就已经完成了第一次这种提交。 嗯,然后我们再写一段嘛,就是我们写一个 test 二嘛,然后我们再进行一个提交,这一块就是第二次。 好,我们可以点击这个 get 分 支啊,可以看到它这块已经有了两次提交,第一次提交的话, 呃,这块是第一次提交吗?然后第二次提交的话,这块是第二次提交啊,就可以在这个分支中进行一个简单操作,比如说我们想要 想要什么呢?想要回复到第一次提交,怎么回复呢?我们可以点击这个,呃,第二次提交,点击这个还原提交啊,你看就可以直接的变成我们这个第一次提交, 它会还有一条信息,就是说 recover d s 提交,就是给它变到 d s 提交之前啊,很简单都是,如果我们在面对行的情况下呢,可能会用到 get recite 啊,然后通过这个版本号进行一个简单的一个操作,嗯,可以在这个目录下去看一下这个命令,来给他 get log 看一下,可以看到这些都有这个版本号,通常的话我们像刚才那样的恢复可能需要 get receipt, 把这个版本号复制在下面才能恢复的。第一次。 好,这就是我们简单的进行一个啊操作,但是通常情况下我们会使用到的是添加到远程仓库,远程仓库怎么来做呢? 嗯,我们首先点击这个 git, git 这块有个管理远程,管理远程之后呢,你需要,呃,就是把远程这个仓库 dyl 给输入下来,我们简单的在 嗯, git 中去找一下嘛。 git 中我们去新建一个仓库, 比如我们随便新建一个仓库,新建一个仓库叫 test git 啊,这块的话就私有的话,然后我们不需要选择这个抽象模板,就直接给它创建就可以了,创建的话它会有一个这样的链接,我们点击复制,复制过来之后给它添加到原车上 啊,就可以了,就可以了,这样的话我们就可以直接给他推送到远程进行一个管理。比如说我们 ps 踢掉,然后第三次,嗯,我们进行一个远程远程踢掉,然后把我们的一个框给这块勾选上第 三次远程提交,这回我们不要点击提交,提交并推送就可以给他到我们这个远程上。那可以看到啊,这块有说。嗯,将这个,嗯, 将这个主分支会推送到远程常驻我的主分支,我们进行一个推送。好,他正在推送,已经推送到临床操作上,我们刷新一下给大家看一下,可以看到这是我们第三次进行一个提交, 嗯,这会有个第三次远程提交嘛,对吧?嗯,但是通常情况下需要你配置一下这个 get 啊。

不知道为什么,在网上面教大家在 windows 下部署 opencloud, 都是让大家先安装好 node get, wsl, 最后再安装 opencloud, 非常奇怪哈,基本上都是这样科普的,但是但凡你是通过 wsl 去部署 opencloud, 你 在 windows 下装 node get 这些呢,完全是白费功夫。 wsl 它的全称呢,是 windows system for linux 翻译过来啊,就是一个适用于 linux 的 windows 子系统, 它主要呢就是让一些用户或者开发人员就不需要再像传统一样配置虚拟机,搭建双系统啊,直接就可以在 windows 上面呢原生的运行 linux 环境。当然这里面我们从文件读写的角度来说, windows 和 wsl 它们的文件访问呢,是互通的, 但是软件的安装呢,是完全隔离的,因为底层的环境就不一样,所以你们在 windows 下装完 no 的 get。 但是呢, openclock 又是部署在 wsl 里面的, 简单来说呢,就是装在 linux 环境里面。那为什么我们要把 opencl 装在 wsl 里面呢?那是因为 opencl 它的插件生态呢,都是基于 linux 而 unix 来开发的, 并且对苹果系统呢也做了优化。所以如果你的 opencl 是 部署在 mac 或者 linux 下面呢,它的运行体验就会比较好, 但是直接安装在 windows 下面呢,它就可能会出现问题。所以我们才要用到 ws l 的 linux 环境来部署 open core, 这样子呢,它的体验才会比较好。但是一上来呢,你们又把 node 这些呢装在 windows 下面, ws l 里面还是没有的。最后 open core 检测到环境里面没有这些东西, 它还是要给你再装一遍,我们可以来检测一下啊,现在呢,我还没有进入 ws l 终端,这里还是在 windows 下面的,我来分别检测一下 node 和 git 版本, ok, 现在呢,我来进入 ws l 看到这一行啊,现在我们就已经进入 linux 环境了,也就是我们的 openclaw 其实是安装在这一个环境里面的,然后我再来检测一下 node 和 git, 大家看到没有,无论是 node 还是 git, 在 windows 还是在 wsl 里面,版本号呢,都不一样,因为软件的安装在这两个环境里面呢,它是隔离的,你在 windows 下呢,一上来就把 node git 装好, 然后再来装 wsl, 这个时候 linux 环境里面还是没有这一个,你真正想手动来安装这些呢,起码也是等你先把 wsl 装好了, 也就是进入到这一个目录环境里面再来安装呢,那是可以的,但是既然 opencloud 它可以自动安装这些,那我们就直接交给它,让它检测到环境需要什么,它自己来安装。所以大家在 windows 下面来部署的话,就不用一上来就装什么 node 而 get 了, 又浪费时间又浪费功夫,一出错呢又折腾,我们直接就把 ws l 装好,装完之后呢,就可以开始安装 open core 了。具体在 windows 下面怎么样来部署 open core, 大家可以看我上一个视频啊,有非常详细的步骤啊,跟着来做的话,基本上都可以成功了。

我们今天就来好好解析一下 get, 看它在芯片验证这个领域,是怎么从一堆乱糟糟的代码里帮我们理出头绪,实现那种天衣无缝的团队合作的。 好,咱们直接切入正题,先问大家一个问题,扪心自问一下,你的项目文练家是不是有时候感觉就像一个数字垃圾场?如果你经历过那种一个目录里塞满了各种各样乱七八糟的版本文件,那你肯定懂我的意思,没有一个像样的版本控制系统,项目很快就会乱成一锅粥。 咱们来看几个简直就是噩梦一样的场景,看你中招了没?第一个,我管它叫祖传代码命名法,文件里全是这种什么 nv v, 二下划线、 final d s v, 还有更绝的 nv v, 三,打死不改版 d s v, 还有啊,更惨的覆盖大悲剧就是你同事辛辛苦苦写了好几天的代码,结果被你不小心一个复制粘贴,全没了。 最让人澎湃的还是神秘 bug, 昨天跑得好好的代码儿,今天突然就不行了,可文件改动有好几百个,上哪儿找问题去?简直是大海捞针。不过呢,好消息是,面对这种混乱,其实咱们有更好的办法,这个办法的名字就叫 get。 那么 get 到底是个什么东西?你可以把它想成是咱们代码的时光机,同时也是分身术。你看它本质上是一个分布式的版本控制系统,能帮你把每一次的修改度记录下来,而且还能让你和团队其他人合作的时候不会互相打架。所以说它带来的就是秩序和效率。 get 的 核心原理其实特别好理解,它就分了三个区,第一个呢,是你的工作区,这个好懂,就是你实实在在写代码、改代码的地方。 然后是第二步,赞存区,这个地方,你可以把它想象成一个购物车,你觉得哪些修改可以了,就把它们放到这个购物车里。最后一步就是本地仓库,这就相当于你的个人档案馆了,所有你结账后的修改都会被永久的记录在这里。 好了,基本原理明白了,那咱们就得来点实际的了。接下来咱们就来看一个验证工程师在日常工作中最常用最重要的几个命令到底是什么?记住,在你动手做任何提交之前有一个习惯。最重要的几个命令到底是什么?记住,在你动手做任何提交之前,有一个先停一下,看清楚你到底改了些什么。 这个简单的动作就像一个安全检查,能帮你避免好多低级错误,比如说把一堆没用的临时文件也给提交上去了。这时候啊,就轮到一个超级有用的命令出场了, get status s, 你 想象一下啊,你刚跑完一次,仿真文件夹里生成了一大堆日制文件,波形文件。用这个命令,它就能帮你过滤到这些杂音,一目了然地告诉你,你真正修改得到此 s b 文件是哪及格。 这样一来,你不就不会手滑把那些无关的文件也提交进去了吗?它给你的就是一个特别干净清爽的盖了。确认好要提交哪些文件之后,咱们前面说的那个购物车比喻就派上用场了。你用 get add, 就 好像是把你的新写的 app 驱动和监视器捡起来放进购物车里, 然后呢, get commit。 这个动作就相当于去收银台结账,把购物车里所有的东西,也就是你赞成的修改给永久性的保存下来。 但是这里特别重要的一点是,结账的时候你得写清楚小票信息,也就是提交信息,比如修复 a b b p n able 协议错误,这样以后你回来查账,才能一眼就看明白当时是为啥改的。 有时候咱们也需要删除文件,对吧?这里有两个命令很容易搞混, get r m 这个命令很彻底,它会把文件从你的文件夹里,还要从 get 的 历史记录里都给删掉。 但是 getr m 杠 c h a c h 就 不一样了,它只是告诉 get 位,以后你别再管这个文件了啊,但文件本身呢,还好好的待在你的本地文件夹里,这个有什么用呢?举个例子,比如你一不小心把一个特别大的仿真克制性文件给提交了,用这个杠 r m 杠 c h a c h 选项就能让 get 以后忽略它,但你本地还能照常用,就很方便 好了。自己啊,一个人怎么用 git? 咱们差不多搞明白了,现在重点来了,我们把目光转向团队协助,看看 git 是 怎么让一群人高效地在一起工作的。在团队里干活儿,你首先要问自己的一个问题,就是我现在在正确的分支上工作吗?你要知道,分支这个东西是让大家能同时开发,又不会互相干扰的基础。 其实管理分支很简单,你用 git branch 这个命令,就能马上看到你现在在哪个分支上,避免在主分支上乱改。而 git checkout 呢,就是让你在不同分支之间来回切换,比方说设计那边修复了一个 bug, 你 就可以用 checkout 切换到它们的 rtlfix 分 支,把最新的代码拿过来,然后跑你的测试验证一下这个 bug 是 不是真的修好了。 你看这样每个人都能在自己的小天地里工作,互不干扰多好。说到从服务器上拿最新的代码 fetch 和 pull 这两个命令很多人都分不清。我给你打个比方, get fetch 就 像是只看不动,它会把服务器上最新的历史记录下载下来,但不会动你正在写的代码,这在你自己的活儿还没干完的时候用就特别安全。 而 get pull 呢,就比较直接了,它不仅下载,还会马上尝试合并到你当前的工作里。所以啊,一般早上到公司第一件事就是用 get pull 把团队昨天晚上所有的更新都同步到你电脑上。 好,现在你本地的功能已经开发完了,测试也全都通过了,完美。那接下来就该分享你的劳动成果了。这时候你就可以用 get push 这个命令,把你本地的这些提交一把,推送到共享的远程仓库里去, 这样团队里的其他人就都能看到你的杰作了。接下来我们来聊聊 get 最酷的功能之一,那就是它的安全网。这个安全网啊,能让你像个侦探一样去破案找 bug, 还能像拥有超能力一样让时间倒流。 咱们来想象一个场景,就叫谁动了我的记分板,一个回归测试突然就失败了,这时候怎么办?你就可以用 get lock scoreboard 编 s v 这个命令,专门去看这一个文件的修改历史,这样以来,你很快就能定位到最近一次是谁改了它,然后你就可以直接端着电脑去找它聊聊了。你看,这就是 get 的 侦探能力。 而 git reset 呢,简直就是征集后悔药。比如说你心血来潮搞了一次特别复杂的代码重构,结果哪了?全搞砸了,动都动不了了。别慌, git reset 杠 hard head。 这个命令可以一瞬间就把你的代码完完整整地恢复到上一次提交的那个好的状态,就好像刚才那场灾难从来没发生过一样。 好了,到这里,我们基本上已经把日常工作里百分之九十的场景都覆盖了。那接下来,我们基本上已经把日常工作里百分之九十的场景都发生过一样。好了,到这里,我们基本上已经把 git 高手。 如果你听到现在还是觉得这些命令有点多,有点头大,没关系,我建议你不妨试试像打游戏一样去学 git。 在 这儿我强烈推荐一个网站叫 learn git branching。 为啥推荐它呢?因为它特别的可视化,整个学习过程就跟打游戏闯关一样,你每敲一个命令,它那边就会动态地把分支图给你画出来,这样你就能非常直观地看到哦,原来分支和指针是这么移动的,这对于理解那些比较抽象的概念真的非常有帮助。 那么在最后,我想留给大家一个问题来思考一下,除了 get 之外,你还能想到哪些像这样看不见的工具?但它们却又是我们现代科技真正的基石。你看, get 本身并不生产芯片,但是如果没有它,我们现在这些极其复杂的芯片项目团队合作根本就无从谈起。好了,感谢大家的收听。

大家好,欢迎收听。今天啊,咱们来聊一个特别有意思的话题,就是现在越来越火的人工智能编程助手,这些工具是越来越厉害了没错,但他们其实一直有个挺要命的问题,一个大家可能都没太注意到的问题。 来,咱们先从一个场景开始说起。这个场景啊,我估计很多开发者听了都会觉得后备一两。想象一下,你让 ai 去改一个核心函数,比如说叫 user service validate, 他改的挺快,看起来也没啥毛病,但问题是他根本就不知道你整个代码库里还有整整四十七个其他函数,都依赖着这个函数的返回类型。结果呢,一个看起来人畜无害的小修改,直接导致了一堆破坏性的变更,就这么上线了。这就是咱们今天要聊的核心问题。 好,那咱们就先来深入聊聊 ai 的 这个盲点到底是怎么回事。你看现在的 ai 写代码的能力真的很强,一些复杂的逻辑它都能搞定, 但是它看不到整个代码库的大局途径。这就好比什么呢?就像一个天才程序员,技术超群,但他偏偏被蒙上了眼睛在工作, 他能写出非常漂亮的一行行代码,但他根本不清楚这些代码和整个庞大的系统是怎么互相影响的。很多那种特别隐蔽但又非常致命的错误就是这么来的。那这个问题要怎么解决呢?说白了,其实也简单,我们得给 ai 一 张地图, 这一张所谓的地图用专业术语讲,就叫代码知识图谱,它到底是个啥呢?其实就是一个结构化的地图,把整个代码库的所有信息都画上去了,它能追踪到每一个依赖关系,每一个函数调用链,以及代码和代码之间的各种关联。 说得再形象一点儿,它就等于给 ai 创建了一套完整的神经系统。有了这个神经系统, ai 再去修改代码,就不再是盲人摸象了,它能清楚地感知到自己随便动一下,可能会牵扯到哪些地方。 好了,概念聊得差不多了,咱们现在就来看一个具体的工具,看看它是怎么实现这个想法的。这个工具就叫 get access。 哎,说到 get nexus, 咱们得先澄清一个事儿,因为很多人容易搞混。你看,有个东西叫 sony type nexus, 名字听起来特别像,对吧?但它俩完全是两码事儿。 get nexus 是 一个代码智能引擎,而 sony type nexus 呢,是用来存商包的仓库。 这里有个比喻特别好,能帮你一下子就记住。 get nexus 就 好比是一本历史笔记本儿,记录代码是怎么一步步演变的。而 sonata nexus 呢,更像是一个材料仓库,存放的是软件最终打包好的成品。一个关心过程,一个关心结果,这点啊,大家一定要分清楚。 那么 get nexus 到底是个什么样的东西呢?简单来说,它是一个开源的,而且是零服务器的代码智能引擎。 这里最最关键的一点就是,它所有的工作百分之百都在你自己的电脑上完成,管你是在浏览器里用,还是在命令行里用,都一样。这就意味着你的代码永远永远都不会被上传到任何外部服务器上。它能帮你深入的理解任何一个代码库的架构,同时保证绝对的私密和安全 啊。对了,对于开源项目来说,它是免费的。那最有意思的部分来了, git nexus 是 怎么画出那张地图的?这可不是随便扫一下就完事了,它有一套非常严谨的流程。第一步,结构分析, 先把整个项目的文件结构、文件结构给摸清楚。第二步解析,用 tree sitter 这种工具,把代码里的函数类、方法这些基本单元都给抽出来。 第三步,关系解析,追踪代码里所有的引用关系和函数调用。第四步,具类,把功能上相关的代码块组织在一起。 第五步,流程追踪,从程序的入口开始,把整个执行流给跑一遍。最后一步,建锁瘾,建立一个混合搜索的锁瘾,让你能非常快地找到想要的信息。你看,这一套组合拳下来,代码的里里外外就被它摸透了, 了解了原理。那作为开发者,我们具体该怎么用它呢?其实主要有两种方式,你看左边是命令行模式,也就是 c l i 加 m c p, 这个特别适合咱们日常开发,你可以把它跟你用的 ai 编程工具,比如 cursor 或者 cloth code 结合起来。 再看右边是网页版,也就是 web ui, 这个呢,就更适合做一些快速的代码探索、项目演示或者一次性的分析。但不管你用哪种,记住最重要的一点,所有东西都在你本地跑,绝对安全,绝对私密。 好,讲完了工具本身,咱们把视角再拉远一点儿。其实像 get nexus 这种工具的出现背后是一个更大的行业趋势,这个趋势就是智能体 ai 正在崛起。 genexus 最牛的地方到底在哪?它的核心创新其实是四个字,预计算智能。 咱们平时听得比较多的 r a g, 也就是解锁、增强生成。它的做法是什么呢?是让大模型自己去一个原始的知识库里头瞎逛,问好几次问题,希望能找到点有用的上下问, 这个过程又慢又费偷啃,而且还经常找不到关键信息。但 gennexus 的 思路完全不一样,它在建立索隐的时候,已经把所有结构化的信息都预先计算好了, ar 只要问一次,就能拿到一个结构完整、信息全面的上下文。 这么做的好处是什么?就是让 ai 的 工作变得又快又准,效率极高,甚至能让一些小模型也具备强大的大局分析能力。 这个趋势啊,可不光是我们自己说说。我们来看一份来自 utorry 的 市场报告,里面有一句话说的特别好,智能体相关的基础建设正在走向成熟,而商业变现会紧跟着实际用量和效果而来。这就等于给咱们正在讨论的这个方向盖了个权威的章。 这份报告还提到了几个 ai 开发领域种在冒头的新赛道,第一个叫 ai 原生基础兼属时,说白了就是给未来各种 ai 智能体生态系统铺路搭桥的底层管道工程。 第二个叫设备端 ai 智能体,也就是完全在咱们自己手机、电脑上运行,主打隐私安全的软件。 那 gnexus 处在什么位置呢?它就是这个 ai 原生基础间属实里面一个非常典型的例子,它给那些在本地运行的 ai 智能体提供了它们最需要的东西,代码智能。 讲到这里咱们差不多可以来总结一下了,看看这个技术转变对我们软件开发的未来到底意味着什么。 这个我们一直在说的代码智能,大家千万不要把它只看成是又多了一个新工具。 不是的,它正在成为未来由 ai 驱动的整个开发技术站里最最基础、最不可或缺的那个管道工程。它不是一个可有可无的插件,它是地基,这一点我觉得直观重要。 那么最后咱们用一个问题来结束今天的分享,一个需要我们每一个人都去思考的问题, 当 ai 智能体真正拥有了代码的神经系统之后,我们人类开发者的角色又会演变成什么样子呢?好了,这次的分享就到这里,感谢大家收听。

嘿,各位开发者朋友们, get commit 这个命令,你们是不是想都不用想就敲出去了?就跟肌肉记忆一样对吧?但是啊,你有没有停下来想过这背后到底发生了什么?今天咱们就来深挖一下,你想想,你把文件暂存,随便写个提交信息,然后一敲回车,刷的一下就搞定了, 整个过程可能连半秒都用不了。但你信不信,就在这一眨眼的功夫里, git 已经悄悄地完成了一项非常了不起的工作。所以啊,这半秒钟里到底发生了什么呢?来,咱们今天就把这个过程给它掰开了,揉碎了看, 我们会把这半秒钟无限放慢,跟着 git commit 这个命令走一遍它的完整旅程。我跟你保证,等你看明白了,你绝对会惊叹, git 的 设计原来是这么的简洁和巧妙。 好的,咱们就从头说起。因为啊,你可能想不到,整个魔法的开端其实还不是在你输入 get commit 的 时候,它真正的起点是在你运行 get add 的 那一刻。 嗯,要理解 get, 你 首先得知道它有三个核心的区域。第一个呢,就是你的工作目录,这很简单,就是你真正在编辑文件的那个文件夹, 然后是仓库,也就是那个隐藏的点。 get 文件夹,所有东西最终都永久存放在这里,而连接这两者的桥梁就是暂存区。它还有个名字叫缩隐,也就是 index。 这个是关键好,第一个很多人会忽略的关键点来了, 当你运行 git add 的 时候, git 可不是简单地记下啊,我要把这个文件加进去,不是的,它会立刻读取这个文件的内容,把它压缩,然后算出一个独一无二的 sha one 哈希值,最后把这个压缩过的内容作为一个叫做 blob 的 对象,直接存进 dot git 叉 objects 目录里。 你没听错,在你 command 之前,你的文件内容其实就已经进到仓库里了。这个 blob 对 象的设计说实话真的非常巧妙,因为它只关心文件的内容,所以那个哈希值也完全是由内容决定的。 你看这张图就一目了然了。假如两个文件哪怕文件名不一样,只要里面的内容一模一样,那么 git 就 只会存储一个 blob 对 象。这就是 git 在 处理大型代码库时还能保持高效的秘诀之一。我们管它叫内容驱虫,非常强大。 好的,既然 blob 已经存好了,那 git 总得有个地方记一下我们下次提交到底要包含哪些文件的哪个版本吧。这个地方就是我们刚才说的缩影。 我觉得这个购物车的比喻简直太贴切了,你用 git add, 就 好像是把一个个改动,也就是商品放进购物车里。而 git commit 呢,就是最后去收银台结账,把购物车里所有的东西一次性永久保存下来。好,现在购物车装满了,我们敲下了 git commit。 那么 get 的 第一个任务是什么呢?就是根据所引里记录的所有内容,为你的整个项目咔嚓拍一张完整的快照。 嗯,如果说 blob 代表的是单个儿文件的内容,那 tree 对 象代表的就是目录结构。你可以把它想象成一个清单,这个清单上记录着某个文件夹下面有哪些文件,并且指向它们对应的 blob 哈希。同时呢,也记录着有哪些子文件指向它们对应的其他 tree。 哈希, 你看, git 的 优雅之术就在这里体现出来了。咱们假设啊,你就只改了一个文件,比如 s r c components button 这儿 g s。 那 么第一步,就像我们刚才说的, git 会为这个修改后的文件创建一个全新的 block。 然后呢,因为 button js 的 内容变了,所以包含它的那个 components 文件夹也得跟着更新,对吧?所以 git 就 会创建一个新的 components 文件夹也得跟着更新,对吧?所以 git 就 会创建一个新的 button js blob。 同样的逻辑, components tree 变了,那它的上一级目录 src 自然也需要更新。于是 git 又会创建一个新的 src tree 对 象,让它指向刚刚新建的那个 components tree。 你 看,这个连锁反应会一直向上一直传递到项目的根目录,最终呢,就会生成一个全新的根序对象,而这个根序对象就代表了你项目在这一刻的完整的快照。 那么重点来了,在刚才整个过程中,你发现没,我们其实只创建了几个新的对象,所有那些没有被修改的文件和目录,比如说 docs 文件夹, test 文件夹,它们对应的 tree 对 象和 blob 对 象全都被完整地附用了。 git 只是简单地把它们旧的哈希值重新引用到新的负 tree 里面去。这就是为什么 git 处理再大的项目也飞快的原因,因为绝大多数的提交都只是创建了少数几个新对象而已。 好,我们现在有了一个代表项目当前状态的根治对象了,下一步就是要把这个历史性的时刻给记录下来。没错,是时候创建 commit 对 象本身了。 一个 commit 对 象其实简单到让你惊讶,它本质上就是一个小小的文本文件,可能连二百个字节都不到,根本不是什么复杂的数据条目,它里面就包含了几个关键信息, 一个指向我们刚刚创建的那个根 tree 的 指证,也就是项目快照,一个指向上一个 commit 的 指证。历史的链条就是这么连起来的,还有作者和提交者的信息,以及当然了,你写的提交信息。 get 把这些信息打包算出一个哈希,然后把它作为一个 commit 对 象存起来。 好。到目前为止,这个新的 commit 对 象已经存在于 git 的 数据库里了,但它现在就像一个孤儿,还没有任何东西指向它,我们需要把它正式地连接到你的分支上。那么问题来了,这个新的 commit 已经创建好了,但是没有任何东西指向它。 git 是 怎么把它跟你当前的分支连接起来的呢?这可能就是 git 设计里最让人拍案叫绝的地方。到底什么是分支? 它不是什么复杂的数据结构,更不是你代码的一份拷贝,它就是一个普普通通的纯文本文件。比如在点 git 下面 rev slash has slash main 这个路径下,而这个文件里面就只有一行内容,一个四十个字母的 commit hash, 就这么简单。没错,你没看错,四十一个字节,一个四十位的哈希,再加一个换行符。这也就解释了为什么在 git 里面创建新分支几乎是瞬间完成的,因为它根本没有在复制你的文件或者历史,它只是创建了一个四十一字节六文本文件而已,是不是很神奇? 所以啊, git commit 最后一步,也是最关键的一步,其实就是一次超级简单的文件写入操作。 git 先读去 head 文件,找到你当前在哪个分支,比如说 main 分 支。 然后呢,他就找到对应的那个分支文件,也就是 delete slash, slash hash, slash main。 最后,他用我们刚刚创建的那个新的 commit 哈希,覆盖掉文件里原来的旧哈希,搞定你的分支指征,就这么向前移动了一步,指向了最新的 commit。 好 的,我们已经走完了整个旅程。现在呢,咱们把所有的步骤串起来,再来回顾一下 git 这套简洁又卓越的设计理念。 所以,在你敲下回车的那半秒钟里, get 到底做了什么?我们来快速回顾一下。第一,读取锁引。第二,构建一个新的 cheat 对 象,并且可能尽量地附用没变过的部分。第三,创建一个可 made 对 象,让它指向新的 cheat 和它的复可 made。 第四,哈希,并且存储这些新的对象。第五,更新那个小小的分支文件,让他指向新的,可没得哈希。哦,对了,为了安全起见,他甚至还会在 raflog 里记下这次变化。所有这些都只是基于简单的文件操作,完全没有复杂的数据库。 而这一切其实都源于一个非常简单但又极其强大的核心理念。整个系统就是建立在有可变指针连接的内容寻值对象之上的 blog tree commit。 这些对象一旦被创建,就永远不会改变我们通过它们内容的哈希值来找到它们,而分支呢,就是那些可编的指阵,它们在这些不可编的对象之间自由地移动,把你的项目历史给串联起来。 所以下次你再输入 git commit 的 时候,希望你能想起这背后的故事,欣赏它那份简洁而又强大的设计之美。

挑战从零基础小白自创 ai agent 智能体。首先来到 github, 找到这个开源项目作为参考,告诉 openclaw 我 们的需求。 openclaw 会自己制定计划,首先创建一个 ev 文件, 输入大模型的 a b, i k 和 u i l 以及模型。第二步,创建一个 loop pi 文件,这里可以选择让 openclaw 直接生成文件,也可以按他说的自己手动操作拷包这里直接复制到记事本。然后选择所有文件保存到项目文件夹里, 将刚刚的整个文件夹压缩机后发给 openclaw, openclaw 会自动帮你检查 bug 并修复。 openclaw 修复机后会将完整文件发送到非修的硬盘。我们测试一下, 依次输入命令,如果弹出这个页面说明成功了,目前可以实现基本的对话交流。最后感谢大家观看支持,下一期视频将会实现 ai 工具调用。

一个视频看懂店中的三大区域,我们分别来看这三个区域, 工作区,站存区,还有仓库。首先看出死状态,此时你的工作区空白,我们将新的内容写到这本打开的魅点其中,因为我们只知道店中能够保存我们的圆满,但这个时候我们刚写好的内容还是只在工作区。 如果我们想把我们的部分源码提交到仓库端,我们先使用 get m a 点肆意把刚写好的文件放入文档,此时还没生成永久记录,你随时可以把文件从框里拿回桌面调整。 在 v s code 的 终端,使用 get a 的 后,可以见左上方有一个写着暂存的修改。在 v s code 也有更简单的方法,我们可以直接点击有更改文件右边的加号,它这时也能变为暂存的更改。 如果想取消暂存,可以直接点同样位置的减号。最后你想提交到仓库时,就使用 get m 杠 m, 然后你的刘秘书就会帮你把你赞存区的内容提交到仓库的,仓库管理员会自动给文件贴个唯一的版本编号,并记录归党人时间。但是你需要自己写一个关于提交文件的说明。我们可以通过第二个来查看我们仓库中提交的这个是自动生成的版本号, 下一个是提交的用户,剩下两行分别为提交时间和提交信息。这时仓库中就有一份你认为完美的原码,如果不小心把工作区的内容写毁了,就能从仓库中调出完美的那份, 这时直接从仓库还原一份到我们的工作区就好了。下一节课结合 vs code 来教会你将原码上传到仓库。