在更新comfyui的版本之后,发现搜索框会特别卡

我以为是新版本的搜索框问题,换回旧版本的样式还是一样的卡,查了一下发现就是个插件冲突的问题

aigodlike-comfyui-translation

这个是一个翻译插件,可以切换中英文

但是新版本会跟他有冲突,我去看了一下github

作者已经不再更新了,我尝试更新最新版本,还是有这个问题,不过作者不更新了那就没啥办法

去社区看了一下,说是旧版本没有问题

那就直接切换旧版本就行,直接到这个插件的文件夹里,使用cmd命令行输入命令

git checkout cf8f9a8

搞定,换回插件的旧版本旧没啥问题了

git机制

主要是换版本的时候,出现一些警告,可以看到上面说了一大堆,什么你是游离的head,用git switch之类的,不过最终可以看到切换成功

HEAD is now at cf8f9a8 更新中文

于是我又查了一下这个是什么问题,顺便再了解一下git的机制

Git 存的不是 “差异”,而是 “快照”

这是 Git 最核心的设计,和很多老式版本控制工具不一样。

  • 老式工具(如 SVN):存的是 “变化”。比如你改了文件里的 3 行,它就存这 3 行的差异。
  • Git:存的是 “快照”(Snapshot)。每次你提交(Commit),Git 会给整个项目拍一张 “全照”,记录下所有文件当前的状态。

类比:这就像玩单机游戏。

  • 老式工具:只记 “你刚才打了哪个怪”。
  • Git:直接存了一个 “存档文件”,记录了你当前的血量、装备、位置等所有状态

简单来说,你提交新的版本,他是直接一个快照(跟拍照一样),把所有状态全部记录

每次你执行 git commit,就生成了一个提交对象

  1. 唯一 ID(哈希值):每个提交都有一个独一无二的 ID(就是你截图里的 cf8f9a8 这种,通常是 40 位字符,这里只显示前 7 位)。
  2. 包含内容
    • 指向刚才说的 “项目快照” 的指针。
    • 你的名字、提交时间、提交说明(比如 “更新中文”)。
    • 父提交指针:指向 “上一个提交”。

每个版本都有唯一值,用图书来比喻,就是这个id(类似我们前面cf8f9a8),就是书本后面ISBN编码,每本书都是不一样的

切换版本

每一本书按照版本排列,我们切换就是拿哪一本书出来看(对应切换id),所以我们直接切换id就可以回到历史版本

而且这个东西还不需要联网,我们从git上面拉取项目下来的时候,各种版本他都已经给你储存好了,就在.git文件夹里面

这里面已经记录了所有版本的信息,你一切换,直接就本地运行搞定,不用去联网

但是我有一个疑问,一个项目提交了几百万次(大项目),那么这个记录不会爆炸吗?明明是直接存快照的(每个版本都有一个存档)

git存储优化

其实他就是挂羊头卖狗肉,说是快照,其实也是有老版本svn差异存储

第一层优化:“懒” 得复制 —— 未修改的文件只存 “引用”

Git 虽然号称每次提交都拍 “全量快照”,但它不会真的把所有文件重新复制一遍

这里的核心逻辑是:

  1. Git 会给每个文件计算一个哈希指纹(SHA-1)
  2. 当你提交新版本时:
    • 如果文件 A 没有被修改,Git 会直接说:“这个文件和上一个提交里的一样,我不存新的了,直接用那个旧的指纹。”
    • 只有文件 B 被修改了,Git 才会存一份新的文件 B。

简单说就是,没改过的文件,他才不会傻傻复制一份,直接写个指针(纸条),说这个版本的文件跟某个版本一样,直接拿就行了

第二层优化:“压缩” 存储 —— Packfile 机制

上面那层优化是针对 “单个文件” 的。如果时间久了,积累了成千上万次提交,哪怕每次只改一点,积少成多也会变大。

这时候 Git 会启动 **“垃圾回收”(Garbage Collection)** 机制,或者你手动执行 git gc

Git 会做一件事:把所有松散的对象打包(Pack)

在这个 Packfile 包里:

  • Git 不再存完整的文件快照了。
  • 它会找出相似的文件,只存它们之间的差异(Delta)
  • 它还会用 zlib 算法对数据进行压缩

太大怎么办,那就压缩一下咯,里面只放差异部分,就是代码改了哪里,我就只存你改的部分就行了(差异的部分),这样空间就节省了很多

第三层优化:“本地” 优先 —— GitHub 只是备份

最后补充一个概念性的点:你要区分 Git(本地软件)GitHub(网站)

  • Git:是运行在你电脑上的程序。所有的提交历史、快照、压缩包,首先是存在你自己的硬盘里的。
  • GitHub:只是一个 “云端的 Git 服务器”。你执行 git push 时,才会把本地的这些数据同步一份上去。

所以,GitHub 确实也在它的服务器上存了这些数据,但那是 GitHub 要操心的服务器成本问题(他们有自己的大规模存储优化),对于我们用户来说,主要感知到的是本地 Git 仓库的大小

这个就是不用联网的原因,直接本地记录了这些数据,都在.git文件夹里面

git分支

这个就跟那一堆说的游离HEAD有关了,我们这样直接切换版本,他就会有警告,叫我们最好创建一个分支给这个版本

不然我们在这个版本修改代码,提交之后,代码容易消失(如果切换回最新版本的话)

东西 本质 类比 特点
提交 ID(哈希值,比如你的cf8f9a8 每个 commit 快照的唯一固定身份证号 一个存档文件的固定编号 一旦生成,永远不变。只要这个提交还在,这个 ID 就永远对应这个版本的代码,是死的、唯一的、不可修改的。
HEAD 一个可移动的「当前位置标记」 你看书时夹的书签 / Windows 里的快捷方式 它本身不是 ID,它的唯一作用是「指向你当前正在操作的那个提交」,是活的、会跟着你的操作移动的。

上面的看看就行,我是这样理解的,head就是书签,直接定位到你现在看的书的位置

正常来说是head指向主分支main(就是有最新版本那个),但是现在我们切换版本,他就直接指向那本书了

看起来没啥问题啊,但假设把这本书内容做扩展,写成了外传,出书之后,这个书签head就直接到这本所谓的外传这里来了

但是他没有分支啊,git不知道要给他放在那里,只能把这本书丢在地上,如果我们想看本传,把书签拿走到本传上面去

git回收机制会认为这本外传是个垃圾失败品(丢地上了),30天后直接删掉.....完蛋

创建分支

所以我们得给这本书放架子上,并且分类写上外传,告诉git这个架子是给外传放的,也就是所谓的创建一个分支出来

这样就不会有丢失的风险,也就是我们看到的提示上面写的git switch,这个是新的命令,那个所谓的git checkout其实已经淘汰了(不过我们不修改代码能用也行)

在 Git 2.23 版本(2019 年)之前,git checkout 是一个非常 “全能” 的命令,它承担了两项完全不同的职责:

  1. 切换分支 / 切换提交(操作 HEAD)
  2. 撤销文件修改(操作工作区文件)

这种设计虽然强大,但对新手极不友好,因为一个命令干两件事,很容易误操作(比如本来想切分支,结果把文件改没了)。

一个命令执行太多功能,所以细化成了git switch

为了解决这个问题,Git 官方决定 **“分家”**:

  • 推出 git switch:专门负责切换分支
  • 推出 git restore:专门负责恢复 / 撤销文件
  • 保留 git checkout:虽然不再推荐新手使用,但为了向后兼容,它永远不会被删除,老项目和老教程里依然随处可见。
功能 老命令 (git checkout) 新命令 (git switch/restore)
切换分支 git checkout main git switch main (推荐)
新建 + 切换 git checkout -b dev git switch -c dev (推荐)
分离头指针 git checkout <hash> git switch --detach <hash>
撤销文件修改 git checkout -- file git restore file (推荐)

反正区别不大,就是防止不小心切换分支的时候,用git checkout后面加了文件名,那么你修改的半天的文件就被撤销了

随便喜欢用哪个都行,反正我们是创建一个分支,名字随意给这个历史版本的书,后续你修改就会放到你的新书架上面了

当然这里我也只是了解一下,我又不修改,创建个鬼

git commit

其实就是把你的新书发布出去,然后有分支就会放在相应的书架上

一开始我想的是,那我这个历史版本提交了怎么不会到main分支的最新版本去,然后发现自己脑残了,你这个是历史版本修改的,跟最新版本的内容又不一样,这样放到最新版本不被骂死

类似你本来最新的把男二写死了,然后前面100章没死,你改了放到最新上去,就冲突了.......

所以就跟大树一样,有的往上走(本传),有一些往分支往旁边走,跟平行世界一样(外传)

ps :提示一下,commit提交的代码(书)都在本地的,你要发布到github官网上还得push上去

git add

说白了就是工作的缓冲区,跟保存草稿箱一样道理

Git 区域 类比 含义 对应你的操作
工作区 (Working Directory) 你手里的草稿纸 你在电脑文件夹里看到的、正在编辑的文件。 你打开 ComfyUI 插件的 .py 文件,修改了几行代码。
暂存区 (Staging Area / Index) 老师的「作业收齐清单」 一个临时存放区,存放你准备好要提交的修改。 你觉得这几段改好了,先把它们勾在清单上,但还没交。
仓库区 (Repository /.git directory) 学校的「档案库」 Git 真正存快照、存历史的地方。所有提交的版本都在这里。 你正式把作业交上去,老师给你存档,生成一个带编号的档案(Commit ID)。

总之就是给你放草稿的地方,你写一半,先放进去再说,然后可以继续修改之类的,也可以理解成购物车,等下要买再一起买(提交)

只要你还没有提交就行,提交了也可以恢复,无所谓

总结

直接使用git checkout或者git switch修改插件版本就行

git checkout cf8f9a8

当然你要是不想用这个也可以直接删掉插件,我看作者说去给官方的翻译做事了

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐