跳转至

2.4 源代码管理

2.3 整洁代码 | 首页 | 下一节: 2.5 技术协作


版本控制基础

  • 核心概念:仓库(repository)、提交(commit)、分支(branch)、标签(tag)、合并(merge)、变基(rebase)。
  • 集中式(SVN)vs 分布式(Git):分布式系统每个本地仓库都是完整副本,离线可提交。
  • SCM 工具(Git)vs 托管平台(GitHub/GitLab/Bitbucket):Git 是工具,托管平台是附加了协作功能的远程仓库服务。
  • 理解为什么版本化至关重要:可以回滚、追溯变更原因、并行开发、审计。

微提交(Micro Commits)

核心理念:每个提交只做一件事,让提交历史"讲述一个完整故事"。

四大好处: 1. 叙事性:把增量过程展示给评审者,而不是扔出一个巨大补丁。 2. 纪律性:迫使你将复杂方案拆分为定义清晰的步骤序列。 3. 更好的 Code Review:小补丁容易审查,每次只看一件事。 4. Bisect 和 Cherry-pick 有效:精确找到哪个提交引入回归,方便跨分支拣选。

Git 的 rebase -i 让你能在提交前整理提交历史——"假装自己是一个完美的开发者"。

约定式提交(Conventional Commits)

提交信息格式:type[可选 scope]: description

  • fix: → PATCH 版本(Bug 修复)
  • feat: → MINOR 版本(新功能)
  • ! 后缀或 BREAKING CHANGE: 脚注 → MAJOR 版本(破坏性变更)
  • 其他类型:docs:style:refactor:perf:test:build:ci:chore:
  • scope 示例:feat(parser): add ability to parse arrays

可以据此自动生成 CHANGELOG、自动确定 SemVer 版本号跳跃、触发构建和发布流程。

分支策略

  • 短命特性分支(Short-lived Feature Branches):1-3 天内合并回主干,减少合并冲突。
  • 主干开发(Trunk-Based Development):所有开发直接或通过极短分支在主分支上进行,配合特性开关控制未完成功能的可见性。
  • 避免长期存在的分支(如数周未合并的 feature 分支),这是合并地狱的根源。

依赖地狱(Dependency Hell)

当多个软件包依赖同一个共享库的不同且不兼容的版本时,就会陷入依赖地狱。

问题类型 描述
依赖过多 应用依赖大量库,占用大量磁盘,难以移植
长依赖链 A→B→C→…→Z 的手工安装链条
冲突依赖 app1 需要 libfoo 1.2,app2 需要 libfoo 2.0,两者不可同时安装
循环依赖 A 需要 B,B 又需要 A
钻石依赖 A 依赖 B 和 C,B 需要 D v1,C 需要 D v2

解决方案语义化版本、智能包管理器(APT/Yum/Pacman 自动解析版本)、私有依赖/容器化(Docker 打包完整运行环境)、Nix 等可重现构建工具。


来源

  • Lucas Rocha — Micro Commits: https://lucasr.org/2011/01/29/micro-commits/
  • Conventional Commits 1.0.0: https://www.conventionalcommits.org/en/v1.0.0/
  • Wikipedia — Dependency hell: https://en.wikipedia.org/wiki/Dependency_hell

2.3 整洁代码 | 首页 | 下一节: 2.5 技术协作