这个问题在这里已有答案:
我知道Git会跟踪我对我的应用程序所做的更改,并且它会保留给我们,直到我提交更改,但这里是我挂断的地方:
当我想恢复到之前的提交时,我使用:
git reset --hard HEAD
而Git回归:
HEAD is now at 820f417 micro
然后,我如何将硬盘上的文件恢复为之前的提交?
我接下来的步骤是:
git add .
git commit -m "revert"
但我的硬盘上没有任何文件发生变化......
我在做什么是对还是错?
2 回答
首先,值得注意的是
git reset --hard
是一个具有潜在危险的命令,因为它会丢弃所有未提交的更改 . 为安全起见,在使用之前,应始终检查git status
的输出是否干净(即为空) .最初你说以下内容:
那是不对的 . Git只记录文件的状态(使用
git add
)或创建提交时 . 一旦你've created a commit which has your project files in a particular state, they'非常安全,但在那之前Git并不是真的"tracking changes"你的文件 . (例如,即使您执行git add
以暂存文件的新版本,也会在暂存区域中覆盖该文件的先前暂存版本 . )在您的问题中,您继续询问以下内容:
如果你做
git reset --hard <SOME-COMMIT>
那么Git会:使当前分支(通常为
master
)返回<SOME-COMMIT>
点 .然后使工作树中的文件和索引("staging area")与
<SOME-COMMIT>
中提交的版本相同 .HEAD
指向您当前的分支(或当前提交),因此git reset --hard HEAD
所做的就是抛弃您拥有的任何未提交的更改 .所以,假设您想要返回的良好提交是
f414f31
. (您可以通过git log
或任何历史记录浏览器找到它 . )然后,您可以根据自己的具体操作选择一些不同的选项:将当前分支更改为指向旧提交 . 你可以用
git reset --hard f414f31
做到这一点 . 但是,这会重写您的分支的历史记录,因此如果您与任何人共享此分支,则应该避免使用它 . 此外,您在f414f31
之后所做的提交将不再出现在master
分支的历史记录中 .创建一个新的提交,它代表与
f414f31
完全相同的项目状态,但只是将其添加到历史记录中,因此您不会丢失任何历史记录 . 您可以使用this answer中建议的步骤执行此操作 - 类似于:WARNING: git clean -f will remove untracked files, meaning they're gone for good since they aren't stored in the repository. Make sure you really want to remove all untracked files before doing this.
试试这个,看看
git clean -f
.git reset --hard
不会删除未跟踪的文件,因为git-clean
将从跟踪的根目录中删除不在Git跟踪下的任何文件 .或者,正如@Paul Betts所说,你应该做
git clean -xdf
(请注意 - 这也会删除所有被忽略的文件) .