假设您已经正确描述了问题,@danielcsgomes 的方法应该可以正常工作。
您可以通过运行git status
. 例如(-s
用于保持输出简短):
$ rm structy.py
$ git status -s
D structy.py
只取回那个文件:
$ git checkout -- structy.py
它回来了。
有时简单地检查一些其他分支或修订,然后回到原来的位置,就可以解决问题。例如,这里最近的提交master
是添加mp.py
,所以如果我这样做:
$ rm mp.py
$ git status -s
D mp.py
$ git checkout HEAD^
Note: checking out 'HEAD^'.
[verbiage about detached HEAD etc, snipped]
$ git checkout master
Previous HEAD position was 171ce6f... ignore *.log files
Switched to branch 'master'
$ git status -s
$ head -1 mp.py
from multiprocessing import Process, Queue
但这并不总是有效。它的工作原理是mp.py
因为以前的 rev ( HEAD^
) 没有它,而当前的 ( master
) 有,所以从HEAD^
到master
恢复文件。该文件structy.py
已经存在了很长一段时间,所以如果我删除它并签出HEAD^
或其他一些分支或其他任何东西,它仍然是从工作目录中删除的。所以类似的东西git checkout -- structy.py
是一种更简单的方法来恢复它,除非你想选择非常大的锤子:git reset --hard
.
如果您确定要放弃所做的任何更改,您可以git reset --hard HEAD
. 例如,考虑:
$ git rm mp.py
rm 'mp.py'
$ git status -s
D mp.py
(顺便说一句,请注意“D”在这里的位置不同:我“git rm”ed,而不仅仅是“rm”ed,所以我告诉 git,如果我进行提交,mp.py 应该是在新提交中删除,我删除它不仅仅是一个意外)。然后我决定,不,这是错误的,我希望一切都回到 HEAD 中的方式:
$ git reset --hard HEAD
HEAD is now at 523bacb add multiprocessing example
$ git status -s
$
所以,只有reset --hard
在你非常确定的情况下才使用。