关于git:如何恢复未提交的更改,包括文件和文件夹?

How to revert uncommitted changes including files and folders?

是否有一个git命令来恢复工作树和索引中所有未提交的更改,以及删除新创建的文件和文件夹?

  • 如何丢弃Git中未分页的更改的可能副本?
  • 好吧,我已经阅读了下面所有各种各样的、难以记忆的答案,以及它们的警告和边缘案例,"如果有XXX,就不起作用",并且坚持删除整个回购协议,克隆它以删除所有编辑和添加的文件。也只有两个命令。rm-r projectdir;git克隆xxx。对我来说,这是一个经常性的操作——检查一下它周围的回购交易,然后想回到一个干净的结帐处,这样我就可以开始修改它了。不是很好,但100%有效。希望有一天他们能为此添加一个简单的命令。


您可以运行以下两个命令:

1
2
3
4
5
# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories. (`-f` is `force`, `-d` is `remove directories`)
git clean -fd

  • 在运行git clean之前,最好运行"git clean-nd"来预览更改,以确保您没有需要删除的未跟踪文件或目录。
  • 为某人保存文档之旅:F是force,-D是remove目录,-N是dry-run(也就是说,dry-run;显示输出而不做任何操作)
  • 用于交互模式的git clean -i
  • 它没有重置我的未归档文件,我必须先把它们放好。
  • 这会导致合并时出错:致命:您尚未结束合并(合并头存在)。请在合并前提交更改。
  • @igorganapolsky你可能正处于合并冲突之中。试着运行git merge --abort


如果只想还原当前工作目录中的更改,请使用

1
git checkout -- .

在此之前,您可以列出将被还原的文件,而不必实际执行任何操作,只需检查将发生什么,使用:

1
git checkout --

  • 当我尝试这个时,我得到了"error:pathspec."与Git已知的任何文件都不匹配。
  • 这和git reset --hard有什么区别?
  • "git reset--hard"将撤消分阶段和未分阶段的更改,而"git checkout--"将只撤消未分阶段的更改。
  • 但是,如果您使用checkout并且修改了文件,那么cmd将返回我需要执行合并的操作,即使我只需要还原这些更改。
  • 这和git reset HEAD有什么区别?
  • git checkout——只列出将被恢复的文件(没有操作,只列出)。如果您想在执行Git签出之前查看哪些文件会受到影响,那么这非常有用。
  • 别让我头痛!
  • 我正在使用一个非常复杂的源代码模型,在这个模型中,我通过shell脚本从其他git repos中获取功能。今天早上我弄错了,一堆代码消失了。Git结帐--.彻底解决了我的问题。谢谢!
  • 也可以将path与git checkout结合使用--path/file.php


使用"git checkout--…"放弃工作目录中的更改

1
git checkout -- app/views/posts/index.html.erb

1
git checkout -- *

删除对处于git状态的未分页文件所做的所有更改,例如

1
2
modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb

  • 除非我在更改文件所在的目录中,否则git checkout -- *对我不起作用。要签出整个存储库中的所有文件,必须执行git checkout -- :/
  • git checkout -- *中,star被shell替换,所有文件和目录都在当前目录中。所以它应该放在子目录中。它对我有用。但是多亏了强调语法":/"在我看来,这种接缝更清晰。


一个非常重要的方法是运行这两个命令:

  • 这会把你的变化转移到藏匿处,使你回到头部状态。
  • git stash drop这将删除在最后一个命令中创建的最新存储。
    • 这不适用于未提交的更改,只适用于已提交的更改。
    • 我已经将它用于未提交的更改,并且它可以工作。
    • @b0xxed1n存储是关于未提交的更改的,显然它对它们有效。
    • Git Stash用于保存未斜接的更改,这样您就可以……保存它们而不提交。
    • git stash导致以下错误:fatal: git-write-tree: error building trees Cannot save the current index state
    • 这是一种方法:d


    1
    git clean -fd

    没用,新文件还在。我所做的是完全删除所有工作树,然后

    1
    git reset --hard

    请参见"如何在Git中清除本地工作目录?"关于增加-x清洁选项的建议:

    1
    git clean -fdx

    注:-x标志将删除所有被git忽略的文件,因此要小心(参见我参考的答案中的讨论)。

    • 什么是-FDX?"force、directory和x是?
    • @adiprasetyo-x标志也会删除所有被忽略的文件;这可能是不需要的效果,所以我更新了我的答案。
    • 我仍然不能再平衡。我得到错误:错误:未能合并更改。修补程序在0003失败。创建对失败修补程序副本的调用,可在以下位置找到:


    我想您可以使用以下命令:git reset --hard

    • 嗯…我做到了,但我的档案还在那里。之后我该做点什么吗?
    • Git Reset只还原工作树中未斜接的更改。它不会删除新的文件和文件夹。我不知道怎么用Git
    • 所以,如果我们通过添加新的文件和文件夹来更改系统目录,然后我们想要将该目录恢复到以前的状态(不包括那些文件和文件夹),那么我们不能用git来实现这一点?所以我们能做的最好的就是恢复文件状态?但是一旦我们创建了一个文件,我们就不能删除该文件,除非我们手动删除它?


    请注意,可能仍然有一些文件似乎不会消失-它们可能未被编辑,但由于CRLF/LF更改,Git可能已将它们标记为正在编辑。看看你最近是否对.gitattributes做了一些改变。

    在我的例子中,我已经将CRLF设置添加到.gitattributes文件中,因此所有文件都保留在"修改文件"列表中。更改.gitattributes设置会使它们消失。


    如果您有一个未提交的更改(仅在工作副本中)希望在最近的提交中恢复到该副本,请执行以下操作:

    1
    git checkout filename

    您只需使用以下git命令,它可以恢复在存储库中所做的所有未提交的更改:

    1
    git checkout .

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.

    Changes not staged for commit:
      (use"git add <file>..." to update what will be committed)
      (use"git checkout -- <file>..." to discard changes in working directory)

            modified:   application/controllers/Drivers.php
            modified:   application/views/drivers/add.php
            modified:   application/views/drivers/load_driver_info.php
            modified:   uploads/drivers/drivers.xlsx

    no changes added to commit (use"git add" and/or"git commit -a")

    ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
    $ git checkout .

    ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.

    nothing to commit, working tree clean

    我通常用这种方式工作得很好:

    1
    2
    mv fold/file /tmp
    git checkout fold/file

    • 这和那个357"喜欢"的人提议的完全一样。只是您甚至创建了一个新签出文件的备份。


    一条安全而漫长的路:

  • git branch todelete
  • git checkout todelete
  • git add .
  • git commit -m"I did a bad thing, sorry"
  • git checkout develop
  • git branch -D todelete

  • 用途:

    1
    git reset HEAD filepath

    例如:

    1
    git reset HEAD om211/src/META-INF/persistence.xml