git:撤消所有工作目录更改,包括新文件


git: undo all working dir changes including new files

如何从工作目录中删除所有更改,包括新的未跟踪文件。我知道git checkout -f会这样做,但它不会删除自上次提交以来创建的新的未跟踪文件。

有人知道怎么做吗?


1
2
3
4
5
6
7
8
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

要查看在手之前要删除的内容,而不实际删除它,请使用-n标志(这基本上是一个测试运行)。准备好实际删除时,删除-n标志:

git clean -nfd


最安全的方法,我经常使用:

1
git clean -fd

语法解释按/docs/git-clean页:

  • -f(别名:--force)。如果git配置变量clean.requireforce未设置为false,则git clean将拒绝删除文件或目录,除非给出-f、-n或-i。git将拒绝删除具有.git子目录或文件的目录,除非给出第二个-f。
  • -d。删除未跟踪的目录以及未跟踪的文件。如果未跟踪的目录由其他Git存储库管理,则默认情况下不会删除该目录。如果确实要删除这样的目录,请使用-f选项两次。

正如注释中所提到的,最好是执行一个执行试运行的git clean -nd,并在实际删除之前告诉您将删除什么。

链接到git clean文档页面:https://git-scm.com/docs/git-clean


对于所有未分页的文件,请使用:

1
git checkout -- .

最后的.很重要。

您可以用子目录名替换.,只清除项目的特定子目录。这个问题在这里特别解决。


看看git clean命令。

git-clean - Remove untracked files from the working tree

Cleans the working tree by recursively removing files that are not under version control, starting from the current directory.

Normally, only files unknown to git are removed, but if the -x option is specified, ignored files are also removed. This can, for example, be useful to remove all build products.


以下工作:

1
2
3
git add -A .
git stash
git stash drop stash@{0}

请注意,这将丢弃未分页和阶段性的本地更改。所以在运行这些命令之前,您应该提交您想要保留的任何内容。

一个典型的用例:你移动了大量的文件或目录,然后想要回到原始状态。

学分:https://stackoverflow.com/a/52719/246724


您可以分两步完成此操作:

  • 恢复修改文件:git checkout -f
  • 删除未跟踪的文件:git clean -fd

  • 我以为是的(警告:以下内容将清除所有内容)

    1
    2
    $ git reset --hard HEAD
    $ git clean -fd

    用于撤消更改的resetclean删除任何未跟踪的文件和目录。


    1
    git reset --hard origin/{branchName}

    它将删除所有未跟踪的文件。


    git clean -i将首先向您显示要删除的项目,并在您确认后继续。我发现这在处理不应意外删除的重要文件时很有用。

    有关更多信息,包括一些其他有用的选项,请参阅git help clean


    对于我使用的特定文件夹:

    1
    git checkout -- FolderToClean/*


    另一种解决方案是提交更改,然后去掉这些提交。这在一开始并没有立即的好处,但它打开了以块形式提交和创建用于备份的Git标记的可能性。

    您可以在当前分支上执行此操作,如下所示:

    1
    2
    3
    4
    5
    git add (-A) .
    git commit -m"DISCARD: Temporary local changes"
    git tag archive/local-changes-2015-08-01  # optional
    git revert HEAD
    git reset HEAD^^

    或者你可以在分开的头上做。(假设从BranchName分支开始):

    1
    2
    3
    4
    5
    git checkout --detach HEAD
    git add (-A) .
    git commit -m"DISCARD: Temporary local changes"
    git tag archive/local-changes-2015-08-01  # optional
    git checkout BRANCHNAME

    然而,我通常做的是成批提交,然后将一些或所有提交命名为"放弃…"。然后使用交互式REBASE删除错误的提交并保留好的提交。

    1
    2
    3
    4
    5
    6
    7
    git add -p  # Add changes in chunks.
    git commit -m"DISCARD: Some temporary changes for debugging"
    git add -p  # Add more stuff.
    git commit -m"Docblock improvements"
    git tag archive/local-changes-2015-08-01
    git rebase -i (commit id)  # rebase on the commit id before the changes.
      # Remove the commits that say"DISCARD".

    这更详细,但它允许您确切地查看要放弃的更改。

    git lolgit lola快捷方式对于此工作流非常有用。


    如果要放弃所有更改,可以使用.gitconfig中别名中的任何有效选项。例如:

    1
    2
    [alias]
        discard ="!f() { git add . && git stash && git stash drop stash@{0}; }; f"

    用法:git discard


    这可能是一个无意义的答案,但是:我在Windows中使用了TortoiseGit,它有一个称为Revert的好特性。因此,要恢复本地的非阻塞更改,您需要做的是:

  • 打开所需文件夹的上下文菜单,然后选择Revert,它显示一个还原弹出窗口,您可以在其中选择要还原/恢复的已更改文件。
  • 如果还想删除添加的文件(还不在git中),请单击提交(来自同一上下文)菜单)它会弹出提交弹出窗口并向您显示添加的文件,然后右键单击每一个并选择"删除"。但不要按承诺btn在此弹出窗口中,因为您不想提交,但只看到添加文件并从这里删除它们。