我有一个项目,我运行了git init
。
在几次提交后,我做了git status
,它告诉我所有的东西都是最新的,没有本地的变化。
然后我连续做了几个改动,发现我想把所有东西都扔掉,回到原来的状态。这个命令能帮我做到吗?
git reset --hard HEAD
如果你想恢复对你的工作副本所做的修改,请这样做。
git checkout .
如果你想恢复对索引所做的修改(也就是你自己添加的),请这么做。警告:这将重置您所有未推送的提交到master!。
git reset
如果你想恢复你已经提交的修改,请这样做。
git revert <commit 1> <commit 2>
如果您想删除未跟踪的文件(如新文件、生成的文件)。
git clean -f
或未被追踪的目录(如新的或自动生成的目录)。
git clean -fd
注意:你可能还想运行
git clean -fd
作为
git reset --hard
不会*删除未被追踪的文件,而git-clean会删除被追踪的根目录中不在git追踪之下的任何文件。警告--对此要小心!先用git-clean进行一次试运行,看看它会删除什么,这很有帮助。
当你收到错误信息时,这也特别有用
~"performing this command will cause an un-tracked file to be overwritten"
这可能发生在做几件事情的时候,其中之一是当你和你的朋友都添加了一个同名的新文件,但他先提交到了源码控制中,而你又不在乎删除你的未跟踪副本时,就会更新一个工作副本。
在这种情况下,做一次模拟运行也将有助于向你展示一个将被覆盖的文件列表。
看看git-reflog。 它将列出它记住的所有状态(默认是30天),你可以简单地检查出你想要的状态。 比如说。
$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d