如何利用 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 前,先把这本书的整个项目文件夹复制到移动硬盘、U 盘、云盘或另一个安全位置。
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- 按回车,再打开自己的书籍文件夹。
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- 按回车,再打开自己的书籍文件夹。
%APPDATA% 会自动换成当前 Windows 用户的 AppData\Roaming 路径。不要前往 Program Files、InkWeave 安装文件夹或桌面快捷方式;那些地方没有你的写作项目。
3. 安装并确认 Git
Section titled “3. 安装并确认 Git”本节的命令只会安装 Git 或显示版本,不会进入或修改 InkWeave 项目,因此完成这一节时可以暂时让 InkWeave 保持打开。
1. 打开终端
Section titled “1. 打开终端”按下 Command + 空格键 打开 Spotlight,输入“终端”或 Terminal,再按回车。也可以从 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,再输入一个空格,先不要按回车。 - 把刚才找到的书籍文件夹从 Finder 拖进终端。
- 终端会自动填入完整路径。按回车。
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