我试图撤销自上次提交以来的所有更改。在看完这篇文章后,我尝试了git reset -hard和git reset -hard HEAD。我回复头部现在在18c3773…但当我查看我的本地资源时,所有的文件都还在那里。我错过了什么?


当前回答

使用以下命令

git remove-changes

git clean -fdx 

其他回答

我只是偶然发现了一个github库,它可以很容易地撤销git中的一些东西。它叫做ugit

只需输入ugit,它就会为您提供一个选项列表,您可以选择这些选项来撤销git命令

添加这个答案是因为之前的答案会永久删除您的更改

安全的方法

Git stash -u

解释:隐藏本地更改,包括未跟踪的更改(-u标志)。该命令保存本地修改,并恢复工作目录以匹配HEAD提交。

想稍后恢复更改吗?

Git隐藏pop

解释:该命令将对当前工作树状态的顶部重新应用更改。

想要永久删除更改?

Git藏匿点

解释:该命令将永久删除所存储的条目

链接到git存储文档

使用此选项可以在上次提交后删除不需要的更改。

git reset --hard HEAD

This will unstage all files you might have staged with git add: git reset This will revert all local uncommitted changes (should be executed in repo root): git checkout . You can also revert uncommitted changes only to particular file or directory: git checkout [some_dir|file.txt] Yet another way to revert all uncommitted changes (longer to type, but works from any subdirectory): git reset --hard HEAD This will remove all local untracked files, so only git tracked files remain: git clean -fdx WARNING: -x will also remove all ignored files, including ones specified by .gitignore! You may want to use -n for preview of files to be deleted.


总结一下:执行下面的命令基本上相当于从原始源代码复制一个新的git(但它不会重新下载任何东西,所以更快):

git reset
git checkout .
git clean -fdx

典型的使用是在构建脚本中,当你必须确保你的树是绝对干净的——没有任何修改或本地创建的目标文件或构建工件,并且你想让它工作得非常快,而不是每次都重新克隆整个存储库。

国家从一个承诺过渡到新的承诺

0. last commit,i.e. HEAD commit
1. Working tree changes, file/directory deletion,adding,modification.
2. The changes are staged in index
3. Staged changes are committed

状态转换的动作

0->1: manual file/directory operation
1->2: git add .
2->3: git commit -m "xxx"

检查差异

0->1: git diff
0->2: git diff --cached
0->1, and 0->2: git diff HEAD
last last commit->last commit: git diff HEAD^ HEAD

恢复到上次提交

2->1: git reset
1->0: git checkout .     #only for tracked files/directories(actions include modifying/deleting tracked files/directories)
1->0: git clean -fdx     #only for untracked files/directories(action includes adding new files/directories)
2->1, and 1->0: git reset --hard HEAD

相当于git的克隆,没有重新下载任何东西

git reset && git checkout . && git clean -fdx