什么会导致git中的数据丢失?

什么会导致git中的数据丢失?,git,Git,我不想在git上手足无措,我想像他们在FaceBook上说的那样“快速行动,打破现状”。事实上,我认为这几乎就是版本控制的全部要点。我真的需要注意什么 我猜git-rm,尤其是-r可能很危险 分支时,什么会导致覆盖呢?git-rm没有那么危险,因为您可以在以后从以前的提交中检索文件 一般来说,注意-f选项:它迫使Git做它不想做的事情。(例如:branch-f或push-f)我学习git最大的一点就是尽早提交并经常提交。如果您有版本控制中更改的日志,那么有一种方法可以在您出错时恢复它。在过去的一

我不想在git上手足无措,我想像他们在FaceBook上说的那样“快速行动,打破现状”。事实上,我认为这几乎就是版本控制的全部要点。我真的需要注意什么

我猜git-rm,尤其是-r可能很危险


分支时,什么会导致覆盖呢?

git-rm
没有那么危险,因为您可以在以后从以前的提交中检索文件


一般来说,注意
-f
选项:它迫使Git做它不想做的事情。(例如:
branch-f
push-f

我学习git最大的一点就是尽早提交并经常提交。如果您有版本控制中更改的日志,那么有一种方法可以在您出错时恢复它。在过去的一年中,我曾多次认为自己丢失了数据,但通过堆栈溢出进行搜索教会了我一些巧妙的技巧。将数据托管在远程服务器(如GitHub或BitBucket)上,这样,如果完全破坏了回购协议,它仍然存在。如果您执行一个
git分支-D
并删除一个分支,那么该分支上的所有提交都将从回购中清除

我唯一能真正提醒你的是,如果你不知道自己在做什么,就永远不要重写历史。可以做到这一点的是和。除非您知道自己在做什么,否则不要执行git push-f,因为这将强制覆盖本地repo的所有提交。如果您在本地更改了分支机构历史记录,或者其他人对回购协议作出了贡献,这可能会导致重大问题

@米格尔也提出了一个很好的观点:如果你删除了一个git尚未跟踪/提交的文件,你将无法恢复它


另外,不要害怕使用
git reset
git rebase
,它们只需要正确使用即可。例如,我有时使用git reset将我的工作树重置为最新提交(撤消所有更改的文件),使用
git reset--hard HEAD
,或者在保持我的工作树
git reset--soft HEAD^
的同时撤消上一次提交消息。Git rebase也有助于压缩/重写历史记录中的多个提交。请注意,这些can方法可能会导致数据丢失,如果您已经推动远程回购,则不应该这样做(从那时起,您将需要执行一次git push-f

以上任何操作。在git中造成数据丢失非常困难。当您删除git尚未跟踪的文件时,数据丢失会发生在git之外。任何感知到的“数据丢失”在Git中发生的事件是可恢复的,前提是您在垃圾收集发生之前尝试恢复,这需要几周的时间


频繁地、小步地提交您的更改。不要担心生成好的提交消息或漂亮的文档;无论如何,在合并功能分支之前,您会将所有这些内容压下来。在您提交工作之前,这些工作都有丢失的危险。

正如meagar所说的
git rm
是在新提交中记录的删除,所以它是可回收的,可以毫无恐惧地使用

git reset--hard
可能特别有害,因为它会将“当前提交”(
HEAD
,用git术语)重置为另一个。因此,如果分支或标记中没有引用前一个HEAD,它实际上会丢失(至少没有向导)。它还会导致未提交的更改丢失

删除分支和标记也是如此:这会导致从存储库中清除一行提交。在这些情况下,如果提交隐藏在存储库中,您可以恢复它们,但这是技术性的,而且不太容易,因此您最好知道自己在做什么

与其他任何数据宝贵(源代码也很宝贵)的情况一样,最好有一个存储库镜像,并定期推送到它。它可以是另一个本地存储库、私有GitHub repo,也可以只是使用当前备份系统对存储库进行备份。这样,您就可以随时恢复数据


正如其他人在这里所说的,要注意那些确实很重要的未跟踪文件。未跟踪/忽略的文件应该只是从版本控制下的文件生成的文件:可执行文件等等。

作为一个方便的提示,如果你认为你已经删除了分支、带注释的标记或重置为较早的提交,那么你没有丢失它们,你的本地文件ges都被记录下来,您可以使用
git reflog
查看它们

看看它,看看它记录了什么,这很有趣


它列出了可用于将分支恢复到该状态的提交SHA。

一般来说,在git中很难造成数据丢失。git几乎从未真正删除已签入存储库的任何内容,即使在运行从历史记录中删除提交或删除分支的命令时也是如此

您唯一需要担心的是删除未签入git的文件的命令。一般来说,git将需要这些命令的
--force
-f
)或
--hard
标志

下面是潜在危险命令的快速列表,以及使用这些命令时要注意的事项:

可以永久删除未提交到git的数据:

  • git rm-f
    -可以删除您尚未签入的文件
  • git reset--hard
    -将删除尚未签入git的更改
  • git clean-f
    -将删除git未跟踪的文件
  • git签出/path/to/file
    -可以还原未签入git的更改
  • git签出-f
    -可以覆盖未签入git的更改
  • rm-rf.git
    -不要删除您的
    .git
    目录!这是存储所有本地历史记录的地方
可以删除远程存储库中的数据(可逆,但