git撤消所有未提交或未保存的更改

时间:2012-12-28 20:46:53

标签: git command-line undo git-reset

我试图撤消自上次提交以来的所有更改。在查看this post后,我尝试了git reset --hardgit reset --hard HEAD。我用头响应现在是18c3773 ...但是当我查看我的本地源时,所有文件仍然存在。我错过了什么?

14 个答案:

答案 0 :(得分:1345)

  • 这将取消您使用git add暂存的所有文件:

    git reset
    
  • 这将还原所有本地未提交的更改(应在repo root中执行):

    git checkout .
    

    您还可以仅将未提交的更改还原到特定文件或目录:

    git checkout [some_dir|file.txt]
    

    还原所有未提交的更改的另一种方法(更长的类型,但可以在任何子目录中工作):

    git reset --hard HEAD
    
  • 这将删除所有本地未跟踪文件,因此 git跟踪文件仍然存在:

    git clean -fdx
    

    警告: -x还会删除所有被忽略的文件,包括.gitignore指定的文件!您可能希望使用-n预览要删除的文件。


总结一下:执行以下命令基本上等同于原始来源的新git clone(但它不会重新下载任何内容,因此更快):

git reset
git checkout .
git clean -fdx

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

答案 1 :(得分:127)

如果您希望" 撤消"所有未提交的更改只需运行:

git stash
git stash drop

如果您有任何未跟踪的文件(通过运行git status检查),可以通过运行删除这些文件:

git clean -fdx

git stash会创建一个新的存储空间,它将成为存储@ {0} 。如果您想先检查,可以运行git stash list查看您的藏匿处列表。它看起来像:

stash@{0}: WIP on rails-4: 66c8407 remove forem residuals
stash@{1}: WIP on master: 2b8f269 Map qualifications
stash@{2}: WIP on master: 27a7e54 Use non-dynamic finders
stash@{3}: WIP on blogit: c9bd270 some changes

每个存储都以上一次提交消息命名。

答案 2 :(得分:18)

还有git stash - “隐藏”您的本地更改,可以在以后重新应用,如果不再需要则可以删除

更多info on stashing

答案 3 :(得分:11)

我正在使用源代码....您可以通过2个简单的步骤恢复所有未提交的更改:

1)只需要重置工作区文件状态

enter image description here 2)选择所有非舞台文件(命令+ a),右键单击并选择删除

enter image description here

这很简单:D

答案 4 :(得分:5)

对于到达此处的人,搜索是否可以撤消git clean -f -d eclipse 中创建的文件已被删除,

您可以使用"从本地历史记录恢复"从UI执行相同的操作。对于ref:Restore from local history

答案 5 :(得分:4)

添加此答案是因为先前的答案永久删除您的更改

安全的方法

git stash -u

说明:隐藏本地更改,包括未跟踪的更改(-u标志)。该命令将您的本地修改保存下来,并还原工作目录以匹配HEAD提交。

想稍后再恢复更改吗?

git stash pop

说明:该命令会将更改重新应用到当前工作树状态的顶部。

要永久删除更改吗?

git stash drop

说明:该命令将永久删除隐藏的条目

Link to git stash documentation

答案 6 :(得分:2)

状态从一次提交转换为新提交

IComparable

状态转换的行动

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

相当于git clone,无需重新下载任何内容

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

答案 7 :(得分:2)

要撤消尚未上交的更改,另一种选择是运行:

git restore <file>

要放弃工作目录中的更改。

答案 8 :(得分:2)

以下定义了一个可重用的 Git command alias 来删除任何本地更改,然后可以在将来的任何时间使用它来删除任何未提交的更改:

git config --global alias.remove-changes '!git stash push --include-untracked && git stash drop'

使用别名很简单:

git remove-changes

别名使用 git stash push --include-untracked 将所有更改推送到存储(包括未提交的更改),然后使用 git stash drop 删除新创建的存储条目。

答案 9 :(得分:1)

我要做的是

git add。 (添加所有内容)

git隐藏

git隐藏掉。

一个衬里:'git add。 && git stash && git stash drop'

答案 10 :(得分:1)

git restore [filename_path]

例如,我需要放弃 index.html 文件中的最后更改:

git restore /usr/myPC/folder/index.html

答案 11 :(得分:1)

使用它来删除上次提交后不需要的更改。

git reset --hard HEAD

答案 12 :(得分:1)

如果您想“撤消”所有未提交的更改或本地更改,只需运行:

git add. 
git stash 
git stash drop
git clean -fdx

答案 13 :(得分:0)

# Navigate to project root, `.` works too.
git restore *

git status 显示我有一些文件已更改,但我想摆脱这些文件并创建一个新分支。直到今天,我一直在使用 git reset 方法,我喜欢用它来跳回其他特定的提交。

<块引用>

https://www.git-tower.com/learn/git/commands/git-restore/