哪个git命令会修改工作目录中的文件而不检查?

时间:2016-04-09 06:43:24

标签: git

某些git命令很危险,因为它们会破坏数据而不可能恢复。 Pro Git将它们命名为“WD unsafe命令。”我知道两个WD不安全命令:

reset --hard [commit]
checkout (commit) [file]

是否有所有WD不安全命令的明确列表?实际上,我想避免出现这样的情况,即我无法弄清楚将要进行哪些更改以及哪些未跟踪的文件可能会受到影响。

2 个答案:

答案 0 :(得分:2)

首先,您需要定期备份您的git存储库(实际上,任何重要数据 - 特别是您的源代码 - 应该备份;硬件失败,人们犯错误)。一种流行的方法可能是git push --all到某些外部存储库,例如在github

但是如果你训练自己 - 而且你真的应该经常git commitgit push(例如通常在最多每小时开发之后,或者在修复单身错误或添加功能),您几乎不会丢失太多数据。在任何提交之后,您将始终能够回到任何状态(这是git的最强大功能)。因此,在最糟糕的情况下,在最后一次提交(& push)之后你会失去一切,这并不是什么大问题,因为你经常习惯git commit(& git push)。

如果您没有网络连接,仍然经常git commit,但在网络中git push进入远程存储库 - 用于备份(至少每天一次)。

确实,git checkout会覆盖任何未提交的文件(请注意术语:对于颠覆,svn checkout没有做类似的事情:svn checkout& {{1} }命令看起来很相似,但却非常不同。)

重要的是 git checkout (和git commit经常(这是您的责任 )。当然使用git branches。

经常使用git push命令。要小心关于git status中您忽略的文件(您应该使用.gitignore管理)。偶尔(可能每周一次,当然在任何重要的软件发布之前),考虑git - 你的存储库(在一些新的目录中)并在克隆的存储库中构建你的软件,以确保所需的一切都在那里

  

我想知道那些在意外丢失任何重要事情之前。

因此,如果您git clone(& git commit经常,您就不会丢失任何重要数据。至多你会失去自上次push以来所做的一切。没有大碍。当然你应该从不触摸"手动"用于git存储库的git commit隐藏目录。您应该每天.git/到某个远程存储库,特别是为了避免在您的硬件损坏时丢失工作(例如,如果您丢失或烧毁或者您的笔记本电脑被盗)。

不要期望软件系统 时决定git push。这是你的责任,你应该经常这样做(但在适当的时候)。关于git commit的好处是git非常便宜且快速。所以你应该经常使用它。

答案 1 :(得分:2)

虽然您询问了“WD不安全命令”,但您的问题意味着担心一般会失去工作。对于Basile的回答,我想补充说有一类“commit unsafe”命令。也就是说,删除提交的命令。如果删除这些提交,世界上所有提交都不会保存您。推送可能,但是那时你将有非常有趣的时间尝试协调与备份遥控器的冲突。

我的头顶两个:

git commit --amend
git rebase  # And pretty much any argument or subcommand to it.

那就是说,这两个命令非常有用。尽管git commit --amend在技术上删除了您的最新提交,但它会将整个补丁集(包括您最近的暂存集)应用于新的补丁集。换句话说,它保留了这段历史:

$ git log --oneline
c5526a4 One Single Change

从此成为:

$ git log --oneline
5563dba ...And Another Part
c5526a4 Crap, Forgot a Part
a5c809b One Single Change

Rebasing有很多用途,比如一周之后将上述3次提交转换为单次提交。但是,在日常提交和推动时,要做到这一切有很多意义。见this really good answer。 Rebasing允许您完全删除提交而不将其压缩到另一个提交中,因此它肯定是更不可能的不安全命令之一。

在提交已从所有引用(包括reflog)中消失后,您可能还会找到一种使用git gc的方法,但我不得不说我对此处的内部工作没有信心。