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 二本の線路

✗ 坏血统 main ✗ Bad lineage: main ✗ 不良血統 main ✓ 真线 integration ✓ True line: integration ✓ 真のライン integration 07-31 08-01 08-02 08-17 09-01 09-02 09-03 main e3b8b14 + a24f8ca 坏的手工合并52 个文件手工解冲突 Bad manual merge52 files, hand-resolved 不正な手動マージ52 ファイル手動解決 发 2.0.5 Ship 2.0.5 2.0.5 リリース CEO 报 5 个回归 CEO: 5 regressions CEO: 5件の回帰 integration/ ui-v2-redo… 450ae03 (2.0.1) 从已知好的版本切出 Cut from known-good 正常なバージョンから分岐 22 个提交逐个搬过来 22 commits cherry-picked 22 コミットを逐次移植 2.0.6 ~ 2.0.10 #88 + 2.0.11 (b44) iOS 16 + 给 CEO iOS 16 + sent to CEO iOS 16 + CEO に送信 ★ 创始人规则integration 取代 main ★ Founder Ruleintegration replaces main ★ 創業者ルールintegration が main に取って代わる 08-02

← 在手机上左右滑动查看完整时间线 ← Scroll horizontally on mobile to see the full timeline ← モバイルでは左右にスクロールして全体を表示

§3 走错了 (9/1) §3 The Wrong Turn (9/1) §3 間違った方向 (9/1)

integration✓ 真线 integration✓ True line integration✓ 真のライン PR #83 ✗ 方向反了 ✗ Wrong way ✗ 方向が逆 main ✗ 坏血统 ✗ Bad lineage ✗ 不良血統

合并方向反了:真线被合进坏线。坏线独有的提交(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 防抖,断开文案是「连接中…」。
今天 CEO 装过的包: 2.0.11 (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.

✗ Bad lineage only
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.

✗ Bad lineage only
e3b8b14 manual-merge drift (neither parent had vertical). integration has horizontal.

Stuck on "Connecting…"

An established tunnel drops on a single unconfirmed NE disconnect.

Both tracks (not yet fixed)
State machine has no 300ms debounce; disconnect text shows "Connecting…"
Builds the CEO installed today: 2.0.11 (b20260902781) ← integration | 2.0.12 (b49) ← main | 2.0.12 (b51) ← main

「プラン期限切れ」誤検知

アカウントページは緑色で正常だが、ホーム画面に赤カードで期限切れと表示。

✗ 不良血統のみ
a24f8ca が素の JSONEncoder でディスク書き込み→有効期限が 31 年ずれた。integration にはこのバグなし。

推奨ルートが縦並びに

仕様は横並び/グリッド。CEO の指摘は正しい。

✗ 不良血統のみ
e3b8b14 の手動マージによるドリフト(親コミットのどちらにも縦並びはない)。integration は横並び。

ずっと「接続中…」

確立済みトンネルが未確認の切断 1 回で即切断。

両方の線にある(未修正)
状態マシンに 300ms デバウンスなし。切断中の表示が「接続中…」。
今日 CEO がインストールしたビルド: 2.0.11 (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 に何をしたか

之前

mainbb55dcc

坏血统,含 #83/#86/#90/#93

integration9ade761

之后

archive/main-bad-lineage-20260903bb55dcc

备份,所有提交都还在,永远不合回来

main9ade761

= integration,含 iOS 16 支持

PR #95 关闭待移植

备份 → 重置(force-reset = 把指针搬过去),不删任何东西。

BEFORE

mainbb55dcc

Bad lineage, includes #83/#86/#90/#93

integration9ade761

AFTER

archive/main-bad-lineage-20260903bb55dcc

Backup — all commits preserved, never merged back

main9ade761

= integration, includes iOS 16 support

PR #95 closed, awaiting port

Backup → reset (force-reset = move the pointer). Nothing deleted.

変更前

mainbb55dcc

不良血統、#83/#86/#90/#93 を含む

integration9ade761

変更後

archive/main-bad-lineage-20260903bb55dcc

バックアップ — 全コミット保持、二度とマージしない

main9ade761

= integration、iOS 16 サポート含む

PR #95 クローズ、移植待ち

バックアップ → リセット(force-reset = ポインタを移動)。何も削除しない。

§6 还要搬什么过来 §6 What Still Moves Over §6 まだ移植するもの

archive(备份) archive (backup) archive(バックアップ) 选择性移植 selective port 選択的移植 新 main(真线) new main (true line) 新 main(真のライン)
  • #90 设备标识(Stage 3) — CEO 这轮测试的核心

    必须移植(进行中)
  • #95 旧 token — 服务端 REPLACE 后 app 还拿旧 token;4 个缺陷在真线上一模一样

    必须移植(进行中)
  • #93 到期写盘修复 — 真线不需要(它本来就用对的写法)

    只移植它的回归测试
  • #86 CI 加固 + iOS 17 门槛提交

    不移植
下一包:2.0.13 (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
Next build: 2.0.13 (b52), from new main.
  • #90 デバイス識別(Stage 3) — CEO の今回のテストの核心

    移植必須(進行中)
  • #95 古いトークン — サーバーが REPLACE した後もアプリが古いトークンを保持;4 つの欠陥は真のラインにも同一

    移植必須(進行中)
  • #93 期限書き込み修正 — 真のラインには不要(元から正しい書き方)

    回帰テストのみ移植
  • #86 CI 強化 + iOS 17 ゲートコミット

    移植しない
次のビルド:2.0.13 (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 ログまたは追加の録画が必要。