跳到內容

如何利用 InkWeave 寫出 What If 劇情分支與多重宇宙故事

艾琳站在封印之門前。只要拔出聖劍,她就能救下王都,卻會被守劍人視為叛徒。

在正史裡,她拔出了劍。但你也想知道:如果她拒絕拔劍呢?如果她反而接受敵國的王冠呢?

一般文件副本只能替你保存幾份不同的文章。InkWeave 與 Git 的組合則能替每一個選擇保留一套完整世界:章節、角色、物品、地點、陣營,以及這條世界線真正發生過的因果事件。

這篇教學不需要程式設計知識,也不需要 GitHub。所有世界線都可以只留在你的電腦裡。

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 addgit commitgit switch。InkWeave 會自動儲存;如果你先切換世界線,仍留在記憶體裡的舊內容可能被寫進另一個分支。

也不要先切換,再立刻關閉 InkWeave。關閉程式本身仍可能觸發儲存。正確順序永遠是:先關閉,再操作 Git。

第一次使用 Git 前,先把這本書的整個專案資料夾複製到外接硬碟、USB、雲端硬碟或另一個安全位置。

Git 可以保護你免於許多誤改,但本機 Git 不是外部備份。InkWeave 的 Git 歷史會放在書籍資料夾裡;如果整個資料夾被刪除,歷史也會一起消失。

請只複製備份,不要把原始專案移走,也不要直接修改裡面的 JSON 檔案。

2. 找到這本書真正的專案資料夾

Section titled “2. 找到這本書真正的專案資料夾”

先在 InkWeave 開啟你準備建立世界線的那本書,然後進入:

專案設定 → 一般 → 開啟專案目錄

這個按鈕會開啟 InkWeave 的應用程式資料目錄,裡面包含所有書籍,但它不是目前這本書的最終資料夾。接下來還要依序進入:

InkWeaveProjects → 你的書籍資料夾

書籍資料夾通常使用建立專案時的名稱。如果你後來只在 InkWeave 裡修改書名,硬碟上的資料夾仍可能保留最初的名稱。

找到後,先讓 Finder 或檔案總管停在這個書籍資料夾,再完全關閉 InkWeave。

InkWeave 正式版的書籍放在:

~/Library/Application Support/net.inkweave.studio/InkWeaveProjects/<專案資料夾>/

例如:

/Users/你的帳號/Library/Application Support/net.inkweave.studio/InkWeaveProjects/艾琳與聖劍/

macOS 預設會隱藏「資源庫」資料夾,所以你可能無法一路用滑鼠找到它。最快的方法是:

  1. 打開 Finder。
  2. 在最上方選擇前往 → 前往資料夾
  3. 貼上下面這段路徑:
~/Library/Application Support/net.inkweave.studio/InkWeaveProjects
  1. 按 Enter,再打開自己的書籍資料夾。

net.inkweave.studio 是 InkWeave 的應用程式識別碼。這個位置由系統的應用程式資料目錄決定,不是 /Applications 裡的 InkWeave 程式本體。了解 Tauri 的應用程式資料路徑

InkWeave 正式版的書籍放在:

C:\Users\<你的帳號>\AppData\Roaming\net.inkweave.studio\InkWeaveProjects\<專案資料夾>\

AppData 預設是隱藏資料夾。你不需要先把它設為顯示:

  1. 打開檔案總管。
  2. 點一下最上方的網址列。
  3. 貼上:
%APPDATA%\net.inkweave.studio\InkWeaveProjects
  1. 按 Enter,再打開自己的書籍資料夾。

%APPDATA% 會自動換成目前 Windows 使用者的 AppData\Roaming 路徑。不要前往 Program Files、InkWeave 安裝資料夾或桌面捷徑;那些地方沒有你的寫作專案。

本節的指令只會安裝 Git 或顯示版本,不會進入或修改 InkWeave 專案,因此完成這一節時可以暫時讓 InkWeave 保持開啟。

按下 Command + 空白鍵 打開 Spotlight,輸入「終端機」或 Terminal,再按 Enter。也可以從 Finder → 應用程式 → 工具程式 → 終端機 找到它。

終端機視窗可能看起來很陌生,但你只需要輸入本文列出的指令。這篇教學的任何步驟都不需要輸入 sudo,也不要直接在終端機裡輸入 Mac 的登入密碼。

輸入:

Terminal window
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,請輸入:

Terminal window
xcode-select --install

這是在請 macOS 打開同一套官方 Command Line Tools 安裝程式。看到 install requested for command line developer tools 一類的訊息,代表系統已收到要求;接著等待安裝視窗並完成安裝,不必反覆輸入這個指令。

安裝完成後,關閉終端機、重新打開,再輸入:

Terminal window
git --version

看到 git version 2.x.x 就完成了。如果 macOS 仍然說找不到工具,請前往系統設定 → 一般 → 軟體更新,完成畫面中列出的 Command Line Tools 更新後再試一次。系統安裝仍無法完成時,可查看 Git 官方 macOS 安裝說明

前往 Git 官方 Windows 安裝頁,下載 Standalone Installer

  • 多數使用 Intel 或 AMD 處理器的 Windows 電腦請選 x64
  • 只有在設定 → 系統 → 關於 → 系統類型顯示為 ARM 型電腦時,才選 ARM64
  • 本文不建議使用 Portable 免安裝版;一般安裝程式才會加入後文需要的 Git Bash Here 選單。

打開下載完成的安裝程式。大部分畫面保留預設值即可,但如果看見以下選項,請這樣選:

  • 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。

安裝完成後,打開開始選單,搜尋並開啟 Git Bash,輸入:

Terminal window
git --version

Git Bash 是這篇教學在 Windows 使用的命令視窗。看到 git version 2.x.x.windows.x 一類的結果,就代表可以繼續。打開 Git Bash 時不需要登入任何帳號。

如果安裝 Git 時 Git Bash 已經開著,請先關閉並重新打開後再試一次。如果開始選單找不到 Git Bash,或仍然顯示 command not found,請重新執行官方安裝程式,並確認 Git Bash 元件已勾選。

  1. 打開終端機。
  2. 輸入 cd,再輸入一個空格,先不要按 Enter。
  3. 把剛才找到的書籍資料夾從 Finder 拖進終端機。
  4. 終端機會自動填入完整路徑。按 Enter。

cd 是 change directory 的縮寫。它的故事意思是:「請把我帶到這本書所在的宇宙入口。」拖曳資料夾可以避免中文、空格或帳號名稱輸入錯誤。

Windows:在書籍資料夾打開 Git Bash

Section titled “Windows:在書籍資料夾打開 Git Bash”

在檔案總管進入書籍資料夾後,對空白處按滑鼠右鍵,選擇 Open Git Bash here。Windows 11 如果沒有直接顯示,先選擇顯示更多選項

here 就是「在這裡」:Git Bash 會直接站在你目前打開的書籍資料夾,不必手動輸入很長的 Windows 路徑。

先輸入:

Terminal window
pwd

pwd 是在問:「我目前站在哪一個資料夾?」它只顯示位置,不會修改檔案。路徑的最後應該是這本書的專案資料夾。

接著輸入:

Terminal window
ls

ls 是在問:「這個資料夾裡有什麼?」正確位置應該直接看到:

inkweave.json
chapters

也可能看見 charactersitemslocationsfactionsassetsinventory.index.json 等其他 InkWeave 資料。

如果 ls 顯示的是很多不同書名,代表你還停在 InkWeaveProjects,請進入其中一本書後再繼續。如果看不到 inkweave.jsonchapters,也先不要執行下一步。

確認 InkWeave 已經完全關閉,而且終端機位於正確書籍資料夾後,輸入:

Terminal window
git init -b main

這個指令可以拆成三部分:

  • git:請 Git 執行工作。
  • init:在這本書裡建立時間線管理。
  • -b main:把第一條時間線命名為 main,也就是正史宇宙。

它不會改寫故事,也不會上傳任何檔案。Git 只會在書籍資料夾內建立一個隱藏的 .git 資料夾,用來保存歷史。不要手動修改或刪除 .git

輸入以下兩行,把引號裡的名稱換成你的作者名:

Terminal window
git config user.name "你的作者名稱"
git config user.email "author@localhost"

第一行是替存檔點標上作者名稱。第二行是 Git 存檔格式需要的作者欄位;author@localhost 只是本機文字,不會寄信,也不會把資料上傳。

因為這兩個指令沒有使用 --global,設定只屬於目前這一本書,不會改變其他 Git 專案。

讓 Git 保持 InkWeave 專案檔案原貌

Section titled “讓 Git 保持 InkWeave 專案檔案原貌”

再輸入一項設定:

Terminal window
git config core.autocrlf false

Windows 與 macOS 表示換行的方式不同。這個設定是在告訴 Git:「保留這本書的 InkWeave 專案檔案原貌,不要自動轉換換行。」它不會修改硬碟上既有的故事內容。

這個指令同樣沒有使用 --global,所以只會作用於目前這一本書,不會改變電腦裡其他寫作專案或程式碼專案的設定。

把下面這一整行貼進終端機,只執行一次:

Terminal window
printf '%s\n' '.DS_Store' 'Thumbs.db' 'desktop.ini' '*.tmp' >> .gitignore

這是在建立 .gitignore,告訴 Git 不必記錄 macOS 或 Windows 自動產生的桌面雜項。>> 的意思是附加內容,不會清除既有設定。

請不要把 inventory.index.json.inkweave、快照或 *.bak.* 加進 .gitignore。它們屬於完整世界線的一部分;切換宇宙時也應跟著切換。

輸入:

Terminal window
git status --short

這是在問:「目前宇宙還有哪些內容尚未放進存檔點?」第一次執行時會看到許多以 ?? 開頭的檔案,這很正常。?? 只表示 Git 第一次看見它們,並不是檔案有問題。

接著輸入:

Terminal window
git add -A

add 是把目前所有新增、修改與刪除的內容收進下一個存檔點;-A 表示這本書裡的所有變化。它像把章節、卡片與因果記錄整理到同一個存檔箱中,但此時還沒有正式封存。

建立第一個存檔點:

Terminal window
git commit -m "建立正史宇宙"

commit 是正式封存這個時間點;-m 後面的引號是存檔名稱。這行的故事意思是:「把目前所有內容定為正史的第一個穩定節點。」

最後檢查:

Terminal window
git status --short
git branch --show-current

第一行如果沒有顯示任何文字,代表目前宇宙已完整保存。第二行應該顯示 main,代表你站在正史宇宙。

6. 先封存三個宇宙共同的選擇點

Section titled “6. 先封存三個宇宙共同的選擇點”

三條線要從同一個地方分開,關鍵不是先寫出三種結局,而是先保存選擇發生前的最後一刻

回到 InkWeave,把正史寫到:艾琳站在封印之門前,聖劍仍在祭壇上,守劍人仍然活著,她也還沒有接受敵國王冠。游標停在她即將做出選擇的位置。

這時三個宇宙的狀態完全相同:

  • 艾琳尚未持有聖劍。
  • 守劍人仍然活著。
  • 封印之門尚未開啟。
  • 艾琳仍屬於原本的守門人陣營。
  • 敵國王冠尚未交到她手上。

關閉 InkWeave,然後輸入:

Terminal window
git status --short
git add -A
git commit -m "艾琳抵達封印之門"
git status --short

這個 commit 就是三個宇宙共同的岔路口。它保存的不是某一個答案,而是「艾琳還沒有回答」的那一刻。

如果最後一行沒有輸出,再確認你仍在正史:

Terminal window
git branch --show-current

應該看到 main。現在可以從同一個乾淨的選擇點,依序長出 A、B 與正史三種未來。

保持 InkWeave 關閉,從共同岔路口建立 A 線:

Terminal window
git switch -c what-if-refuse-sword
  • switch:前往另一條世界線。
  • -c:建立一條尚不存在的新線。
  • what-if-refuse-sword:替「拒絕拔劍」宇宙取的名稱。

正常情況下會看到 Switched to a new branch 'what-if-refuse-sword'。再輸入:

Terminal window
git branch --show-current

確認顯示 what-if-refuse-sword 後,重新開啟 InkWeave,開始寫 A 線:

艾琳放開劍柄,決定相信守劍人的警告。她帶著同伴從地下水道離開,封印之門仍然緊閉。

在 InkWeave 裡,也讓因果事件符合這個版本:不要讓艾琳取得聖劍,不要讓守劍人死亡,也不要把封印之門改為開啟。如果她從地下水道離開,就記錄她真正移動到的新地點。

A 線完成一段後,關閉 InkWeave 並保存:

Terminal window
git status --short
git add -A
git commit -m "A線:艾琳拒絕拔出聖劍"
git status --short

第一行讓你看見 A 線改動了哪些章節與因果資料;第二行收集全部變化;第三行封存這個未來;最後一行確認沒有遺漏。

此時 A 線應該是:

世界狀態 A 線結果
聖劍 留在祭壇,艾琳未持有
守劍人 仍然活著
封印之門 仍然封閉
艾琳的陣營 保留原本身份
接下來的故事 從地下水道逃離

如果後文卻讓艾琳交出聖劍,InkWeave 會依照 A 線的事件歷史發現:她從未取得這件物品。

接下來要讓 B 線也從同一個選擇點出生,而不是從 A 線的未來繼續分岔。

先保持 InkWeave 關閉,確認 A 線的 git status --short 沒有輸出,再回到 main

Terminal window
git switch main

這時的 main 仍停在「艾琳尚未回答」的共同岔路口,因為剛才拒絕拔劍的內容只提交在 A 線。

現在從這裡建立 B 線:

Terminal window
git switch -c what-if-take-the-crown
git branch --show-current

第一行建立並切換到「接受王冠」宇宙;第二行應該顯示 what-if-take-the-crown。確認後重新開啟 InkWeave,寫下另一個答案:

艾琳沒有碰聖劍。她轉身面向敵國使者,接受黑冠,以新任女王的身份命令封印之門保持關閉。

在這個版本裡,聖劍仍留在祭壇,守劍人也可以活著;但艾琳取得了敵國王冠,並加入或領導新的陣營。請在 InkWeave 放入與正文一致的物品與陣營事件。

完成一段 B 線後,關閉 InkWeave 並輸入:

Terminal window
git status --short
git add -A
git commit -m "B線:艾琳接受敵國王冠"
git status --short

此時 B 線應該是:

世界狀態 B 線結果
聖劍 留在祭壇,艾琳未持有
守劍人 仍然活著
封印之門 依她的命令保持封閉
艾琳的陣營 加入或領導敵國勢力
特殊物品 艾琳持有敵國王冠

如果後文仍把艾琳當成原陣營的普通成員,或讓另一人同時持有同一頂王冠,InkWeave 就會按照 B 線自己的因果事件檢查問題,而不會借用 A 線或正史的狀態。

現在 A、B 兩條平行線都已從共同選擇點建立。保持 InkWeave 關閉,確認 B 線狀態乾淨,回到正史:

Terminal window
git switch main
git branch --show-current

第二行應該顯示 main。重新開啟 InkWeave,你會再次看到選擇發生前的最後一刻:聖劍仍在祭壇,艾琳還沒有做出回答。A、B 兩條線的內容都不會出現在這裡。

接著寫下正史:

艾琳拔出聖劍。守劍人為了阻止她而死,封印之門隨劍光開啟,她也因此被逐出原本的陣營。

在 InkWeave 裡記錄與正史相符的事件:艾琳取得聖劍、守劍人死亡、封印之門改變狀態,以及艾琳離開原本陣營。Git 不會替你創造這些因果;它負責保存你在 InkWeave 為每個宇宙寫下的不同事實。

完成後關閉 InkWeave,保存正史:

Terminal window
git status --short
git add -A
git commit -m "正史:艾琳拔出聖劍"
git status --short

此時 main 應該是:

世界狀態 main 正史結果
聖劍 由艾琳持有
守劍人 已死亡
封印之門 已開啟
艾琳的陣營 已離開原本陣營
接下來的故事 帶著聖劍進入門後世界

到這裡,同一個選擇點已經真正長出三個互不覆蓋的完整宇宙。

現在來完整走一次:main → A 線 → B 線 → main。每一站都關閉 InkWeave、檢查狀態、切換,再重新開啟。

先關閉 InkWeave,輸入:

Terminal window
git status --short

沒有輸出才繼續。如果有檔案,先用 git add -Agit commit 保存正史的新變化。

接著切換:

Terminal window
git switch what-if-refuse-sword
git branch --show-current

第一行沒有 -c,因為 A 線已經存在;現在只是回去。第二行顯示 what-if-refuse-sword 後,重新開啟 InkWeave。

你應該看到艾琳拒絕拔劍的版本:守劍人活著、聖劍不在她身上、封印之門仍然關閉。如果這時移動游標或檢查故事後段,InkWeave 使用的也是 A 線自己的因果歷史。

再次關閉 InkWeave。先問 Git,A 線是否已經保存完整:

Terminal window
git status --short

確認沒有輸出後,輸入:

Terminal window
git switch what-if-take-the-crown
git branch --show-current

確認顯示 what-if-take-the-crown,再重新開啟 InkWeave。現在艾琳應該持有的是敵國王冠,而不是聖劍;她的陣營身份也應該是 B 線版本。A 線的地下水道未來不會跟過來。

關閉 InkWeave,再做最後一次檢查與切換:

Terminal window
git status --short
git switch main
git branch --show-current

只有第一行沒有輸出時,才應執行後面兩行。看到 main 後重新開啟 InkWeave,艾琳會再次持有聖劍,守劍人也會回到正史中的死亡狀態。

這不是 InkWeave 忘記或重新猜測故事,而是你真的把整本書切回了另一套完整事件歷史。

假設你回到 A 線,又寫了三章地下水道冒險。那些章節只會存在 A 線。完成後依舊是:

Terminal window
git status --short
git add -A
git commit -m "A線:艾琳抵達地下城"
git status --short

切回 main 時,正史不會突然多出地下城章節;切到 B 線時,女王艾琳也不會憑空記得 A 線的逃亡。三條故事可以各自繼續成長,不需要維持相同篇幅。

只查看目前宇宙:

Terminal window
git branch --show-current

列出全部宇宙:

Terminal window
git branch

你會看到三個分支,其中目前所在的分支前面有 *

main
what-if-refuse-sword
what-if-take-the-crown

想看它們從哪裡分開,可以輸入:

Terminal window
git log --oneline --graph --decorate --all
  • --oneline:每個存檔點只顯示一行。
  • --graph:用線條畫出三條分岔。
  • --decorate:標出 main、A 線與 B 線名稱。
  • --all:三個宇宙全部顯示。

你應該會看見「艾琳抵達封印之門」是三條線共同的祖先,之後分別通往「正史:拔出聖劍」、「A 線:拒絕拔劍」與「B 線:接受王冠」。這就是這本書目前的多重宇宙地圖。

程式碼分支常常需要合併,但故事世界線不一定需要。

「艾琳拔劍」和「艾琳拒絕拔劍」都是完整未來。把兩條線硬合在一起,反而可能讓互相排斥的章節、角色狀態與因果事件撞在一起。因此這篇只教你保存、切換並繼續各自的宇宙,不要求把它們合回 main

如果某條 What If 後來成為你最喜歡的版本,直接留在那條分支繼續寫即可。名稱不是正史,作者的選擇才是。

Git 在說:「我在這裡找不到時間線資料。」先用 pwdls 確認是否位於正確書籍資料夾;如果尚未執行過 git init -b main,回到建立正史的步驟。

Git 還不知道如何標記存檔作者。在目前書籍資料夾重新執行:

Terminal window
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 已關閉後,依序執行:

Terminal window
git status --short
git add -A
git commit -m "保存目前世界線"
git status --short

最後沒有輸出,再執行原本的 git switch

這表示同名宇宙以前已經建立過,不必再加 -c。例如:

Terminal window
git switch what-if-refuse-sword

這是在切換到既有宇宙,不是建立新的宇宙。切換前仍要先關閉 InkWeave 並確認狀態乾淨。

忘記關閉 InkWeave 就切換了?這不是死刑

Section titled “忘記關閉 InkWeave 就切換了?這不是死刑”

下面的做法不會直接把事故內容刪掉。順序是:

關閉 InkWeave → 建立 rescue 分支 → 提交事故現場 → 建立完整 Git bundle → 確認目前分支 → 最後才 reset

第一步:停止寫作並完全關閉 InkWeave

Section titled “第一步:停止寫作並完全關閉 InkWeave”

立即停止輸入,也不要繼續切換分支。現在先完全關閉 InkWeave,等待視窗消失。

關閉時可能再觸發一次自動儲存,但不用恐慌。我們接下來會把關閉後留下的所有變化收進一條獨立救援分支,而不是直接刪除。

第二步:記下目前站在哪個分支

Section titled “第二步:記下目前站在哪個分支”

確認 InkWeave 已關閉後,輸入:

Terminal window
git branch --show-current
git status --short

第一行告訴你事故發生後目前站在哪個宇宙,請把名稱記下來。假設顯示 what-if-take-the-crown,代表 B 線是這次被舊內容寫入的分支。

第二行列出事故留下的檔案:

  • 如果完全沒有輸出,代表 InkWeave 很可能沒有把舊內容寫入硬碟。你可以依正常流程切回想去的分支,不需要 reset。
  • 如果看見 M?? 或其他檔案,繼續下面的救援流程。

第三步:把事故現場封進 rescue 分支

Section titled “第三步:把事故現場封進 rescue 分支”

輸入:

Terminal window
git switch -c rescue-forgot-to-close
git add -A
git commit -m "緊急救援:切換分支時 InkWeave 尚未關閉"
git status --short

這四行分別代表:

  1. git switch -c rescue-forgot-to-close:從事故現場建立一條救援分支。原本的 main、A 線與 B 線分支指標都不會移動。
  2. git add -A:把修改、新增與刪除的檔案全部放進救援箱,包括可能由自動儲存產生的新檔案。
  3. git commit:把事故現場正式封存。稍後使用 reset 時,這些內容已經有地方可回頭找。
  4. 最後的 git status --short:應該沒有輸出,代表救援現場已完整保存。

如果 Git 說 rescue-forgot-to-close 已存在,請改用新名稱,例如:

Terminal window
git switch -c rescue-forgot-to-close-2

後續指令也要使用你實際建立的 rescue 分支名稱。

第四步:把所有宇宙封成一個 Git bundle

Section titled “第四步:把所有宇宙封成一個 Git bundle”

一般檔案備份可能看不見隱藏的 .git。為了確保 main、A 線、B 線、rescue 分支與所有 commit 都被保存,建立 Git 自己的完整救援檔:

Terminal window
git bundle create "../InkWeave-multiverse-rescue.bundle" --all
git bundle verify "../InkWeave-multiverse-rescue.bundle"

第一行會在這本書的上一層建立 InkWeave-multiverse-rescue.bundle

  • bundle create:把 Git 歷史封裝成一個檔案。
  • ../:把救援檔放在書籍資料夾外面,避免後面的分支切換影響它。
  • --all:收進所有分支與所有可到達的 commit,不只目前分支。

第二行會驗證救援檔。看到類似下面的訊息,才代表可以繼續:

InkWeave-multiverse-rescue.bundle is okay
The bundle records a complete history.

這個 .bundle 不依賴原專案裡隱藏的 .git;即使日後整個 repository 需要重建,它仍包含這次封存的多重宇宙歷史。

如果同名 bundle 已經存在,請先保留舊檔,並在新名稱後加數字,例如 InkWeave-multiverse-rescue-2.bundle

第五步:回到被混入內容的分支,再使用 reset

Section titled “第五步:回到被混入內容的分支,再使用 reset”

先回想第二步記下的分支。以下假設事故發生後站在 B 線 what-if-take-the-crown;如果你記下的是其他名稱,必須替換成自己的分支。

Terminal window
git switch what-if-take-the-crown
git branch --show-current
git reset --hard HEAD
git status --short

逐行理解:

  1. git switch what-if-take-the-crown:離開事故保險箱,回到真正的 B 線。
  2. git branch --show-current:必須顯示你準備修復的分支。名稱不對就停下來。
  3. git reset --hard HEAD:把 B 線的工作檔案恢復成 B 線最後一個正式 commit。HEAD 只代表目前分支的最新存檔點,不會刪除其他宇宙。
  4. git status --short:應該沒有輸出,表示 B 線已恢復乾淨。

這時 main、A 線與 B 線原本的 commit 都沒有被改寫;只是 B 線工作目錄裡意外混入的未提交內容被清掉了。

第六步:確認所有宇宙仍然存在

Section titled “第六步:確認所有宇宙仍然存在”
Terminal window
git branch
git log --oneline --graph --decorate --all

你應該仍能看到:

main
rescue-forgot-to-close
what-if-refuse-sword
what-if-take-the-crown

rescue-forgot-to-close 是新增的保險箱;其他三個宇宙仍在原本的 commit。現在才可以重新開啟 InkWeave,檢查目前分支是否恢復正確。

第七步:如果 rescue 裡有尚未提交的重要文字

Section titled “第七步:如果 rescue 裡有尚未提交的重要文字”

如果事故發生前,你在原本宇宙還寫了尚未 commit 的段落,那些文字可能只存在 rescue 分支。不要 merge 整條 rescue,因為它可能是兩個宇宙的混合物。

最安全的做法是人工取回文字:

  1. 關閉 InkWeave,切到 rescue 分支。
Terminal window
git switch rescue-forgot-to-close
  1. 重新開啟 InkWeave,只尋找並複製需要救回的段落,把文字暫存到專案外的純文字檔或筆記軟體。不要在 rescue 裡繼續創作。
  2. 再次關閉 InkWeave。如果開啟與關閉造成新變化,先把 rescue 狀態再保存一次:
Terminal window
git status --short
git add -A
git commit -m "緊急救援:保存檢視後狀態"
git status --short
  1. 切回那些文字原本所屬的正式分支。以下假設原本是 A 線:
Terminal window
git switch what-if-refuse-sword
git branch --show-current
git reset --hard HEAD
  1. 確認顯示 what-if-refuse-sword 後,重新開啟 InkWeave,把剛才救出的文字貼回正確章節。完成後關閉 InkWeave,再建立正常 commit:
Terminal window
git status --short
git add -A
git commit -m "A線:取回事故前尚未提交的文字"
git status --short

這樣取回的是作者真正需要的文字,不會把 rescue 裡可能混雜的索引、快照、卡片與另一個宇宙一起 merge 進來。

請先保留 rescue 分支與 .bundle,直到你分別開啟 main、A 線與 B 線確認內容都正確。不要急著刪除這兩層保險。

Git 不會替你寫故事,也不懂艾琳為什麼拔劍。它做的是替每一個選擇保存一扇可以再次打開的門。

InkWeave 則負責門後面的世界:誰持有聖劍、誰仍然活著、哪個地點已毀滅、角色屬於哪個陣營,以及這些結果是否符合各自的因果歷史。

只要始終遵守下面的順序,你就能在正史與 What If 之間安全旅行:

關閉 InkWeave → 檢查並提交 → 切換分支 → 重新開啟 InkWeave