如何为假想敌写作留痕

利用 dev branch 记录文章每次修改,main branch 发布文章

主要思路

因为一直没搞懂为什么草稿或者隐藏的文章还是会被 hugo (或者 vercel?) 编译,要么出现在首页,要么出现在 “上/下一篇” 中 (这个可能和我自己设置的链接逻辑有关),所以不能在存文博客的 main branch 来记录每一次修改。如果直接单独再开一个库来记录修改过程等有点夸张。我能想到的最佳方式就是日常修改保存在 dev branch,当文章修改到可以发布时,再合并到 main。这样会产生一个问题,我不会一次只修改一篇文章,所以直接简单粗暴合并 branch 还是会导致一开始文章显示混乱的问题。
解决这个问题主要有两个方法:cherry-pick 或从 dev 拷贝文件到 main
简单来讲就是不要把 “写作过程” 暴露给部署分支 main

cherry-pick

创建 dev 之后,在 dev 上修改文章,且保证每次 add + commit 只添加一个文件的改动。即:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# dev branch
# 修改 a → a1
git add a.md
git commit -m "update a"

# 修改 b → b1
git add b.md
git commit -m "update b"

# 继续修改 a → a2(还没写完)
git add a.md
git commit -m "wip a"

# 完成 b → b2(最终版本)
git add b.md
git commit -m "finish b"

# 转至 main branch
git checkout main
git cherry-pick <commit4>

这种方法有一个缺点是必须保证每次 commit 都是干净的,都只有一个文件的改动。而在一开始我提到我可能会同时开多篇内容,我不想每次写完之后还要一个一个 commit。

ChatGPT 批注:cherry-pick 的前提是被选中的 commit 必须是“自洽的”,即它的改动可以独立应用而不会依赖其他 commit。最简单的方式是每次 commit 只修改一个文件。

dev 拷贝文件到 main

核心命令:

1
2
3
4
5
6
7
git checkout main
git checkout dev -- path/to/example.md # 用 dev 分支里的 example.md 文件,直接覆盖到当前 main 中
# 或
git restore --source dev path/to/example.md
git add content/posts/example.md
git commit -m "publish: post example"
git push

这个方法简单粗暴,直接把完成的文件拷贝到 main,本质是告诉 git 只要这个文件现在的版本。绕过了那些 commit 限制,在 dev 的操作就可以随意很多,同时 commit 多个文件的修改也没关系。但有一个问题是这个操作会直接覆盖 main 中的重名文件,所以在覆盖之前要注意。如果 main 分支当前有未提交的修改,需要先 commit 或 stash,否则可能无法执行该操作。