回答
这里有两种“破坏性的” - 对你的git历史和命令的破坏性的命令,可以放弃工作副本中的更改。
命令是放弃工作树改变:
git reset
git checkout
正如其他人所提到的,引用日志和事实Git对象,切勿立即的组合被丢弃(除非你打开自动清理)意味着你通常可以撤销像git reset/rebase/merge
这样的操作。
这些命令,虽然,实际上丢弃GIT中对象,消除撤消能力:
git gc
(默认情况下,该修剪是至少2周老不可获得的对象)
在我看来,破坏性最大的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
根据http://blog.reverberate.org/2009/07/30/gits-needs-a-new-interface/
$ git checkout foo.c
...将覆盖您可能需要foo.c的任何本地修改,而不问。
确实如此 - 它比我想象的更具破坏性。我只是做了一个'git checkout 6bb33a8。'希望得到那个提交中改变的那个文件,但是它也消除了我对其他文件的阶段性更改,用它们中的内容替换它们。我认为它可能会在reflog中保留一些东西来保护我,但没有这样的运气。 – 2016-04-12 18:41:54
使用git reset
命令可能会丢失未提交的更改。如果您的更改已提交,则在受到清除gc
清除之前,您将受到reflog多天的保护。
例如,如果你checkout
,rebase
,reset
,或merge
所有引进的变化,你可以回到以前的通过运行reflog
命令,并使用reset
重置你的头一个老犯犯。
当你回答下面的问题时,请记住解释命令的作用! – 2010-04-28 14:51:51