我用 Git 来管理自己的全部笔记已经有将近七八年的时间了。

最初开始只是为了版本管理,告别日期或者版本号的文件名,可以回溯任意时间的文件。之后陆续开发了不少用法,也数次救我于水火之中。

首先说说版本管理。

Git 通过记录每一次修改的内容来记录版本,这也就意味着每次修改不需要保存一份全新的文件,可以任意回溯的同时,备份文件的体积也不大。于是保存版本这件事情本身就几乎没什么成本。

我在编辑器中设置了快捷键,没事就按一下保存一个版本。

一些软件在操作文件时如果奔溃,会直接清空文件内容,将文件所有字节置0无任何可能找回。如果之前没有备份那就是地狱级别的灾难,尤其是如果 bib 文件中累积了几千条参考文献的话。如果此时有 Git,那只需要简单的撤销更改即可。

通过几年的实践,我目前采取的思路是将所有的项目都放到统一的文件夹下,结构大致如下:

1
2
3
4
5
6
paper
|- .git
|- bibFiles
|- templates
|- project1
|- ...

.git 是 Git 自己的文件不用管。

bibFiles 保存着所有的参考文献,我是用 JabRef 进行管理的。一个人一辈子看不了几万篇文章,完全可以保存一个大文件,之后每篇文章直接引用此处的bib文件即可。

templates 是我自己写的模版文件,同样可以保证我的每篇文章直接引用此处的模版,防止繁琐的配置。

project1 就是每一篇文章的文件夹。

我除了本地保存着 Git 仓库以外,还上传了一份在 GitHub 上,在 VSCode 上按个按钮同步即可。同时本地的仓库文件在 iCloud 中自动备份,并且每个月还进行一次冷备份,防止在线服务抽风。整套数据做到了双云端双本地,非常安全。

Git 还有一些有趣的用法,比如查看自己当前项目花了多少时间来做等。

列出当前文件的所有提交

1
git log --pretty=format:"%h %ad %s" --date=short project1

这里的 %h 是提交的简短哈希,%ad 是提交日期,%s 是提交信息。–date=short 将日期格式化为简短的形式(如 YYYY-MM-DD)。

该命令可以展示何时对文件夹 project1 做了哪些修改,就知道自己有没有偷懒啦。

整套系统目前的缺点就是搜索功能不够完善,但对于纯文本构成的数据集,搜索总是可以很高效的。

比较当前文件与历史提交的差异

1
git difftool <commit-hash> <file-path>

即可查看 commit-hash 处与当前的差异.

但是 VSCode 通过命令行启动有一些Bug, 可以使用自带的源代码管理图形化界面查看. 只需要在 Git Graph 中找到想要比较的提交的文件, 右键选择 View Diff with Working File 即可.