Git 能当作备份工具用吗
Git 是版本控制工具而非备份工具:适合代码和文本文件的版本历史,不擅长二进制文件、大文件和长期归档,也不能替代异地容灾。代码"备份"请推到远程仓库,真正的数据备份用专业方案(rsync、快照、备份软件)。
能起一部分作用,但不能当正经备份方案。 Git 擅长的是代码与文本文件的版本历史管理;它不是为数据备份设计的:二进制文件会让仓库膨胀、没有异地容灾的自动化、误删仓库就全没、也不处理打开中的文件和数据库一致性。正确姿势:代码靠"推送到远程仓库"冗余,数据备份靠专业工具。
Git 做不了的备份场景
| 场景 | 为什么 Git 不合适 |
|---|---|
| 数据库备份 | 直接提交数据文件会损坏一致性;应导出 dump 或做物理备份 |
| 二进制/大文件 | 大体积或不可有效差分的数据可能使仓库快速膨胀;Git 的打包压缩并不保证消除这种成本 |
| 系统配置/整盘 | 无权限位、属主、ACL 的完整保留(部分支持但不可靠) |
| 长期归档 | 仓库持续膨胀,无保留策略与轮转机制 |
| 灾难恢复 | 本地仓库随机器一起挂;远程仓库也可能误删 |
Git 能做到的"备份"
把仓库推到至少一个远程(GitHub/GitLab/自建 Gitea),代码就有了异地副本:
git remote add backup git@your-server:repo.git
git push backup --all
git push backup --tags
多个 remote 或定期 git clone --mirror 到另一台机器,对"代码不丢"这个目标基本够用了。
各归其位的方案
- 代码:git push 到远程 + mirror 克隆;
- 文件数据:rsync/rclone 定期同步 + 版本化对象存储;
- 数据库:定时 dump + WAL 归档(PostgreSQL 的 PITR);
- 整机和云盘:快照(EBS Snapshot、云厂商快照策略)。
常见问题(FAQ)
Q:git bundle 算备份吗?
git bundle create repo.bundle --all 能把整个仓库打成单文件,适合离线传输和冷归档,算是 Git 体系内最像"备份"的功能。但仍只覆盖仓库内容。
Q:把重要文档放 Git 里管理行不行?
行——文本类(Markdown、配置、脚本)非常适合。这就是版本控制的本职。但请记得推送到远程,否则硬盘挂了照样全丢。
Q:服务器上的 Git 仓库本身怎么备份?
最简单:另一台机器定时 git clone --mirror 拉全量镜像;或者直接对仓库目录做文件级备份(仓库是纯文件结构,冷备一致性好)。