2010-04-28 44 views
10

我读到Git主要添加了有关存储库历史记录的信息,试图记住所做的每个更改,但也有一些命令会做出不可逆转的更改。git中的破坏性命令是什么?

我应该真正注意哪些命令,避免错误使用,因为没有回头路可走?

+0

当你回答下面的问题时,请记住解释命令的作用! – 2010-04-28 14:51:51

回答

9

这里有两种“破坏性的” - 对你的git历史和命令的破坏性的命令,可以放弃工作副本中的更改。

命令是放弃工作树改变

  1. git reset
  2. git checkout

正如其他人所提到的,引用日志和事实Git对象,切勿立即的组合被丢弃(除非你打开自动清理)意味着你通常可以撤销像git reset/rebase/merge这样的操作。

这些命令,虽然,实际上丢弃GIT中对象,消除撤消能力:

  1. git gc(默认情况下,该修剪是至少2周老不可获得的对象)
+1

在我看来,破坏性最大的git命令就是那些丢弃工作树的命令。使用'git stash'进行“备份”应该总是安全的;混帐藏匿流行'。您可以稍后(直到您的gc修剪限制)通过以下命令恢复“丢失”版本:gitk --all -n 5000 --all $(git fsck | awk'/ dangling commit/{print $ 3}'; git log -g --pretty ='format:%H')[这会打开gitk前端,最多包含5000次提交,包括所有“丢失”提交]。 – 2011-09-06 07:26:31

2

的git的复位 - 硬不能撤消

+0

是真的,没有提交时 – Lauri 2010-04-28 10:03:11

7

根据http://blog.reverberate.org/2009/07/30/gits-needs-a-new-interface/

$ git checkout foo.c 

...将覆盖您可能需要foo.c的任何本地修改,而不问。

+1

确实如此 - 它比我想象的更具破坏性。我只是做了一个'git checkout 6bb33a8。'希望得到那个提交中改变的那个文件,但是它也消除了我对其他文件的阶段性更改,用它们中的内容替换它们。我认为它可能会在reflog中保留一些东西来保护我,但没有这样的运气。 – 2016-04-12 18:41:54

3

使用git reset命令可能会丢失未提交的更改。如果您的更改已提交,则在受到清除gc清除之前,您将受到reflog多天的保护。

例如,如果你checkoutrebasereset,或merge所有引进的变化,你可以回到以前的通过运行reflog命令,并使用reset重置你的头一个老犯犯。