序章 2016-04-27
53835d5 — “first commit.”,作者 shichaohui <464206200@qq.com>,一次提交 2587 个文件。
同一天还有两笔:nukix 的 message 只有一个 123;同一个 nukix 的 Delete ._.DS_Store。
甚至还有一条 guangmomo <your_email> 的占位提交——邮箱都没改。
这个项目从第一天起就不是一个人的项目。首周出现的身份就有五个以上。
第一幕 2016
1971 个 non-merge commit。从 5 月起稳定在每月 200 笔上下,四条产品线同时铺开。
| 月份 | commits | 主线 |
|---|---|---|
| 2016-04 | 24 | 立项,第一天 2587 个文件 |
| 2016-05 | 189 | 基础框架、登录、学习卡片 |
| 2016-06 | 265 | 计划 / 复习 / 单词本 |
| 2016-07 | 286 | v1.9.0_r1 起版本号 |
| 2016-08 | 237 | 会员、支付、分享 |
| 2016-09 | 238 | 离线下载 |
| 2016-10 | 190 | 竞技场起步 |
| 2016-11 | 246 | 多人竞技、RTC |
| 2016-12 | 296 | 包体积优化,.so 开始被排除 |
四条线同时推进
上排数字是当年 commit message 里关键词出现的次数。
两个“减法”定下了后来的规矩
2016-12-01 zxy 提交「优化包大小」,删掉 libgdx.so、libjpush219.so 的多个 ABI。
2016-12-16 nukix 提交「本地添加x86库,添加 .gitignore 进行过滤」——从此 jniLibs/{arm64-v8a,armeabi-v7a,x86} 被排除在版本控制外。
.so 都没有。第二幕 2017
2214 个 non-merge commit,项目绝对高峰:1 月 333 笔,5 月 329 笔。
版本线:几乎每两周一个 release
5 月那串 .1/.2/.3 是最典型的“线上出问题 → 当天修 → 当天发”。
分支动物园(30 条)
第二条把 push 拼成了 puss,一直没改。f_jenkins 说明有人认真试过 CI,但 repo 至今没有任何 pipeline 配置。
2017-01-11:一次大规模回滚
| 时间 | 作者 | 动作 | 文件数 |
|---|---|---|---|
| 09:56 | cenzeren | 修改卡片的单词显示,加入一个自定义 view | — |
| 14:44 | zhouxiaoyi | 回滚到 2cf1ae4… | 2345 |
| 14:57 | zhouxiaoyi | 未push的commit | 1798 |
五小时内完成“整体回滚 + 重放”,没有一条说明。
从堆功能转向修 bug
崩溃 相关提交:2016 年 71 笔 → 2017 年 190 笔;内存 22 笔。
功能堆到一定程度,一年里近十分之一的提交在修崩溃。
一种很特别的 commit message 文化
625 条 message 用了统一模板(占全部 non-merge commit 的 15%):
[泡单词]:<一句话变更>
变更原因:Bug/需求/崩溃/CodeReview
适用机型:All关联变更项:验证建议:无
这是提测/发版流程的痕迹:提交信息不只是给自己看的,是给测试和发布用的。2018 年 “all in” 之后,这个模板再没出现过——流程随团队一起消失了。
第三幕 2018 — 2020
18-08-30 00:43 的 “all in”
zhouxiaoyi <zhouxiaoyi@mac.pro>,message 只有两个词:
all in
1409 个文件变更,tree 里 2972 个文件,父提交是 2017-11-02 的 master。
这条 commit 是分水岭:对老仓库(A)它是“另一条线”的起点,对新仓库(B)它是 root commit,对 2026 年的整合它是必须被 graft 的那一个点。
1c68c5b 在另一条历史里——两条历史的差异只有 message 末尾的换行(\n\n vs \n),SHA 因此不同。2019:一笔
272 天后,Weity 提交 “new version”。全年 2 笔。
2020:隐私合规的开端
447 天后(2020-08-18),Weity 升级 targetSdk;8 月底 Jeffrey 连续提交:改 gradle 配置(compileSdk 26)、加隐私协议弹窗、改第三方注册失败提示。全年 21 笔。
第四幕 2021 — 2023
六年不到 50 笔提交,Jeffrey(归并后 885 笔,跨越 2016–2023)几乎一个人完成。
| 年份 | commits | 主要动作 |
|---|---|---|
| 2021 | 14 | 权限授权弹窗显示逻辑、去掉 X5 申请设备权限、手机号正则、versionCode 851/852 |
| 2022 | 4 | 优化隐私弹窗逻辑、去掉友盟统计 |
| 2023 | 6 | 更新 SDK 版本、适配隐私政策审核 |
中间的空档:351 天(2021-09 → 2022-09)、161 天(2022-10 → 2023-03)。
做的不是功能,是让应用还能上架:去推送、去统计、去高德定位、升级 SDK、补隐私弹窗、收敛权限。
2023-05-07 20:42,最后一笔。
第五幕 2026
一天之内发生的事:
| 时间 | 作者 | 内容 |
|---|---|---|
| 00:02 | huaqidao | 同步 target35 工作版:迁移 androidx、升级 targetSdk 35、接入局域网调试后端(1278 个文件) |
| 03:43 | huaqidao | 支持无网络登录与离线学习 |
| 11:15 | shopv2 | 统一新增文件权限:与仓库既有约定一致(100755) |
| 19:03–19:27 | shopv2 | README、项目史、.so 现状、术语统一 |
从 2016 年的 Java + support 库,到 2026 年的 Kotlin 2.0 + AndroidX + targetSdk 35——这个项目跨过了 Android 生态的两个时代。
同一天晚上,四条历史(A / B / C / D)被合到一个 repo:单 root commit 53835d5,v2 线与 master 线共享前 6 个 commit,在 d71e161(2020-08-26)diverge。
九年前那个 “first commit.”,重新变成所有 branch 的起点。
尾声 数字
| commit 总数 | 4,682 |
| non-merge | 4,241 |
| merge | 441 |
| tag | 46 |
| branch | 37 |
| HEAD 文件数 | 3,008 |
| .java | 1,665 |
| .kt | 1 |
| .xml | 650 |
| root commit | 1 |
细节与彩蛋 DETAILS
- 133 条 message 长度 ≤ 4 个字,最多的是「优化代码」,其次「优化布局」「修改文案」「增加注释」。
- 4 次回滚(
回滚/revert),最狠的一次动了 2345 个文件。 - 有一条 message 叫 「未push的commit」,动了 1798 个文件。
- 5 个 lightweight tag(
v2.4.0、v2.4.6、v3.0.0、v3.1.7、v3.4.1-debug-841), 其中v3.4.1-debug-841指向 2026-10-17 的提交——一个 2017 年风格的名字,挂在了 2026 年的代码上。 - 空档一览:294 / 272 / 447 / 318 / 351 / 161 / 1258 天。七次,一次比一次长。
人物志 PEOPLE
按 email/name 归并,多个 id 很可能指向同一个人,归并结论为推断。
| 推断身份 | commits | 活跃期 | 说明 |
|---|---|---|---|
| chaohui / shichaohui | 1,145 | 2016-04 → 2017-11 | 第一笔提交的人,提交数第一,三个邮箱 |
| Jeffrey / caiwenqiang | 885 | 2016-07 → 2023-05 | 跨越七年半,最后三年的唯一维护者 |
| nukix | 830 | 2016-04 → 2017-08 | 第一天就开始,第一笔 message 是 123 |
| zhouxiaoyi / zxy / zhouxy | 425 | 2016-05 → 2018-08 | “all in” 的作者,2026 整合的起点 |
| cenzeren | 230 | 2016-07 → 2017-02 | |
| huangxirong | 205 | 2016-11 → 2017-05 | |
| tanyang | 130 | 2017-09 → 2017-11 | 项目停止前的最后一批人 |
| lihuanbin / Lee | 108 | 2016-12 → 2017-02 | |
| xuliwen | 104 | 2016-07 → 2016-10 | |
| 王宇飞 (wangyufei) | 49 | 2017-04 → 2017-05 | |
| 欧读书 (oudushu) | 47 | 2017-04 → 2017-05 | |
| gr19901105 | 38 | 2016-04 → 2016-06 | |
| Eleven | 36 | 2017-04 → 2017-05 | |
| Wensj | 7 | 2017-05 | 阿里推送改造 |
| Weity | 4 | 2019 → 2020 | 2019 年唯一的提交 |
| huaqidao | 2 | 2026-10 | androidx / targetSdk 35 迁移 |
| shopv2 | 5 | 2026-10 | 2026 收尾与文档 |
一句话 SUMMARY
一群人在 2016–2017 两年里写了 4000 多笔提交,把产品做到能打;
2018 年有人用一条 “all in” 重开了历史;之后六年靠一个人守着合规底线;
2026 年又被重新捡起来迁到 AndroidX,最后把断掉的历史全部接回同一个 root commit。