Linux开发工具详解(二):Git版本控制、GitHub协作与GDB调试实战
Linux开发工具详解二Git版本控制、GitHub协作与GDB调试实战 星恒随风个人主页❄️ 个人专栏《指针合集》《C语言基础》《数据结构》《机器学习导论》《前端基础》《python基础》《C从入门到入土》《Linux的学习之旅》✨ 数据即知识压缩即智能文章目录Linux开发工具详解二Git版本控制、GitHub协作与GDB调试实战前言写完代码以后还有两个问题1. 代码怎么管理2. Bug怎么定位一、什么是版本控制1. 版本控制解决什么2. Git是什么二、Git和GitHub不是同一个东西1. Git2. GitHub三、安装Git1. Ubuntu2. Fedora / RHEL四、第一次使用Git要配置身份1. 配置用户名2. 配置邮箱五、Git最重要的四个区域1. 工作区2. 暂存区3. 本地仓库4. 远程仓库六、Git数据流一定要理解七、git add到底在干什么1. 它不是“提交代码”2. 添加所有变化八、git commit是什么九、commit message应该怎么写1. 不推荐2. 更推荐十、git push是什么十一、2026年使用GitHub要注意认证方式1. 不要再使用GitHub账户密码进行Git认证2. HTTPS方式3. SSH方式十二、git clone把远程仓库复制到本地十三、本地已有项目如何接入Git1. 初始化2. 添加文件3. 第一次提交4. 添加远端5. 推送十四、git status最应该频繁使用的命令十五、git diff提交前看看自己改了什么1. 工作区与暂存区的差异2. 暂存区与最近提交的差异十六、git log查看历史十七、git pull是什么十八、.gitignore有什么用十九、一个C/C项目的.gitignore示例二十、为什么Git要有暂存区二十一、Git分支的基本思想1. 为什么需要分支2. 创建并切换分支二十二、从Git进入GDB版本管理解决不了Bug本身二十三、GDB是什么二十四、调试之前为什么要加-g二十五、启动GDB二十六、list查看源代码二十七、break设置断点1. 按行号2. 按函数3. 文件加行号二十八、查看和管理断点1. 查看2. 删除3. 禁用4. 重新启用二十九、run与continue1. run2. continue三十、next与step调试最常用的区别1. next2. step3. 可以类比IDE三十一、finish把当前函数执行完三十二、until快速执行到后面三十三、print查看表达式三十四、display每次暂停自动显示三十五、set var临时修改程序变量三十六、backtrace查看调用栈三十七、info locals查看当前局部变量三十八、watch变量什么时候被改坏了三十九、条件断点四十、给已有断点添加条件四十一、GDB最常用命令速查四十二、一个完整GDB调试案例1. Bug代码2. 编译调试版本3. 启动4. main设置断点5. 找到Sum调用位置6. 执行循环7. 查看result8. 查看flag9. 临时修改四十三、GDB调试思路比命令更重要四十四、什么是CGDB四十五、Git和GDB如何形成完整工作流四十六、一套推荐的日常Git工作流程四十七、Git与GDB最容易混淆的几个问题1. git add不是提交2. commit不等于GitHub已经更新3. GitHub密码不能再直接用于git push4. 没有-g也能用GDB但调试体验会很差5. next和step区别6. watch和display不是一回事四十八、整套Linux开发工具知识图前言写完代码以后还有两个问题1. 代码怎么管理一个项目开发过程中会不断出现第一次能运行 第二次加功能 第三次改接口 第四次修Bug 第五次重构如果使用最原始的方法project-v1 project-v2 project-v3 project-final project-final2 project-真最终版很快就会遇到哪个版本改了什么 什么时候改的 谁改的 还能不能回去 两个人怎么同时开发因此需要版本控制系统2. Bug怎么定位程序运行结果错误Expected: 5050 Actual: 0只靠printf(here1\n);printf(here2\n);printf(x%d\n,x);当然也能调试。但复杂程序中我们更希望让程序停在指定位置 单步执行 进入函数 查看变量 修改变量 查看调用栈 观察变量何时变化这就是GDB解决的问题。所以这一篇的主线就是Git ↓ 管理代码历史 GDB ↓ 定位代码问题一、什么是版本控制1. 版本控制解决什么版本控制系统可以记录谁 在什么时候 修改了哪些文件 具体改了什么 为什么修改并允许查看历史 回退版本 创建分支 合并代码 多人协作2. Git是什么Git 是一个分布式版本控制系统“分布式”非常重要。传统集中式系统更多依赖中央服务器而 Git 每个完整克隆通常都拥有完整版本历史所以本地也可以进行大量操作commit log diff branch并不要求时刻连接 GitHub。二、Git和GitHub不是同一个东西1. GitGit 是版本控制工具安装在本地。2. GitHubGitHub 是Git 代码托管与协作平台除此之外还提供Issue Pull Request Actions Release Code Review等能力。所以Git ! GitHub关系更接近Git ↓ 版本控制协议与工具 GitHub ↓ 基于Git的远程托管与协作平台三、安装Git1. Ubuntusudoaptupdatesudoaptinstall-ygit2. Fedora / RHELsudodnfinstall-ygit旧 CentOSsudoyuminstall-ygit检查git--version四、第一次使用Git要配置身份1. 配置用户名gitconfig\--global\user.name\Your Name2. 配置邮箱gitconfig\--global\user.email\youexample.com查看gitconfig--global--list这些信息会进入Commit Metadata用于标识谁进行了这次提交五、Git最重要的四个区域1. 工作区就是你真实看到和编辑的文件main.c Makefile README.md2. 暂存区也叫Index Staging Area作用是准备“下一次 commit 到底包含哪些内容”3. 本地仓库执行gitcommit之后提交记录进入Local Repository4. 远程仓库例如GitHub对应常见远端名字origin六、Git数据流一定要理解Working Tree | | git add v Staging Area | | git commit v Local Repository | | git push v Remote Repository这张图几乎可以解释80%的Git入门问题七、git add到底在干什么1. 它不是“提交代码”例如gitaddmain.c只是把当前 main.c 的内容 加入暂存区准备参加下一次 commit2. 添加所有变化gitadd.初学阶段非常常见。但在实际项目中提交前建议先gitstatus确认到底有哪些文件会被提交。八、git commit是什么gitcommit\-mfix: correct progress calculation意思是把当前暂存区的状态 记录为一个新的本地版本所以commit本质更接近创建项目历史快照九、commit message应该怎么写1. 不推荐update 修改代码 123 test aaa过几个月以后几乎无法理解。2. 更推荐例如fix: prevent division by zero feat: add progress bar refactor: split process module docs: update README让别人看到历史时能够快速知道为什么改十、git push是什么执行gitpush意味着把本地提交 同步到远程仓库第一次绑定上游分支时可能使用gitpush-uorigin main以后gitpush即可。十一、2026年使用GitHub要注意认证方式1. 不要再使用GitHub账户密码进行Git认证GitHub 已经不再支持用户名 GitHub登录密码完成 Git 的 HTTPS 操作认证。现在常见方法有SSH Personal Access Token GitHub CLI Git Credential Manager2. HTTPS方式远程地址类似https://github.com/user/project.git如果命令行要求输入 Password不是输入GitHub登录密码 而是使用PAT等认证方式3. SSH方式远程地址类似gitgithub.com:user/project.git比较适合长期在自己的开发机器上使用配置完成后gitpullgitpush都比较方便。十二、git clone把远程仓库复制到本地gitclonerepository结果大致是远程 GitHub 仓库 ↓ git clone ↓ 本地工作区 .git仓库进入cdproject即可开始开发。十三、本地已有项目如何接入Git1. 初始化gitinit2. 添加文件gitadd.3. 第一次提交gitcommit\-minit: initial project4. 添加远端gitremoteaddoriginrepository查看gitremote-v5. 推送gitpush-uorigin main具体默认分支可能取决于仓库配置 Git版本 项目设置所以遇到问题先gitbranch确认本地分支名称。十四、git status最应该频繁使用的命令执行gitstatus可以看到当前在哪个分支 哪些文件被修改 哪些文件未跟踪 哪些修改已经暂存 哪些修改还未暂存初学 Git 时遇到我现在到底什么状态第一条命令应该就是gitstatus十五、git diff提交前看看自己改了什么1. 工作区与暂存区的差异gitdiff2. 暂存区与最近提交的差异gitdiff--cached因此一个不错的提交习惯是修改代码 ↓ git diff ↓ git add ↓ git diff --cached ↓ git commit十六、git log查看历史gitlog更紧凑gitlog--oneline例如7c19f20 fix: correct calculation 123af92 feat: add progress bar 98cb3ab init: initial project这里每个提交都有一个Commit Hash用于唯一标识这次提交。十七、git pull是什么gitpull用于从远端获取更新 整合进当前分支多人协作时先 pull 再开发/提交是一种常见流程。但真实项目中还需要进一步理解fetch merge rebase之间的关系。入门阶段先掌握clone status add commit pull push log diff即可。十八、.gitignore有什么用有些文件不应该提交*.o 可执行文件 构建目录 IDE配置 日志文件 临时文件例如*.o *.out build/ .vscode/ *.log之后Git默认忽略这些文件十九、一个C/C项目的.gitignore示例# object files *.o *.obj # executables *.out *.exe # build directories build/ cmake-build-*/ # debug files *.core # editor .vscode/ .idea/ # temporary files *.swp *.tmp二十、为什么Git要有暂存区很多人第一次接触 Git 会问为什么不能直接 修改 ↓ commit暂存区的价值在于一次工作中可能改了很多东西但你希望拆成Commit 1 修Bug Commit 2 修改文档 Commit 3 重构函数于是可以选择性 git add让每个 Commit 更清晰。甚至gitadd-p可以按代码块选择哪些修改进入下一次提交二十一、Git分支的基本思想1. 为什么需要分支假设main是稳定版本。你要开发一个progress-bar新功能。不希望开发到一半影响主线。于是main | o----o \ o----o feature2. 创建并切换分支现代 Gitgitswitch-cfeature/progress开发完成后gitswitch main再根据团队流程merge Pull Request整合代码。二十二、从Git进入GDB版本管理解决不了Bug本身Git 可以告诉我们代码什么时候变坏了 谁改了什么但要真正回答程序为什么得到错误结果需要DebuggerLinux 下最经典的就是GDB二十三、GDB是什么GDBGNU Debugger可以帮助我们设置断点 单步执行 查看变量 修改变量 查看栈帧 查看调用链 监视内存或变量变化二十四、调试之前为什么要加-g假设gcc main.c-oapp程序当然可以运行。但是 GDB 很难获得完整的源文件 行号 变量名 类型映射信息。因此调试版本应该加入-g例如gcc main.c\-g\-O0\-Wall\-Wextra\-oapp其中-g ↓ 生成调试信息 -O0 ↓ 尽量减少优化造成的调试干扰也可以根据需求考虑-Og二十五、启动GDBgdb ./app进入(gdb)退出quit或者Ctrl D二十六、list查看源代码list简写l查看main函数list main查看指定文件list main.c:20二十七、break设置断点1. 按行号break 20简写b 202. 按函数break mainbreak Sum3. 文件加行号break main.c:20适合多文件工程二十八、查看和管理断点1. 查看info breakpoints常见简写i b2. 删除删除编号 2delete 2删除全部delete3. 禁用disable 24. 重新启用enable 2二十九、run与continue1. runrun简写r含义从程序开头开始执行直到遇到断点 收到信号 程序结束2. continuecontinue简写c表示从当前停止位置继续运行直到下一个停止点。三十、next与step调试最常用的区别假设intnSum(1,100);1. nextnext简称n执行下一行但遇到函数调用一般不会进入函数内部2. stepstep简称s遇到函数调用会尝试进入函数内部3. 可以类比IDEnext ≈ Step Over / F10 step ≈ Step Into / F11三十一、finish把当前函数执行完如果已经进入Sum()但不想继续一行一行走finish作用运行到当前函数返回并通常显示返回值。三十二、until快速执行到后面例如until 30可以让程序继续运行到指定位置在调试循环时比较方便。三十三、print查看表达式查看变量print result简称p result也可以计算表达式p start end甚至p array[10]三十四、display每次暂停自动显示display i之后每次程序停下GDB都会自动输出 i查看 displayinfo display取消undisplay 1三十五、set var临时修改程序变量假设程序intflag0;导致结果错误调试时可以set var flag 1再继续运行。如果结果立刻恢复正常说明 flag 很可能就是问题来源这种方法非常适合验证Bug假设但注意修改只发生在当前调试进程 源代码本身并没有被改三十六、backtrace查看调用栈backtrace简称bt例如#0 Divide() #1 Calculate() #2 Process() #3 main()它能回答程序到底是从哪一条调用链走到这里的在崩溃 段错误 深层函数错误 递归场景中非常重要。三十七、info locals查看当前局部变量info locals可以一次看到当前栈帧中的局部变量相比逐个p a p b p c更方便。三十八、watch变量什么时候被改坏了这是一条非常有用的命令。假设result本来应该保持正确。但某个地方莫名其妙变了。你不知道是谁改的可以watch result继续continue当result的值发生变化时GDB会暂停程序并显示Old value New value这属于Watchpoint 数据断点非常适合变量被意外修改 内存被错误覆盖 状态莫名变化的 Bug。GDB 官方文档同样把 watchpoint 定义为在表达式值发生变化时停止程序。三十九、条件断点假设for(inti0;i100000;i){Process(i);}Bug 只在i 30000出现。如果每次都停完全不可用所以可以break main.c:20 if i 30000程序只有在到达20行 并且 i 30000时才停止。GDB 的断点可以附加条件条件为真时才真正停下这在循环和高频路径中特别有用。四十、给已有断点添加条件假设断点编号2可以condition 2 i 30于是Breakpoint 2以后只在i 30时生效。四十一、GDB最常用命令速查目的命令启动gdb ./app查看代码list设置断点break查看断点info breakpoints运行run继续continue单步不进入函数next单步进入函数step执行完当前函数finish查看变量print自动显示变量display修改变量set var查看调用栈backtrace查看局部变量info locals监视变量变化watch删除断点delete退出quit四十二、一个完整GDB调试案例1. Bug代码#includestdio.hintflag0;intSum(intstart,intend){intresult0;for(intistart;iend;i){resulti;}returnresult*flag;}intmain(void){intstart1;intend100;intretSum(start,end);printf(%d\n,ret);return0;}我们期待5050实际02. 编译调试版本gcc main.c\-g\-O0\-Wall\-Wextra\-oapp3. 启动gdb ./app4. main设置断点b main r5. 找到Sum调用位置l然后s进入Sum6. 执行循环可以until或者逐步n7. 查看resultp result得到5050说明求和本身正确8. 查看flagp flag得到0于是我们怀疑result * flag就是问题。9. 临时修改set var flag 1继续n最终5050此时就基本确认Bug来自flag初始值四十三、GDB调试思路比命令更重要真正调试时不要程序一错 ↓ 从第一行开始next ↓ 一直按几百次更高效的思路应该是观察错误现象 ↓ 提出假设 ↓ 确定可疑代码区域 ↓ 设置断点 ↓ 观察关键变量 ↓ 缩小范围 ↓ 验证假设GDB 只是验证假设的工具而不是自动帮你找到Bug的魔法四十四、什么是CGDBCGDB 可以理解成GDB 更方便查看源码的终端界面如果纯 GDB 的list使用起来不够直观可以尝试CGDB但学习阶段仍建议先掌握原生 GDB 的break run next step print watch bt因为这些调试思想在VS VSCode CLion GDB LLDB中都是共通的。四十五、Git和GDB如何形成完整工作流可以形成拉取代码 ↓ git pull ↓ 编辑代码 ↓ Vim / VSCode ↓ 编译 ↓ gcc / g ↓ 程序出现Bug ↓ GDB ↓ 修复Bug ↓ 重新测试 ↓ git diff ↓ git add ↓ git commit ↓ git push这已经是一套最基础的真实开发流程四十六、一套推荐的日常Git工作流程gitstatusgitpull# 修改代码gitdiff# 编译和测试gitstatusgitadd.gitdiff--cachedgitcommit\-mfix: correct sum calculationgitpush随着项目复杂度提高再继续学习branch merge rebase stash tag reset revert cherry-pick即可。四十七、Git与GDB最容易混淆的几个问题1. git add不是提交git add ↓ 暂存 git commit ↓ 本地提交 git push ↓ 上传远程2. commit不等于GitHub已经更新只执行gitcommit代码仍然主要在本地仓库还需要gitpush才能同步到远程。3. GitHub密码不能再直接用于git pushHTTPSPAT / GitHub CLI / Credential Manager或者SSH而不是账户登录密码。4. 没有-g也能用GDB但调试体验会很差没有调试信息时源码行号 变量名 函数信息可能大量缺失。所以-g是源码级调试的核心选项。5. next和step区别next ↓ 不进入函数 step ↓ 进入函数这是最需要记住的一组。6. watch和display不是一回事display x ↓ 每次程序停下时显示x watch x ↓ x发生变化时让程序停下四十八、整套Linux开发工具知识图Linux开发 | ┌───────────────┼───────────────┐ ↓ ↓ ↓ 编辑 构建 管理 | | | Vim GCC / G Git | Makefile | ↓ 运行 | ┌──────┴──────┐ ↓ ↓ 正常 Bug | ↓ GDB | ↓ 修复代码 | ↓ Git Commit

相关新闻

agent操作中的幂等性设计方案

agent操作中的幂等性设计方案

幂等性是指:同一个操作,无论执行一次还是多次,最终产生的业务结果是一致的。对于涉及 AI Agent 这种长链路、高成本的场景,如果前端抖动重试或网关超时重发,导致系统重复触发了 Agent 生成、重复扣费或覆盖了正在生成的…

2026/10/5 9:41:37 阅读更多 →
yoinks命令行参数与用法完整清单:--help背后的所有选项

yoinks命令行参数与用法完整清单:--help背后的所有选项

yoinks命令行参数与用法完整清单:--help背后的所有选项 【免费下载链接】yoinks yoink any video from your terminal. no shady ads. 项目地址: https://gitcode.com/GitHub_Trending/yo/yoinks yoinks 是一款命令行视频下载工具:在终端粘贴 You…

2026/10/5 9:41:37 阅读更多 →
博图的离散量报警

博图的离散量报警

我做的是根据factio这三个伸出异常和挡板异常的报警信息,看的是老A的视频,大家感兴趣可以去看1.创建报警db块,取消优化块的访问,因为离散量报警好像需要地址寻址,所以我做的int类型,bool类型触摸屏无法找到…

2026/10/5 9:41:37 阅读更多 →

最新新闻

Chart MCP Server MCP 服务说明文档

Chart MCP Server MCP 服务说明文档

1. 服务概述一句话简介:历史图表模式搜索引擎MCP服务器,2400万模式嵌入,10年历史数据,15000股票服务名称:Chart MCP Server (Chart Library)版本号:1.1.1开发者/提供方:grahammccain协议类型&am…

2026/10/5 10:21:53 阅读更多 →
Git衍生:GitLens、TGit、UGit、WalGit

Git衍生:GitLens、TGit、UGit、WalGit

本文汇总几款Git客户端工具,感兴趣也请阅读下方链接。都是之前写的,Git相关文章: Git使用笔记Git TagGit Cherry PickGit clone/pull/push需要输入密码解决方法GitHub使用技巧Git:进阶、衍生Git拓展:jj、GitButler、G…

2026/10/5 10:21:53 阅读更多 →
Markdown编辑器:VNote、R Markdown、ColaMD、SoloMD、mq

Markdown编辑器:VNote、R Markdown、ColaMD、SoloMD、mq

虽然之前写过很多篇Markdown编辑器,也(轻度)体验使用过不少: MarkDown基础及表格、KaTeX公式、矩阵、流程图、UML图、甘特图语法Markdown编辑器/笔记软件汇总:NotebookLM、note-gen、MiaoYan编辑器和笔记软件汇总&…

2026/10/5 10:21:52 阅读更多 →
CF 2259 problemE 可行域

CF 2259 problemE 可行域

CF2259problemE 也是这个思想:https://www.luogu.com.cn/problem/T700045 题面:https://codeforces.com/contest/2259/problem/E 由约束推出可行域,再检查可行域是否满足所有条件 根据所给数组 推> 构造数组的某些区间的限制条件也就是一些…

2026/10/5 10:21:52 阅读更多 →
axios和restful的区别是什么?

axios和restful的区别是什么?

这是一个非常经典且容易让人混淆的问题。简单来说,它们根本不在同一个层面上,不能直接对比。打个比方:RESTful 就像是餐厅的菜单和点餐规则(比如:用 GET 来看菜单,用 POST 来下单)。Axios 就像是…

2026/10/5 10:21:52 阅读更多 →
PHP-FPM vs 传统模式:性能与安全的终极对决

PHP-FPM vs 传统模式:性能与安全的终极对决

现代生产那环境需要选取使用php -fpm而并非其他的, 这是由于它能够支持动态方面能伸缩调整、实现平滑地重启以及具备细粒度的方面资源控制;并且还需要去匹配Event MPM与之相关的, 要启用起来并且对配置进行优化, 同时还要禁用掉.解析, 只有这样才能够提升PHP执行的效…

2026/10/5 10:20:52 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →