git clone 无法恢复本地未提交修改,因 bare 仓库仅存 git 对象无工作区,non-bare 仓库才含工作文件;未提交更改从未进入对象库,只能靠文件级备份。

git clone 无法恢复本地修改,必须区分 bare 与 non-bare 仓库
裸仓库(--bare)只存 Git 内部对象,没有工作区,适合备份;普通仓库带 .git 和工作文件,直接 git clone 出来的是普通仓库,不会还原你上次没提交的修改。备份时若用 git clone --bare,恢复时不能直接当工作仓库用——它根本没 HEAD、没分支检出状态。
实操建议:
CNB 云原生构建平台的 Git 操作技能,支持代码克隆、提交、推送、分支管理、Merge Request 管理、流水线触发与结果读取。初次使用需收集用户的 Git 用户名和邮箱。
- 备份命令必须用
git clone --bare <source><backup.git></backup.git></source>,生成纯.git结构目录(如myrepo.git) - 恢复为可编辑仓库:先
git clone <backup.git><new-workdir></new-workdir></backup.git>,再进<new-workdir></new-workdir>检查git status和git log - 若原仓库有未提交更改,它们从未进入 Git 对象库,
clone --bare不会捕获——这类内容只能靠文件级备份(如rsync或压缩整个目录)
git bundle 是单文件备份,适合离线/邮件/USB 场景
git bundle 把整个仓库历史打包成一个二进制文件,不依赖网络协议,也不需要服务端支持。它比 tar .git 更安全:能校验完整性,且可增量更新;但不包含未跟踪文件(untracked)和忽略文件(.gitignore 以外的配置)。
实操建议:
- 全量备份:
git bundle create repo.bundle --all - 验证是否可用:
git bundle list-heads repo.bundle(应列出所有分支) - 恢复时先建空目录,运行
git init && git pull ../repo.bundle --all - 增量更新:记录上次打包的 commit(如
git rev-parse HEAD),下次用git bundle create repo.bundle HEAD ^<last-commit-hash></last-commit-hash>
git push --mirror 备份远程分支、标签、甚至被 force-push 覆盖的历史
git push --mirror 会把本地所有引用(refs/*)同步到目标仓库,包括 refs/remotes/*、refs/tags/*、甚至 refs/stash(如果存在)。它本质是“强制重写远端引用”,因此目标仓库必须是裸仓库,且需提前配置 receive.denyDeletes true 防误删——否则别人 git push --mirror 可能清空你的备份。
实操建议:
- 目标仓库初始化:
git init --bare backup.git && cd backup.git && git config receive.denyDeletes true - 推送备份:
git push --mirror /path/to/backup.git - 恢复全部引用:
git clone /path/to/backup.git后,git branch -r应显示所有原始远程分支 - 注意:
--mirror会删除目标仓库中源仓库没有的引用,慎用于共享备份位置
忽略文件、钩子、权限位不会被 Git 自动备份
Git 只跟踪文件内容与基本元数据(如 symlink 标记),不保存:.gitignore 以外的忽略规则(如 $GIT_DIR/info/exclude)、hooks/ 目录下的脚本、文件执行权限(除非是 symlink 或 submodule)、以及任何未 git add 的本地配置(如 .git/config 中的 remote URL)。
实操建议:
- 备份前手动归档:
cp -r .git/hooks/ backup-hooks/、cp .git/info/exclude backup-exclude - 权限问题:Linux/macOS 下用
git config core.filemode true才能跟踪可执行位;Windows 默认关闭,恢复后可能需git update-index --chmod=+x <file></file> - 敏感配置(如凭证 helper、push default)不在对象库中,不要假设
clone后自动生效










