跳转到内容

如何利用 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 前,先把这本书的整个项目文件夹复制到移动硬盘、U 盘、云盘或另一个安全位置。

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. 按回车,再打开自己的书籍文件夹。

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. 按回车,再打开自己的书籍文件夹。

%APPDATA% 会自动换成当前 Windows 用户的 AppData\Roaming 路径。不要前往 Program Files、InkWeave 安装文件夹或桌面快捷方式;那些地方没有你的写作项目。

本节的命令只会安装 Git 或显示版本,不会进入或修改 InkWeave 项目,因此完成这一节时可以暂时让 InkWeave 保持打开。

按下 Command + 空格键 打开 Spotlight,输入“终端”或 Terminal,再按回车。也可以从 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,再输入一个空格,先不要按回车。
  3. 把刚才找到的书籍文件夹从 Finder 拖进终端。
  4. 终端会自动填入完整路径。按回车。

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