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


834

我正在尝试撤消自上次提交以来的所有更改。我尝试过git reset --hardgit reset --hard HEAD查看了这篇文章。我的响应现在是18c3773 ...,但是当我查看本地源时,所有文件仍然存在。我想念什么?


1
这是来自Github的大量资源:如何使用Git撤消(几乎)任何操作
jasonleonhard

Answers:


1619
  • 这将取消登台您可能已登台的所有文件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

典型的用法是在构建脚本中,当您必须确保树是绝对干净的时-不进行任何修改或在本地创建目标文件或构建伪像,并且您希望使其运行得非常快并且不重新构建。每次都克隆整个存储库。


@turibe是的。我不得不启动我的项目几次,因为它删除了所有下载的依赖项和我的.idea文件夹。需要更好的解决方案。
EresDev

2
@EresDev,您不必执行git clean,它将撤消未提交的更改,但保留所有未跟踪或添加的文件。但是,由于某些未跟踪的文件可能会干扰,因此它可能会影响生成结果。例如,如果您的.idea目录损坏,该怎么办?
mvp

git reset告诉我我需要保存更改
Daniel Springer

1
运行中git clean -fdx删除了我的,node_modules并且.env很棒
fires3as0n

1
@ fires3as0n您还期望什么?这必然会发生。答案中也有警告。
里沙夫

148

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

git stash
git stash drop

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

git clean -fdx

git stash创建一个新的存储,它将变为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
确实是一个不错的解决方案,但是您需要使用git add .之前进行更改,git stash因为即使在此之后,它也显示出我git stash
尚未


12

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

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

在此处输入图片说明 2)选择所有未暂存的文件(命令+ a),右键单击并选择删除

在此处输入图片说明

就这么简单:D


如果您重置然后更改分支,并以重置的分支为基础,则可能会受到伤害。重置很有用,但不应用于删除未提交的更改。在丢弃未提交的更改的情况下,仅存储并删除该存储。
Dinu Nicolae

10

我要做的是

git add . (adding everything)
git stash 
git stash drop

一班轮: git add . && git stash && git stash drop


这是最好的
Madrugada

7

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

您可以使用“从本地历史记录还原 ”作为参考,从用户界面执行相同操作:从本地历史记录还原


3
我没有投反对票,但是您的意图还不够明确。如果您要改写答案中的第一句话,这将有所帮助。
Mark Schultheiss

5

国家从一次提交过渡到新的提交

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 clone,无需重新下载任何内容

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

我看不出这与所提问题有何关系。这只是一系列奇怪的食谱,没有任何实质内容。
mvp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.