VPNCheap · iOS 分支怎么乱的,现在怎么了 How the iOS branches got tangled — and where we are now iOS ブランチの混乱 — 何が起きて、今どうなったか
2026-09-03 · vpncheap-apple-native
✓ 真线 = integration 分支(branch = 代码的一条路线);main 是 8/2 退役的 ✗ 坏血统;9/1 把坏的合回来了;9/3 已把 main 重置(force-reset = 把指针搬过去,旧的还在备份分支里)回真线。
✓ True line = integration branch; main was the ✗ bad lineage retired on 8/2; 9/1 it was accidentally merged back in; 9/3: main has been force-reset (= move the pointer; the old stuff is in a backup branch) to the true line.
✓ 真のライン = integration ブランチ;main は 8/2 に退役した ✗ 不良血統;9/1 に不良を合流させてしまった;9/3 に main を真のラインに force-reset(= ポインタを移動、旧コミットはバックアップブランチに残る)済み。
§2 两条线 §2 The Two Trains §2 二本の線路
← 在手机上左右滑动查看完整时间线 ← Scroll horizontally on mobile to see the full timeline ← モバイルでは左右にスクロールして全体を表示
§3 走错了 (9/1) §3 The Wrong Turn (9/1) §3 間違った方向 (9/1)
合并方向反了:真线被合进坏线。坏线独有的提交(e3b8b14 的漂移、a24f8ca 的写盘 bug)没冲突的地方原样留下。
随后落在 main(坏线)上的:
- 9/1 #86(CI 加固)
- 9/2 晚 #90 设备标识(Stage 3)
- 9/2 晚 #93 到期写盘修复
- 9/3 #95(旧 token)
✓ 这个对了 9/2 上午 PR #88(iOS 16 最低支持 + 2.0.11)在 integration 上提交。
Merge went the wrong way: the true line was merged INTO the bad line. Bad-line-only commits (e3b8b14 drift, a24f8ca write bug) stayed wherever they didn't conflict.
Then landed on main (bad line):
- 9/1 #86 (CI hardening)
- 9/2 evening #90 device identity (Stage 3)
- 9/2 evening #93 expiry-write fix
- 9/3 #95 (stale token)
✓ Correct 9/2 morning PR #88 (iOS 16 min + 2.0.11) was on integration.
マージの方向が逆:真のラインが不良ラインに合流させられた。不良ライン固有のコミット(e3b8b14 のドリフト、a24f8ca の書き込みバグ)はコンフリクトしない箇所にそのまま残った。
その後 main(不良ライン)に入ったもの:
- 9/1 #86(CI 強化)
- 9/2 夜 #90 デバイス識別(Stage 3)
- 9/2 夜 #93 期限書き込み修正
- 9/3 #95(古いトークン)
✓ これは正しかった 9/2 午前 PR #88(iOS 16 最低サポート + 2.0.11)は integration 上。
§4 CEO 看到了什么 §4 What the CEO Saw §4 CEO が見たもの
「套餐已到期」假阳性
账户页显示绿色正常,首页弹红卡说已到期。
a24f8ca 用了裸 JSONEncoder 写盘,到期时间少了 31 年。integration 从来没有这个 bug。
推荐线路变竖排
规格是横排/格子,CEO 说得对。
e3b8b14 手工合并的漂移(两个父提交都没有竖排);integration 有横排。
一直「连接中…」
已连上的隧道因为一个未证实的断开就立刻掉线。
客户端状态机没有 300ms 防抖,断开文案是「连接中…」。
b20260902781) ← integration ✓ |
2.0.12 (b49) ← main ✗ |
2.0.12 (b51) ← main ✗
"Plan Expired" false positive
Account page shows green/active, but home screen pops a red card saying expired.
a24f8ca used bare JSONEncoder for disk writes — expiry date lost 31 years. integration never had this bug.
Recommended routes became vertical
Spec says horizontal / grid layout. CEO is right.
e3b8b14 manual-merge drift (neither parent had vertical). integration has horizontal.
Stuck on "Connecting…"
An established tunnel drops on a single unconfirmed NE disconnect.
State machine has no 300ms debounce; disconnect text shows "Connecting…"
b20260902781) ← integration ✓ |
2.0.12 (b49) ← main ✗ |
2.0.12 (b51) ← main ✗
「プラン期限切れ」誤検知
アカウントページは緑色で正常だが、ホーム画面に赤カードで期限切れと表示。
a24f8ca が素の JSONEncoder でディスク書き込み→有効期限が 31 年ずれた。integration にはこのバグなし。
推奨ルートが縦並びに
仕様は横並び/グリッド。CEO の指摘は正しい。
e3b8b14 の手動マージによるドリフト(親コミットのどちらにも縦並びはない)。integration は横並び。
ずっと「接続中…」
確立済みトンネルが未確認の切断 1 回で即切断。
状態マシンに 300ms デバウンスなし。切断中の表示が「接続中…」。
b20260902781) ← integration ✓ |
2.0.12 (b49) ← main ✗ |
2.0.12 (b51) ← main ✗
§5 · 9/3 做了什么 §5 What Was Done on 9/3 §5 · 9/3 に何をしたか
之前
main → bb55dcc坏血统,含 #83/#86/#90/#93
integration → 9ade761之后
archive/main-bad-lineage-20260903 → bb55dcc备份,所有提交都还在,永远不合回来
main → 9ade761= integration,含 iOS 16 支持
PR #95 关闭待移植
备份 → 重置(force-reset = 把指针搬过去),不删任何东西。
BEFORE
main → bb55dccBad lineage, includes #83/#86/#90/#93
integration → 9ade761AFTER
archive/main-bad-lineage-20260903 → bb55dccBackup — all commits preserved, never merged back
main → 9ade761= integration, includes iOS 16 support
PR #95 closed, awaiting port
Backup → reset (force-reset = move the pointer). Nothing deleted.
変更前
main → bb55dcc不良血統、#83/#86/#90/#93 を含む
integration → 9ade761変更後
archive/main-bad-lineage-20260903 → bb55dccバックアップ — 全コミット保持、二度とマージしない
main → 9ade761= integration、iOS 16 サポート含む
PR #95 クローズ、移植待ち
バックアップ → リセット(force-reset = ポインタを移動)。何も削除しない。
§6 还要搬什么过来 §6 What Still Moves Over §6 まだ移植するもの
-
#90 设备标识(Stage 3) — CEO 这轮测试的核心
必须移植(进行中) -
#95 旧 token — 服务端 REPLACE 后 app 还拿旧 token;4 个缺陷在真线上一模一样
必须移植(进行中) -
#93 到期写盘修复 — 真线不需要(它本来就用对的写法)
只移植它的回归测试 -
#86 CI 加固 + iOS 17 门槛提交
不移植
b52),从新 main 出。
-
#90 Device identity (Stage 3) — core of this CEO test round
Must port (in progress) -
#95 Stale token — server did REPLACE but app still holds old token; 4 defects identical on true line
Must port (in progress) -
#93 Expiry-write fix — true line doesn't need the fix (already writes correctly)
Port its regression tests only -
#86 CI hardening + iOS 17 gate commit
Do not port
b52), from new main.
-
#90 デバイス識別(Stage 3) — CEO の今回のテストの核心
移植必須(進行中) -
#95 古いトークン — サーバーが REPLACE した後もアプリが古いトークンを保持;4 つの欠陥は真のラインにも同一
移植必須(進行中) -
#93 期限書き込み修正 — 真のラインには不要(元から正しい書き方)
回帰テストのみ移植 -
#86 CI 強化 + iOS 17 ゲートコミット
移植しない
b52)、新 main から。
§7 三个还不确定的事 §7 Three Things Not Yet Certain §7 まだ確定していない三つのこと
搬迁是否搬全了?
坏线上 5/29–8/1 的旧提交,8/2 那次搬迁记录说 21/22,PR #42 后来由 #68 补回。
怎么确认:用 diff 逐个对。
那条「创始人批准」记录
9/1 的 reunify 会话记录说「创始人批准 option A」,和你现在的记忆相反。
怎么处理:以你今天的决定为准;那条记录会被标注为错。
「连接中」的真正原因
NE 抖动 vs 换线协调器?两条线都有。
怎么确认:需要 CEO 一份 Console 日志或再一段录屏。
Was the migration complete?
Old commits 5/29–8/1 on the bad line: the 8/2 migration log says 21/22; PR #42 was later covered by #68.
How we'll know: diff each commit one by one.
The "founder approved" record
The 9/1 reunify session log says "founder approved option A" — contradicts your current recollection.
Resolution: your decision today takes precedence; that record will be annotated as incorrect.
Root cause of "Connecting…"
NE jitter vs route-coordinator? Present on both tracks.
How we'll know: need a Console log or another screen recording from the CEO.
移行は完全だったか?
不良ライン上の 5/29–8/1 の古いコミット:8/2 の移行記録では 21/22。PR #42 は後に #68 で補完。
確認方法:diff で一つずつ対照。
「創業者が承認」の記録
9/1 の reunify セッションログに「創業者が option A を承認」とあるが、現在の記憶と矛盾。
対応:今日の決定が優先;その記録は誤りとして注釈される。
「接続中…」の真の原因
NE のジッター vs ルートコーディネーター?両方の線に存在。
確認方法:CEO から Console ログまたは追加の録画が必要。