learn-git-the-super-hard-way
  • 基础知识
  • 第0章:创建工作环境
  • 第1章:直接操纵对象
  • 第2章:直接操纵引用
  • 第3章:直接操纵索引
  • 第4章:直接操纵HEAD
  • 第5章:直接操纵远程
  • 第6章:直接操纵merge
  • 第7章:直接操纵commit
  • 第8章:检索与查看历史
  • 第9章:邪恶的submodule
  • 第10章:批处理与自动化
  • 第11章:配置和alias
  • 第12章:单repo多分支工作流
  • 第13章:GPG签名
  • 第14章:数据的导入和导出
  • 第15章:数据抢修与急救
  • 总结/cheatsheet
  • 索引/Roadmap
由 GitBook 提供支持
在本页
  • 基础知识
  • 可能引起数据丢失的误操作
  • 严重误操作
  • 引用误操作
  • worktree的误操作
  • index的误操作
  • index和worktree同时误操作

这有帮助吗?

第15章:数据抢修与急救

上一页第14章:数据的导入和导出下一页总结/cheatsheet

最后更新于4年前

这有帮助吗?

基础知识

误操作可能引起数据丢失或者软件版本错误。 Git有许多机制可以最小化误操作引起的实际损失。 而灵活运用各种Git命令也可以修正各种错误。

可能引起数据丢失的误操作

严重误操作

  • 误删整个repo(rm -rf .git)

    • 立即备份worktree,避免进一步损失

    • 如果所有分支都已push到远端,可以考虑再fetch回来

    • 如果有的commit尚未push,请参考

  • 误删整个worktree,但是repo还在

    • 对于存在在index中的文件,git restore --worktree

    • 对于尚未git add的部分,请参考

  • 误删整个repo和整个worktree

    • 参考以上两条

引用误操作

  • 在HEAD是直接引用时执行了git switch

    • 查看误操作命令的输出,其中包含了HEAD曾经指向的SHA1

    • git reflog

  • 误操作git reset --soft

    • git reflog

  • 误操作git branch|tag -f

    • git reflog

  • 误操作git branch|tag -d|-D

    • 查看误操作命令的输出,其中包含了该引用曾经指向的SHA1

    • 可以尝试git fsck,列出所有没有被任何引用/对象所使用的对象的SHA1,然后逐一检查

  • 误操作git rebase

    • 若rebase还在进行,立刻git rebase --abort

    • git reflog

worktree的误操作

  • 误操作rm -rf了worktree的文件

    • 对于普通文件/文件夹,git restore --worktree

    • 对于submodule,git submodule update

  • 误操作git clean了worktree的文件

  • 误操作git restore --worktree

    • 这是最危险的情况之一,唯一的希望是编辑器的缓存。在编辑器里面看一看相应的文件是否从硬盘上重新读取了;如果有,尝试撤销再保存;如果没有,尝试保存。

index的误操作

  • 误操作git add覆盖了index中的记录

    • 一般来说index中的记录的对象都应该在repo中存在,故git fsck列出所有blob然后再逐一检查即可

    • 然而真正操作起来相当复杂且繁琐,需谨慎

  • 误操作git rm --cached删除的index中的记录

    • 如果worktree中的文件还在且内容正确,再次git add即可

    • 同之前关于误操作git add的讨论

  • 误操作git reset [--mixed]

    • 你可能需要git reflog找回HEAD

    • 同之前关于误操作git add的讨论

  • 误操作git restore --staged或者git read-tree

    • 同之前关于误操作git add的讨论

index和worktree同时误操作

思路是完全一致的:优先解决worktree的问题,然后再找回index。

  • 误操作git rm -rf

  • 误操作git reset --hard

  • 误操作git restore --staged --worktree

  • 误操作git switch -f

亦可参考,但不推荐

如果尚未git add,请参考;否则:

请参考

File recovery
File recovery
File recovery
File recovery
File recovery