如何利用 InkWeave 寫出 What If 劇情分支與多重宇宙故事
艾琳站在封印之門前。只要拔出聖劍,她就能救下王都,卻會被守劍人視為叛徒。
在正史裡,她拔出了劍。但你也想知道:如果她拒絕拔劍呢?如果她反而接受敵國的王冠呢?
一般文件副本只能替你保存幾份不同的文章。InkWeave 與 Git 的組合則能替每一個選擇保留一套完整世界:章節、角色、物品、地點、陣營,以及這條世界線真正發生過的因果事件。
這篇教學不需要程式設計知識,也不需要 GitHub。所有世界線都可以只留在你的電腦裡。
先把 Git 翻譯成作者的語言
Section titled “先把 Git 翻譯成作者的語言”| Git 名稱 | 在故事裡的意思 |
|---|---|
main |
正史宇宙 |
branch(分支) |
從某個選擇點誕生的 What If 平行宇宙 |
commit(提交) |
這條時間線的一個存檔點 |
git switch |
切換到另一個宇宙 |
| InkWeave | 實際寫作並追蹤因果關係的地方 |
你不需要學會 Git 的所有功能。這篇只會使用建立存檔點、建立分支、切換分支與查看目前位置所需的少數指令。
免費版與訂閱版:差在誰負責因果律
Section titled “免費版與訂閱版:差在誰負責因果律”就這篇教學而言,Git 負責建立多重宇宙,InkWeave 則是實際寫作的地方。是否訂閱不會決定你能不能建立分支:免費版與訂閱版都能使用本文的 Git 流程,InkWeave 也不會用方案限制世界線數量。
真正的差別,是切換之後由誰判斷這個宇宙是否仍然合理:
| 在這套多重宇宙流程中 | 免費版 | 訂閱版(Pro) |
|---|---|---|
| 建立與切換世界線 | 可以。透過 Git 建立、保存並切換你管理得來的所有分支。 | 可以。Git 指令與安全規則完全相同。 |
| 切換後回來的內容 | Git 會還原該分支記錄的整本書專案,不只是換掉某一章。 | 同樣會回到完整分支,包含保存在其中的 InkWeave 記錄。 |
| 發現劇情矛盾 | 沒有自動因果檢查。作者必須自己記得物品在誰手上、誰還活著、角色位於何處,以及哪些事件已經發生。 | InkWeave 能依目前分支的卡片、事件、狀態與因果記錄進行比對,並對記錄足以證明的矛盾提出提醒。 |
| 作者需要維護什麼 | 自行整理筆記、大綱,以及一套「大腦內建因果律」。 | 作者仍要定義事實、卡片與因果事件;InkWeave 負責協助記住並驗證。 |
訂閱版中,如果你已經記錄「艾琳沒有取得聖劍」,並建立相關卡片、狀態或因果事件,InkWeave 就能拿後續事件與 A 線的記錄比對,找出矛盾。它不是讀心術:從未寫下或記錄的重要事實,系統無法憑空知道,自然也不能自動檢查。
所以,訂閱買到的不是更多宇宙。免費版已經能使用 Git 多重宇宙;Pro 的價值是讓 InkWeave 協助維護每個宇宙的因果帳本,不必全部塞在作者腦中。
訂閱版切換後,因果律為什麼仍然正確?
Section titled “訂閱版切換後,因果律為什麼仍然正確?”Git 切換的不是單獨一篇文章,而是這本書的完整專案。
假設正史中的艾琳已經取得聖劍、守劍人死亡,而且王國開始追捕她;在「拒絕拔劍」的世界線裡,聖劍仍留在祭壇、守劍人還活著,王國也沒有追捕她。這兩套結果會分別留在各自的分支中。
當你關閉 InkWeave、切換分支,再重新開啟 InkWeave,程式讀到的就是保存在目前世界線裡的章節、卡片與因果記錄。訂閱版中,只要作者已記錄相關事實,如果艾琳在拒絕拔劍的世界裡根本沒有取得聖劍,後文卻安排她交出聖劍,InkWeave 就能依照這一條世界線發現前後矛盾。
切換世界線前,唯一必須記住的規則
Section titled “切換世界線前,唯一必須記住的規則”不要在 InkWeave 開啟時執行 git add、git commit 或 git switch。InkWeave 會自動儲存;如果你先切換世界線,仍留在記憶體裡的舊內容可能被寫進另一個分支。
也不要先切換,再立刻關閉 InkWeave。關閉程式本身仍可能觸發儲存。正確順序永遠是:先關閉,再操作 Git。
1. 開始前先做一份外部備份
Section titled “1. 開始前先做一份外部備份”第一次使用 Git 前,先把這本書的整個專案資料夾複製到外接硬碟、USB、雲端硬碟或另一個安全位置。
Git 可以保護你免於許多誤改,但本機 Git 不是外部備份。InkWeave 的 Git 歷史會放在書籍資料夾裡;如果整個資料夾被刪除,歷史也會一起消失。
請只複製備份,不要把原始專案移走,也不要直接修改裡面的 JSON 檔案。
2. 找到這本書真正的專案資料夾
Section titled “2. 找到這本書真正的專案資料夾”先在 InkWeave 開啟你準備建立世界線的那本書,然後進入:
專案設定 → 一般 → 開啟專案目錄
這個按鈕會開啟 InkWeave 的應用程式資料目錄,裡面包含所有書籍,但它不是目前這本書的最終資料夾。接下來還要依序進入:
InkWeaveProjects → 你的書籍資料夾書籍資料夾通常使用建立專案時的名稱。如果你後來只在 InkWeave 裡修改書名,硬碟上的資料夾仍可能保留最初的名稱。
找到後,先讓 Finder 或檔案總管停在這個書籍資料夾,再完全關閉 InkWeave。
macOS 的實際位置
Section titled “macOS 的實際位置”InkWeave 正式版的書籍放在:
~/Library/Application Support/net.inkweave.studio/InkWeaveProjects/<專案資料夾>/例如:
/Users/你的帳號/Library/Application Support/net.inkweave.studio/InkWeaveProjects/艾琳與聖劍/macOS 預設會隱藏「資源庫」資料夾,所以你可能無法一路用滑鼠找到它。最快的方法是:
- 打開 Finder。
- 在最上方選擇前往 → 前往資料夾。
- 貼上下面這段路徑:
~/Library/Application Support/net.inkweave.studio/InkWeaveProjects- 按 Enter,再打開自己的書籍資料夾。
net.inkweave.studio 是 InkWeave 的應用程式識別碼。這個位置由系統的應用程式資料目錄決定,不是 /Applications 裡的 InkWeave 程式本體。了解 Tauri 的應用程式資料路徑
Windows 的實際位置
Section titled “Windows 的實際位置”InkWeave 正式版的書籍放在:
C:\Users\<你的帳號>\AppData\Roaming\net.inkweave.studio\InkWeaveProjects\<專案資料夾>\AppData 預設是隱藏資料夾。你不需要先把它設為顯示:
- 打開檔案總管。
- 點一下最上方的網址列。
- 貼上:
%APPDATA%\net.inkweave.studio\InkWeaveProjects- 按 Enter,再打開自己的書籍資料夾。
%APPDATA% 會自動換成目前 Windows 使用者的 AppData\Roaming 路徑。不要前往 Program Files、InkWeave 安裝資料夾或桌面捷徑;那些地方沒有你的寫作專案。
3. 安裝並確認 Git
Section titled “3. 安裝並確認 Git”本節的指令只會安裝 Git 或顯示版本,不會進入或修改 InkWeave 專案,因此完成這一節時可以暫時讓 InkWeave 保持開啟。
1. 打開終端機
Section titled “1. 打開終端機”按下 Command + 空白鍵 打開 Spotlight,輸入「終端機」或 Terminal,再按 Enter。也可以從 Finder → 應用程式 → 工具程式 → 終端機 找到它。
終端機視窗可能看起來很陌生,但你只需要輸入本文列出的指令。這篇教學的任何步驟都不需要輸入 sudo,也不要直接在終端機裡輸入 Mac 的登入密碼。
2. 先確認 Git 是否已經存在
Section titled “2. 先確認 Git 是否已經存在”輸入:
git --version這是在問電腦:「Git 是否已經可以使用?」--version 只會顯示版本,不會修改任何故事。
如果看到類似下面的文字,代表已經準備好:
git version 2.x.x如果看見版本號,代表 Git 已經準備完成,可以直接前往第 4 節。
3. 依照提示安裝 Apple Command Line Tools
Section titled “3. 依照提示安裝 Apple Command Line Tools”如果 macOS 顯示需要開發者工具,請選擇安裝、同意授權條款,並等待下載完成。如果視窗同時提供「取得 Xcode」,不必選它。本文只需要體積小得多的 Command Line Tools,不需要安裝完整 Xcode。
安裝過程需要網路。macOS 可能透過正常的系統視窗要求管理員密碼或 Touch ID;你不需要安裝 Homebrew、GitHub Desktop,也不需要 GitHub 帳號或程式設計經驗。
如果安裝視窗沒有出現,或終端機顯示 xcrun: error: invalid active developer path,請輸入:
xcode-select --install這是在請 macOS 打開同一套官方 Command Line Tools 安裝程式。看到 install requested for command line developer tools 一類的訊息,代表系統已收到要求;接著等待安裝視窗並完成安裝,不必反覆輸入這個指令。
安裝完成後,關閉終端機、重新打開,再輸入:
git --version看到 git version 2.x.x 就完成了。如果 macOS 仍然說找不到工具,請前往系統設定 → 一般 → 軟體更新,完成畫面中列出的 Command Line Tools 更新後再試一次。系統安裝仍無法完成時,可查看 Git 官方 macOS 安裝說明。
Windows
Section titled “Windows”1. 下載正確的安裝程式
Section titled “1. 下載正確的安裝程式”前往 Git 官方 Windows 安裝頁,下載 Standalone Installer:
- 多數使用 Intel 或 AMD 處理器的 Windows 電腦請選 x64。
- 只有在設定 → 系統 → 關於 → 系統類型顯示為 ARM 型電腦時,才選 ARM64。
- 本文不建議使用 Portable 免安裝版;一般安裝程式才會加入後文需要的 Git Bash Here 選單。
2. 選擇適合新手的安裝選項
Section titled “2. 選擇適合新手的安裝選項”打開下載完成的安裝程式。大部分畫面保留預設值即可,但如果看見以下選項,請這樣選:
- Select Components:保留預設值,並確認 Git Bash Here 已勾選。本文不需要 Git LFS,桌面捷徑也可自由決定。
- Choosing the default editor:如果可以選擇,請選記事本或你已熟悉的編輯器。本文通常會直接把存檔名稱寫在指令裡,所以幾乎不會打開這個編輯器。
- Adjusting your PATH environment:選擇建議的中間選項 Git from the command line and also from 3rd-party software。
- Choosing the SSH executable:保留 Use bundled OpenSSH。
- Choosing HTTPS transport:保留隨附的 OpenSSL 選項。
- Configuring line ending conversions:可以保留安裝程式的預設值;第 5 節會替這一本 InkWeave 書籍加入專用設定,避免專案檔案的換行被意外轉換。
- Choosing the terminal emulator:保留 Git Bash 使用的預設 MinTTY 終端機。
git pull、認證管理員與額外或實驗性功能:全部保留預設值。本文不會連接 GitHub,也不使用遠端儲存庫。
如果 Windows 顯示管理員授權視窗,依照正常的系統提示操作即可。任何步驟都不需要關閉防毒軟體,也不要把管理員密碼輸入 Git Bash。
3. 打開 Git Bash 並確認安裝
Section titled “3. 打開 Git Bash 並確認安裝”安裝完成後,打開開始選單,搜尋並開啟 Git Bash,輸入:
git --versionGit Bash 是這篇教學在 Windows 使用的命令視窗。看到 git version 2.x.x.windows.x 一類的結果,就代表可以繼續。打開 Git Bash 時不需要登入任何帳號。
如果安裝 Git 時 Git Bash 已經開著,請先關閉並重新打開後再試一次。如果開始選單找不到 Git Bash,或仍然顯示 command not found,請重新執行官方安裝程式,並確認 Git Bash 元件已勾選。
4. 讓終端機站在正確的書籍裡
Section titled “4. 讓終端機站在正確的書籍裡”macOS:把資料夾拖進終端機
Section titled “macOS:把資料夾拖進終端機”- 打開終端機。
- 輸入
cd,再輸入一個空格,先不要按 Enter。 - 把剛才找到的書籍資料夾從 Finder 拖進終端機。
- 終端機會自動填入完整路徑。按 Enter。
cd 是 change directory 的縮寫。它的故事意思是:「請把我帶到這本書所在的宇宙入口。」拖曳資料夾可以避免中文、空格或帳號名稱輸入錯誤。
Windows:在書籍資料夾打開 Git Bash
Section titled “Windows:在書籍資料夾打開 Git Bash”在檔案總管進入書籍資料夾後,對空白處按滑鼠右鍵,選擇 Open Git Bash here。Windows 11 如果沒有直接顯示,先選擇顯示更多選項。
here 就是「在這裡」:Git Bash 會直接站在你目前打開的書籍資料夾,不必手動輸入很長的 Windows 路徑。
兩個系統都要做的確認
Section titled “兩個系統都要做的確認”先輸入:
pwdpwd 是在問:「我目前站在哪一個資料夾?」它只顯示位置,不會修改檔案。路徑的最後應該是這本書的專案資料夾。
接著輸入:
lsls 是在問:「這個資料夾裡有什麼?」正確位置應該直接看到:
inkweave.jsonchapters也可能看見 characters、items、locations、factions、assets 或 inventory.index.json 等其他 InkWeave 資料。
如果 ls 顯示的是很多不同書名,代表你還停在 InkWeaveProjects,請進入其中一本書後再繼續。如果看不到 inkweave.json 與 chapters,也先不要執行下一步。
5. 把目前故事建立為正史 main
Section titled “5. 把目前故事建立為正史 main”確認 InkWeave 已經完全關閉,而且終端機位於正確書籍資料夾後,輸入:
git init -b main這個指令可以拆成三部分:
git:請 Git 執行工作。init:在這本書裡建立時間線管理。-b main:把第一條時間線命名為main,也就是正史宇宙。
它不會改寫故事,也不會上傳任何檔案。Git 只會在書籍資料夾內建立一個隱藏的 .git 資料夾,用來保存歷史。不要手動修改或刪除 .git。
設定這本書的作者署名
Section titled “設定這本書的作者署名”輸入以下兩行,把引號裡的名稱換成你的作者名:
git config user.name "你的作者名稱"git config user.email "author@localhost"第一行是替存檔點標上作者名稱。第二行是 Git 存檔格式需要的作者欄位;author@localhost 只是本機文字,不會寄信,也不會把資料上傳。
因為這兩個指令沒有使用 --global,設定只屬於目前這一本書,不會改變其他 Git 專案。
讓 Git 保持 InkWeave 專案檔案原貌
Section titled “讓 Git 保持 InkWeave 專案檔案原貌”再輸入一項設定:
git config core.autocrlf falseWindows 與 macOS 表示換行的方式不同。這個設定是在告訴 Git:「保留這本書的 InkWeave 專案檔案原貌,不要自動轉換換行。」它不會修改硬碟上既有的故事內容。
這個指令同樣沒有使用 --global,所以只會作用於目前這一本書,不會改變電腦裡其他寫作專案或程式碼專案的設定。
排除作業系統產生的雜項
Section titled “排除作業系統產生的雜項”把下面這一整行貼進終端機,只執行一次:
printf '%s\n' '.DS_Store' 'Thumbs.db' 'desktop.ini' '*.tmp' >> .gitignore這是在建立 .gitignore,告訴 Git 不必記錄 macOS 或 Windows 自動產生的桌面雜項。>> 的意思是附加內容,不會清除既有設定。
請不要把 inventory.index.json、.inkweave、快照或 *.bak.* 加進 .gitignore。它們屬於完整世界線的一部分;切換宇宙時也應跟著切換。
看看 Git 發現了什麼
Section titled “看看 Git 發現了什麼”輸入:
git status --short這是在問:「目前宇宙還有哪些內容尚未放進存檔點?」第一次執行時會看到許多以 ?? 開頭的檔案,這很正常。?? 只表示 Git 第一次看見它們,並不是檔案有問題。
接著輸入:
git add -Aadd 是把目前所有新增、修改與刪除的內容收進下一個存檔點;-A 表示這本書裡的所有變化。它像把章節、卡片與因果記錄整理到同一個存檔箱中,但此時還沒有正式封存。
建立第一個存檔點:
git commit -m "建立正史宇宙"commit 是正式封存這個時間點;-m 後面的引號是存檔名稱。這行的故事意思是:「把目前所有內容定為正史的第一個穩定節點。」
最後檢查:
git status --shortgit branch --show-current第一行如果沒有顯示任何文字,代表目前宇宙已完整保存。第二行應該顯示 main,代表你站在正史宇宙。
6. 先封存三個宇宙共同的選擇點
Section titled “6. 先封存三個宇宙共同的選擇點”三條線要從同一個地方分開,關鍵不是先寫出三種結局,而是先保存選擇發生前的最後一刻。
回到 InkWeave,把正史寫到:艾琳站在封印之門前,聖劍仍在祭壇上,守劍人仍然活著,她也還沒有接受敵國王冠。游標停在她即將做出選擇的位置。
這時三個宇宙的狀態完全相同:
- 艾琳尚未持有聖劍。
- 守劍人仍然活著。
- 封印之門尚未開啟。
- 艾琳仍屬於原本的守門人陣營。
- 敵國王冠尚未交到她手上。
關閉 InkWeave,然後輸入:
git status --shortgit add -Agit commit -m "艾琳抵達封印之門"git status --short這個 commit 就是三個宇宙共同的岔路口。它保存的不是某一個答案,而是「艾琳還沒有回答」的那一刻。
如果最後一行沒有輸出,再確認你仍在正史:
git branch --show-current應該看到 main。現在可以從同一個乾淨的選擇點,依序長出 A、B 與正史三種未來。
7. A 線:艾琳拒絕拔劍
Section titled “7. A 線:艾琳拒絕拔劍”保持 InkWeave 關閉,從共同岔路口建立 A 線:
git switch -c what-if-refuse-swordswitch:前往另一條世界線。-c:建立一條尚不存在的新線。what-if-refuse-sword:替「拒絕拔劍」宇宙取的名稱。
正常情況下會看到 Switched to a new branch 'what-if-refuse-sword'。再輸入:
git branch --show-current確認顯示 what-if-refuse-sword 後,重新開啟 InkWeave,開始寫 A 線:
艾琳放開劍柄,決定相信守劍人的警告。她帶著同伴從地下水道離開,封印之門仍然緊閉。
在 InkWeave 裡,也讓因果事件符合這個版本:不要讓艾琳取得聖劍,不要讓守劍人死亡,也不要把封印之門改為開啟。如果她從地下水道離開,就記錄她真正移動到的新地點。
A 線完成一段後,關閉 InkWeave 並保存:
git status --shortgit add -Agit commit -m "A線:艾琳拒絕拔出聖劍"git status --short第一行讓你看見 A 線改動了哪些章節與因果資料;第二行收集全部變化;第三行封存這個未來;最後一行確認沒有遺漏。
此時 A 線應該是:
| 世界狀態 | A 線結果 |
|---|---|
| 聖劍 | 留在祭壇,艾琳未持有 |
| 守劍人 | 仍然活著 |
| 封印之門 | 仍然封閉 |
| 艾琳的陣營 | 保留原本身份 |
| 接下來的故事 | 從地下水道逃離 |
如果後文卻讓艾琳交出聖劍,InkWeave 會依照 A 線的事件歷史發現:她從未取得這件物品。
8. B 線:艾琳接受敵國王冠
Section titled “8. B 線:艾琳接受敵國王冠”接下來要讓 B 線也從同一個選擇點出生,而不是從 A 線的未來繼續分岔。
先保持 InkWeave 關閉,確認 A 線的 git status --short 沒有輸出,再回到 main:
git switch main這時的 main 仍停在「艾琳尚未回答」的共同岔路口,因為剛才拒絕拔劍的內容只提交在 A 線。
現在從這裡建立 B 線:
git switch -c what-if-take-the-crowngit branch --show-current第一行建立並切換到「接受王冠」宇宙;第二行應該顯示 what-if-take-the-crown。確認後重新開啟 InkWeave,寫下另一個答案:
艾琳沒有碰聖劍。她轉身面向敵國使者,接受黑冠,以新任女王的身份命令封印之門保持關閉。
在這個版本裡,聖劍仍留在祭壇,守劍人也可以活著;但艾琳取得了敵國王冠,並加入或領導新的陣營。請在 InkWeave 放入與正文一致的物品與陣營事件。
完成一段 B 線後,關閉 InkWeave 並輸入:
git status --shortgit add -Agit commit -m "B線:艾琳接受敵國王冠"git status --short此時 B 線應該是:
| 世界狀態 | B 線結果 |
|---|---|
| 聖劍 | 留在祭壇,艾琳未持有 |
| 守劍人 | 仍然活著 |
| 封印之門 | 依她的命令保持封閉 |
| 艾琳的陣營 | 加入或領導敵國勢力 |
| 特殊物品 | 艾琳持有敵國王冠 |
如果後文仍把艾琳當成原陣營的普通成員,或讓另一人同時持有同一頂王冠,InkWeave 就會按照 B 線自己的因果事件檢查問題,而不會借用 A 線或正史的狀態。
9. main:完成艾琳拔劍的正史
Section titled “9. main:完成艾琳拔劍的正史”現在 A、B 兩條平行線都已從共同選擇點建立。保持 InkWeave 關閉,確認 B 線狀態乾淨,回到正史:
git switch maingit branch --show-current第二行應該顯示 main。重新開啟 InkWeave,你會再次看到選擇發生前的最後一刻:聖劍仍在祭壇,艾琳還沒有做出回答。A、B 兩條線的內容都不會出現在這裡。
接著寫下正史:
艾琳拔出聖劍。守劍人為了阻止她而死,封印之門隨劍光開啟,她也因此被逐出原本的陣營。
在 InkWeave 裡記錄與正史相符的事件:艾琳取得聖劍、守劍人死亡、封印之門改變狀態,以及艾琳離開原本陣營。Git 不會替你創造這些因果;它負責保存你在 InkWeave 為每個宇宙寫下的不同事實。
完成後關閉 InkWeave,保存正史:
git status --shortgit add -Agit commit -m "正史:艾琳拔出聖劍"git status --short此時 main 應該是:
| 世界狀態 | main 正史結果 |
|---|---|
| 聖劍 | 由艾琳持有 |
| 守劍人 | 已死亡 |
| 封印之門 | 已開啟 |
| 艾琳的陣營 | 已離開原本陣營 |
| 接下來的故事 | 帶著聖劍進入門後世界 |
到這裡,同一個選擇點已經真正長出三個互不覆蓋的完整宇宙。
10. 實際巡迴切換三個宇宙
Section titled “10. 實際巡迴切換三個宇宙”現在來完整走一次:main → A 線 → B 線 → main。每一站都關閉 InkWeave、檢查狀態、切換,再重新開啟。
從正史前往 A 線
Section titled “從正史前往 A 線”先關閉 InkWeave,輸入:
git status --short沒有輸出才繼續。如果有檔案,先用 git add -A 與 git commit 保存正史的新變化。
接著切換:
git switch what-if-refuse-swordgit branch --show-current第一行沒有 -c,因為 A 線已經存在;現在只是回去。第二行顯示 what-if-refuse-sword 後,重新開啟 InkWeave。
你應該看到艾琳拒絕拔劍的版本:守劍人活著、聖劍不在她身上、封印之門仍然關閉。如果這時移動游標或檢查故事後段,InkWeave 使用的也是 A 線自己的因果歷史。
從 A 線前往 B 線
Section titled “從 A 線前往 B 線”再次關閉 InkWeave。先問 Git,A 線是否已經保存完整:
git status --short確認沒有輸出後,輸入:
git switch what-if-take-the-crowngit branch --show-current確認顯示 what-if-take-the-crown,再重新開啟 InkWeave。現在艾琳應該持有的是敵國王冠,而不是聖劍;她的陣營身份也應該是 B 線版本。A 線的地下水道未來不會跟過來。
從 B 線回到正史
Section titled “從 B 線回到正史”關閉 InkWeave,再做最後一次檢查與切換:
git status --shortgit switch maingit branch --show-current只有第一行沒有輸出時,才應執行後面兩行。看到 main 後重新開啟 InkWeave,艾琳會再次持有聖劍,守劍人也會回到正史中的死亡狀態。
這不是 InkWeave 忘記或重新猜測故事,而是你真的把整本書切回了另一套完整事件歷史。
11. 在任一宇宙繼續寫下去
Section titled “11. 在任一宇宙繼續寫下去”假設你回到 A 線,又寫了三章地下水道冒險。那些章節只會存在 A 線。完成後依舊是:
git status --shortgit add -Agit commit -m "A線:艾琳抵達地下城"git status --short切回 main 時,正史不會突然多出地下城章節;切到 B 線時,女王艾琳也不會憑空記得 A 線的逃亡。三條故事可以各自繼續成長,不需要維持相同篇幅。
12. 查看三分支多重宇宙
Section titled “12. 查看三分支多重宇宙”只查看目前宇宙:
git branch --show-current列出全部宇宙:
git branch你會看到三個分支,其中目前所在的分支前面有 *:
mainwhat-if-refuse-swordwhat-if-take-the-crown想看它們從哪裡分開,可以輸入:
git log --oneline --graph --decorate --all--oneline:每個存檔點只顯示一行。--graph:用線條畫出三條分岔。--decorate:標出main、A 線與 B 線名稱。--all:三個宇宙全部顯示。
你應該會看見「艾琳抵達封印之門」是三條線共同的祖先,之後分別通往「正史:拔出聖劍」、「A 線:拒絕拔劍」與「B 線:接受王冠」。這就是這本書目前的多重宇宙地圖。
為什麼這篇不教 merge?
Section titled “為什麼這篇不教 merge?”程式碼分支常常需要合併,但故事世界線不一定需要。
「艾琳拔劍」和「艾琳拒絕拔劍」都是完整未來。把兩條線硬合在一起,反而可能讓互相排斥的章節、角色狀態與因果事件撞在一起。因此這篇只教你保存、切換並繼續各自的宇宙,不要求把它們合回 main。
如果某條 What If 後來成為你最喜歡的版本,直接留在那條分支繼續寫即可。名稱不是正史,作者的選擇才是。
常見訊息與處理方式
Section titled “常見訊息與處理方式”fatal: not a git repository
Section titled “fatal: not a git repository”Git 在說:「我在這裡找不到時間線資料。」先用 pwd 和 ls 確認是否位於正確書籍資料夾;如果尚未執行過 git init -b main,回到建立正史的步驟。
Please tell me who you are
Section titled “Please tell me who you are”Git 還不知道如何標記存檔作者。在目前書籍資料夾重新執行:
git config user.name "你的作者名稱"git config user.email "author@localhost"再重新執行剛才的 git commit。
Your local changes ... would be overwritten by switch
Section titled “Your local changes ... would be overwritten by switch”Git 正在阻止尚未保存的世界被另一個宇宙覆蓋。這是保護,不是故障。
不要加入 -f,也不要強制切換。確認 InkWeave 已關閉後,依序執行:
git status --shortgit add -Agit commit -m "保存目前世界線"git status --short最後沒有輸出,再執行原本的 git switch。
a branch named ... already exists
Section titled “a branch named ... already exists”這表示同名宇宙以前已經建立過,不必再加 -c。例如:
git switch what-if-refuse-sword這是在切換到既有宇宙,不是建立新的宇宙。切換前仍要先關閉 InkWeave 並確認狀態乾淨。
忘記關閉 InkWeave 就切換了?這不是死刑
Section titled “忘記關閉 InkWeave 就切換了?這不是死刑”下面的做法不會直接把事故內容刪掉。順序是:
關閉 InkWeave → 建立 rescue 分支 → 提交事故現場 → 建立完整 Git bundle → 確認目前分支 → 最後才 reset
第一步:停止寫作並完全關閉 InkWeave
Section titled “第一步:停止寫作並完全關閉 InkWeave”立即停止輸入,也不要繼續切換分支。現在先完全關閉 InkWeave,等待視窗消失。
關閉時可能再觸發一次自動儲存,但不用恐慌。我們接下來會把關閉後留下的所有變化收進一條獨立救援分支,而不是直接刪除。
第二步:記下目前站在哪個分支
Section titled “第二步:記下目前站在哪個分支”確認 InkWeave 已關閉後,輸入:
git branch --show-currentgit status --short第一行告訴你事故發生後目前站在哪個宇宙,請把名稱記下來。假設顯示 what-if-take-the-crown,代表 B 線是這次被舊內容寫入的分支。
第二行列出事故留下的檔案:
- 如果完全沒有輸出,代表 InkWeave 很可能沒有把舊內容寫入硬碟。你可以依正常流程切回想去的分支,不需要 reset。
- 如果看見
M、??或其他檔案,繼續下面的救援流程。
第三步:把事故現場封進 rescue 分支
Section titled “第三步:把事故現場封進 rescue 分支”輸入:
git switch -c rescue-forgot-to-closegit add -Agit commit -m "緊急救援:切換分支時 InkWeave 尚未關閉"git status --short這四行分別代表:
git switch -c rescue-forgot-to-close:從事故現場建立一條救援分支。原本的main、A 線與 B 線分支指標都不會移動。git add -A:把修改、新增與刪除的檔案全部放進救援箱,包括可能由自動儲存產生的新檔案。git commit:把事故現場正式封存。稍後使用 reset 時,這些內容已經有地方可回頭找。- 最後的
git status --short:應該沒有輸出,代表救援現場已完整保存。
如果 Git 說 rescue-forgot-to-close 已存在,請改用新名稱,例如:
git switch -c rescue-forgot-to-close-2後續指令也要使用你實際建立的 rescue 分支名稱。
第四步:把所有宇宙封成一個 Git bundle
Section titled “第四步:把所有宇宙封成一個 Git bundle”一般檔案備份可能看不見隱藏的 .git。為了確保 main、A 線、B 線、rescue 分支與所有 commit 都被保存,建立 Git 自己的完整救援檔:
git bundle create "../InkWeave-multiverse-rescue.bundle" --allgit bundle verify "../InkWeave-multiverse-rescue.bundle"第一行會在這本書的上一層建立 InkWeave-multiverse-rescue.bundle:
bundle create:把 Git 歷史封裝成一個檔案。../:把救援檔放在書籍資料夾外面,避免後面的分支切換影響它。--all:收進所有分支與所有可到達的 commit,不只目前分支。
第二行會驗證救援檔。看到類似下面的訊息,才代表可以繼續:
InkWeave-multiverse-rescue.bundle is okayThe bundle records a complete history.這個 .bundle 不依賴原專案裡隱藏的 .git;即使日後整個 repository 需要重建,它仍包含這次封存的多重宇宙歷史。
如果同名 bundle 已經存在,請先保留舊檔,並在新名稱後加數字,例如 InkWeave-multiverse-rescue-2.bundle。
第五步:回到被混入內容的分支,再使用 reset
Section titled “第五步:回到被混入內容的分支,再使用 reset”先回想第二步記下的分支。以下假設事故發生後站在 B 線 what-if-take-the-crown;如果你記下的是其他名稱,必須替換成自己的分支。
git switch what-if-take-the-crowngit branch --show-currentgit reset --hard HEADgit status --short逐行理解:
git switch what-if-take-the-crown:離開事故保險箱,回到真正的 B 線。git branch --show-current:必須顯示你準備修復的分支。名稱不對就停下來。git reset --hard HEAD:把 B 線的工作檔案恢復成 B 線最後一個正式 commit。HEAD只代表目前分支的最新存檔點,不會刪除其他宇宙。git status --short:應該沒有輸出,表示 B 線已恢復乾淨。
這時 main、A 線與 B 線原本的 commit 都沒有被改寫;只是 B 線工作目錄裡意外混入的未提交內容被清掉了。
第六步:確認所有宇宙仍然存在
Section titled “第六步:確認所有宇宙仍然存在”git branchgit log --oneline --graph --decorate --all你應該仍能看到:
mainrescue-forgot-to-closewhat-if-refuse-swordwhat-if-take-the-crownrescue-forgot-to-close 是新增的保險箱;其他三個宇宙仍在原本的 commit。現在才可以重新開啟 InkWeave,檢查目前分支是否恢復正確。
第七步:如果 rescue 裡有尚未提交的重要文字
Section titled “第七步:如果 rescue 裡有尚未提交的重要文字”如果事故發生前,你在原本宇宙還寫了尚未 commit 的段落,那些文字可能只存在 rescue 分支。不要 merge 整條 rescue,因為它可能是兩個宇宙的混合物。
最安全的做法是人工取回文字:
- 關閉 InkWeave,切到 rescue 分支。
git switch rescue-forgot-to-close- 重新開啟 InkWeave,只尋找並複製需要救回的段落,把文字暫存到專案外的純文字檔或筆記軟體。不要在 rescue 裡繼續創作。
- 再次關閉 InkWeave。如果開啟與關閉造成新變化,先把 rescue 狀態再保存一次:
git status --shortgit add -Agit commit -m "緊急救援:保存檢視後狀態"git status --short- 切回那些文字原本所屬的正式分支。以下假設原本是 A 線:
git switch what-if-refuse-swordgit branch --show-currentgit reset --hard HEAD- 確認顯示
what-if-refuse-sword後,重新開啟 InkWeave,把剛才救出的文字貼回正確章節。完成後關閉 InkWeave,再建立正常 commit:
git status --shortgit add -Agit commit -m "A線:取回事故前尚未提交的文字"git status --short這樣取回的是作者真正需要的文字,不會把 rescue 裡可能混雜的索引、快照、卡片與另一個宇宙一起 merge 進來。
請先保留 rescue 分支與 .bundle,直到你分別開啟 main、A 線與 B 線確認內容都正確。不要急著刪除這兩層保險。
最後記住這件事
Section titled “最後記住這件事”Git 不會替你寫故事,也不懂艾琳為什麼拔劍。它做的是替每一個選擇保存一扇可以再次打開的門。
InkWeave 則負責門後面的世界:誰持有聖劍、誰仍然活著、哪個地點已毀滅、角色屬於哪個陣營,以及這些結果是否符合各自的因果歷史。
只要始終遵守下面的順序,你就能在正史與 What If 之間安全旅行:
關閉 InkWeave → 檢查並提交 → 切換分支 → 重新開啟 InkWeave