Git:进阶、衍生
概述
有没有想过或算过,你使用Git有几年啦?如果你还是一个Git新手,请参考:
- Git使用笔记
- Git Tag
- Git Cherry Pick
- Git clone/pull/push需要输入密码解决方法
- GitHub使用技巧
如果不是,请想一想,这么多年过去,对于Git的使用是不是还停留在那么几条命令行。
事实上,鄙人于2015~16年接触Git,自认为是一个比较敏感的技术宅,但还是有很多新特性或功能,不熟悉、没用过甚至没听过。
真的是:知道的越多,越发现知道的越少。
本文汇总一些Git进阶玩法,可能停留在概念和名词层面。
Git
Git LFS
经常在HF或ModelScope官网等平台看到git lfs命令行。实际上,HF和MS的远程模型仓库就是一个由Git LFS管理的Git仓库。
LFS是Large File Storage的缩写,即大文件存储。官网,GitHub。基于Golang实现,通过对Git客户端进行扩展的方式,集成并兼容原生Git客户端。
Git LFS为了解决大文件托管的效率问题,提供五大特性:
- 更大:支持GB级别的大文件版本控制;
- 更小:让Git仓库空间占用减小;
- 更快:仓库的克隆和拉取更快;
- 透明:Git使用上对用户完全透明;
- 兼容:权限控制上完全兼容(兼容Codeup权限控制)。
安装:
- Git LFS已集成在Git for Windows中,直接下载和使用最新版本Git即可;
- 官网下载可执行程序,如Windows平台的
git-lfs-windows-v3.7.1.exe,在Git仓库下执行命令:
# 执行下述命令自动新增/编辑.gitattributes文件
git lfs track "*.pt"
# 或直接编辑.gitattributes
vim .gitattributes
# 加入Git
git add .gitattributes
# 常规Git操作:git add、commit、push

.gitattributes文件示例:
*.pt filter=lfs diff=lfs merge=lfs -text
撤销LFS跟踪:
git lfs untrack "*.pt"
git rm --cached "*.pt"
--depth
经常看到类似于git clone --depth 2 https://github.com/jesseduffield/lazygit.git这种用法,即--depth N。
Git中用于实现浅克隆(shallow clone)的参数,只克隆仓库的最新N+1次提交(即最近N+1个 commit),而不下载完整提交历史。
如下图,N=2

git log只能看到3次commit,即N+1,有些资料说N次,是错误的。

git branch -a也只能看到3个分支,对于Lazygit这种大型项目,显然不可能只有一个(远端)分支:

用途和优势:
- 节省时间和带宽:无需下载整个Git历史(尤其是大型项目历史可能达几百MB甚至GB),只拉取当前代码快照;
- 节省磁盘空间:本地只保留一个浅层历史,适合只需要当前代码而不需要历史记录的场景(如 CI/CD、临时构建、只读使用等);
- 加快克隆速度:对于只需要构建或查看最新代码的用户非常高效。
限制:
- 默认情况下,无法访问历史提交、无法切换到旧分支(除非该分支的最新提交也在浅层范围内);
- 不能执行某些依赖完整历史的操作,如
git log只显示N+1条记录,git blame可能受限。
如果想追溯提交历史,可通过git fetch --unshallow完整克隆,或git fetch --depth=N追加N次提交。
Git Reset
Git Reset可将当前Git分支(HEAD)移动到指定提交状态,并支持使暂存区和工作目录与之同步。
git reset命令包含三种模式:
--soft:移动HEAD指针。仅移动HEAD的指向目标,暂存区和工作目录内容保持不变。例如git reset --soft HEAD~将指针回退一个提交;--mixed:更新暂存区,默认模式。将HEAD指向的提交状态同步到暂存区,但保留工作目录的现有内容;--hard:同步工作目录。将移动HEAD指针、重置暂存区,并使工作目录完全匹配目标提交。执行git reset --hard HEAD~后,指针位置、暂存文件和工作文件均将回退到旧提交状态。

Git Worktree
GitHub
GitHub也有很多新功能、特性。
Codespace


Lazygit
一款开源(GitHub,67.9K Star,2.3K Fork)的Git终端界面工具,使用Go语言编写,可直观地将复杂的Git操作可视化,让开发人员不用再去记忆那些繁琐的Git命令。可通过界面操作的方式,快速地进行拉取分支、切换分支、提交变更等操作。大大提高代码管理的效率。
功能:
- 指定行暂存:可以在选定的行上按空格键将其暂存,或者按v键开始选择一列行,同时还可以按a选择当前行的所有内容。
- 重置工作区:清除某个未提交的内容,可使用
shift+d打开重置菜单,然后选择nuke选项。 - 自定义命令:根据个人习惯。
- 工作树:可同时运行多个分支,无需切换分支时存储,使用w键就可以从所选分支工作树切换到该分支。
- 撤销:可使用
z键撤销上一个操作,然后使用ctrl+z进行重做。 - 提交图:支持所有提交以图表的形式展现,非常方便查看内容,使用
+和_循环切换屏幕来显示提交图表,并且会有颜色区分。 - 对比两次提交:支持不同的两次提交进行内容比对,使用
shift+w选中某个分支,然后标记这个分支,然后再选择其他分支与这个分支进行diff。
清晰、模块化的架构,通过不同的层分离关注点:

实战
提供各种平台的多种安装方式:
scoop install lazygit
choco install lazygit
brew install lazygit
sudo apt install lazygit
FastGithub
一款开源(GitHub,491 Star,150 Fork)小巧的便携小工具,无需安装,解压开箱即用。
功能
- 提供域名的纯净IP解析;
- 提供IP测速并选择最快的IP;
- 提供域名的tls连接自定义配置;
- google的CDN资源替换,解决大量国外网站无法加载js和css的问题。
FastGithub为每台不同的主机生成自颁发CA证书,保存在cacert文件夹下。客户端设备需要安装和无条件信任自颁发的CA证书,请不要将证书私钥泄露给他人,以免造成损失。

工作原理:在本地电脑上创建一个安全的问路服务,而不是将流量发送到某个服务器,隐私和安全方面,可相对放心。
实战
从GitHub Release页面下载fastgithub-win-x64.zip,解压缩,双击FastGithub.UI.exe即可。
实测结果,之前没有开启代理,打开GitHub很慢,关闭代理并使用FastGitHub,速度确实快很多,几百毫秒响应速度。

不使用代理,git clone也有将近10M的速度。

要知道,无良房东没算在房租里的宽带不过100M,下载速度还需要除以10:

和使用代理时的响应速度几乎没有区别:

此外还可通过Docker Compose安装:
git clone https://github.com/creazyboyone/FastGithub.git
cd FastGithub
docker compose up -d
Gogs
官网,一款开源(GitHub,47.2K Star,5.1K Fork)极易搭建的自助 Git 服务。官方提供在线体验平台,需注册方能使用。
Tangled
官网,一款基于AT Protocol协议构建的Git社交协作平台。
基本概念:
- Knot:节点,小型无头(headless)服务器,可用于托管Git仓库和相关元数据;可简化Git操作;每个Knot都能独立托管仓库,也能与其他节点互联,形成一个开放的代码协作网络。可部署于Raspberry Pi、个人NAS、服务器上;可单人使用,也可供多人共享。
- DID:Decentralized ID,去中心化标识符,
功能特性:
- 轻量级Git仓库托管
- 使用Knots在个人基础设施上托管Git仓库;
- 可添加好友到您的 Knots,或邀请协作者加入您的仓库;
- 采用细粒度的基于角色的访问控制进行保护;
- 使用SSH进行推送和拉取操作。
- 改进的拉取请求模型:直观高效的基于轮次的拉取请求流程,支持轮次间的差异比较。使用Jujutsu的变更 ID 堆叠拉取请求。粘贴 git diff 或 git format-patch 即可快速进行变更推送。
使用 Spindle 在您自己的基础设施上运行流水线–Spindle 是一款轻量级的 Cl运行器。它原生支持 Nix 进行包管理,并且可以轻松扩展以支持不同的执行后端。
实战
注册

点击个人头像

新建

string和Git Snippet功能定位类似,用于记录和存储代码片段。
下面创建一个Repo:

查看Repo:

和Git Repo类似,不过高度精简(功能简陋),毕竟目前还是alpha版本。
Foregjo
官网,开源(codeberg,3K Star,523 Fork),官方提供在线体验平台,需注册方能使用。
Codeberg
官网,基于Foregjo、类似于GitHub、但免费代码托管平台。
Gitea
官网,开源(GitHub,52K Star,6.2K Fork),在线体验,也可通过SaaS形式使用。
功能特性:
- 轻量高效,性能爆表:Go语言编写的轻量级服务,对服务器资源占用极小,这让自建私有Git变得前所未有的简单。
- 功能齐全,开箱即用:包括代码仓库、PR(Pull Request)、Issue(工单)、Wiki等在内的所有核心功能。无需额外配置,开箱即用。
- 数据主权,安全可控:作为自托管工具,所有代码都存储在个人服务器上,数据不上云。
实战
安装
使用
仓库(创建、管理)、用户(创建、邀请);协作:使用Issue来跟踪项目进度,使用Wiki来编写项目文档,使用Pull Request来进行代码合并。
GitButler
官网,开源(GitHub,16.9K Star,708 Fork)的Git客户端,引入虚拟分支(Virtual Branches)概念,允许开发者同时工作在多个功能分支上而无需物理切换分支。
技术栈:Rust、Tauri(可用于为所有主要桌面平台构建微小的、极速的二进制文件的框架)、Svelte(UI框架)。
功能清单
- 虚拟分支
- 解决问题:传统Git操作需频繁切换分支或
git stash保存临时改动,导致上下文切换成本高; - 功能亮点:
- 并行开发:在同一工作目录中创建多个虚拟分支,每个分支独立管理文件改动,无需物理切换分支;
- 智能归属:代码更改自动关联到对应虚拟分支,用户可通过拖拽将文件或代码片段分配到不同分支;
- 实时冲突检测:当多个虚拟分支修改同一文件时,界面高亮冲突区域并提供解决建议,避免合并时才暴露问题;
- 无缝转真实分支:虚拟分支可一键转换为标准Git分支,单独推送到远程仓库或创建PR。
- 解决问题:传统Git操作需频繁切换分支或
- 智能提交:
- 自动生成语义化提交信息(基于OpenAI API分析代码差异),未来版本计划支持本地LLM模型;
- 自动创建描述性分支名,如
fix/login-button-alignment;
- 拖放式提交管理:通过拖拽操作撤销、合并或修改提交记录,替代复杂
git rebase -i命令; - 操作时间线:记录所有操作历史,支持回溯和撤销,降低误操作风险;
- GitHub深度集成:
- 一键认证登录,直接管理PR、查看分支状态;
- 自动生成SSH密钥并上传至GitHub,简化配置流程。
- 多账户管理:支持同时关联多个GitHub账号,方便跨项目协作
- 工作流优化
- 紧急中断处理:开发功能时发现Bug,可直接在新虚拟分支修复并独立推送,无需提交半成品代码;
- 跨分支代码测试:直接在工作目录应用他人的远程分支改动,快速验证问题;
- 探索性编程:创建临时虚拟分支尝试不同方案,保留有效代码路径。
CNB
Cloud Native Build简写,官网,官方文档
技术
- 声明式的构建环境:通过声明构建环境,可以确保任务在特定的环境中进行构建,避免由于环境差异而导致的问题,并提供可靠的构建过程。
- 声明式的构建缓存:当缓存声明为
copy-on-write模式时,可以实现缓存的写时复制,在并发场景下,无需再担心缓存读写冲突问题。 - Docker作为任务的运行环境:使用Docker技术来提供一个环境,以便执行特定的任务,使任务的执行环境更加可控和可靠。
- 基于Docker生态的插件:将通用能力抽离为Docker插件,通过Docker生态进行高效分发,开发者之间相互帮助,去中心化的协作。
- 按需快速获取资源:通过
runner.cpus按需声明需要的CPU资源,最高可达64核。 - 云原生开发:基于云原生构建的远程开发解决方案,借助读秒克隆技术,只需一不小心,点击云原生开发按钮,短短几秒,工作区便准备就绪,远程接入即可进行编码工作。启动速度,看起来飞快,其实一点也不慢。
- 读秒克隆技术:基于OverlayFS的
git-clone-yyds,可在数秒内完成代码准备,使得开发人员能够更快地获取代码。哪怕是100GB以上的超大仓库,也能秒级准备,在高并发场景下,更是快到离谱。
