【问题标题】:git reset --hard HEAD leaves untracked files behindgit reset --hard HEAD 留下未跟踪的文件
【发布时间】:2011-05-18 16:21:59
【问题描述】:

当我运行git reset --hard HEAD 时,它应该重置为您所提取的原始版本,据我所知。不幸的是,它会留下文件,因为git status 会显示一大堆未跟踪的文件。

你如何告诉 git“只要把它恢复到最后一次拉取时的样子,仅此而已”?

【问题讨论】:

  • git reset --hard 重置您的索引并将跟踪的文件恢复到它们在 HEAD 中的状态。它只留下未跟踪的文件。

标签: git


【解决方案1】:

您必须使用git clean -f -d 来删除工作副本中未跟踪的文件和目录。 您可以添加-x 来删除被忽略的文件,更多信息请参见this excellent SO answer

如果您需要将包含子模块的整个存储库重置为 master 上的状态,请运行此脚本:

git fetch origin master
git checkout --force -B master origin/master
git reset --hard
git clean -fdx
git submodule update --init --recursive --force
git submodule foreach git fetch
git submodule foreach git checkout --force -B master origin/master
git submodule foreach git reset --hard
git submodule foreach git clean -fdx

【讨论】:

  • 如果你想删除你的 .gitignored 文件并恢复到原始状态,也可以-x
  • -n 添加到测试将首先被删除。将所有这些组合在一个参数中:-dfn
  • 这里我常用的命令是git clean -qfdx。删除所有内容并静默进行。
  • -d -f 可以为-dff 贴花两次-d -f -f,这将删除所有未跟踪的目录,包括受保护的未跟踪目录。
  • @BKSpureon:是的,它会删除文件。 “我想要以前的未跟踪文件”是什么意思? Git 对未跟踪的文件一无所知,除非它们存在。它不会跟踪这些文件的多个版本(因为它们未跟踪)。
【解决方案2】:

如果您还有想要保留的文件:

git clean -di 将进行交互式清理,只允许您删除不再需要的文件/目录。

【讨论】:

    【解决方案3】:
    git reset --hard && git clean -df
    

    或者,zsh 提供了一个“gpristine”别名:

    alias gpristine='git reset --hard && git clean -df'
    

    这真的很方便。

    可选:

    git clean 命令还有一个-x 选项。这也将删除 'git 忽略' 文件,所以如果它是你想要的,也可以添加这个选项。

    如果处理分叉的仓库,请确保从正确的仓库/分支获取并重置,例如:

    git fetch upstream && git reset --hard upstream/master && git clean -df
    

    【讨论】:

    • 抱歉,如果这不是一个安全的命令 - 我并没有试图保证安全,我试图回答这个问题。您能否评论一下这是否回答了这个问题?
    • 这很好用,应该内置到 git 恕我直言(虽然我不确定我是否会经常使用 -x)。很多次我都在做一个本地项目,还没有同步到 github 等,一个混乱的重构超出了 IDE 的“撤消”状态。我的直觉是恢复到最后一次提交,但谷歌搜索通常需要倒数第二次提交的答案,而不是最后一次提交。我只想回到最近的提交。这是这样做的。不过应该是更简单的方法。谢谢莱纳斯! ;-)
    • 这很危险,因为它还会使用-x 删除被忽略的文件,就像您刚刚克隆了存储库一样。如果这就是你想要的,那就完美了。如果您只想删除 未跟踪的 文件,删除 -x 选项效果很好。
    • 感谢上帝gpristine
    • 并删除 intellij 设置 ;)
    【解决方案4】:

    用户交互方式:

    git clean -i -fd
    
    Remove .classpath [y/N]? N
    Remove .gitignore [y/N]? N
    Remove .project [y/N]? N
    Remove .settings/ [y/N]? N
    Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
    Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
    Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
    Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
    Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y
    

    -i 用于交互
    -f 表示力
    -d 用于目录
    -x 用于忽略的文件(如果需要,添加)

    注意: 添加 -n--dry-run 只是检查它会做什么。

    【讨论】:

      【解决方案5】:

      您可以使用git stash。你必须指定--include-untracked,否则你会遇到原来的问题。

      git stash --include-untracked
      

      然后只删除存储中的最后一个条目

      git stash drop
      

      您可以为它创建一个方便的别名,并称之为git discard,例如:

      git config --global alias.discard "! git stash -q --include-untracked && git stash drop -q"
      

      【讨论】:

      • git clean 选项更简单直观。
      • 很棒的解决方案,谢谢。这是唯一对我有用的东西
      • 别名是很好的补充!谢谢,以后会用的。
      【解决方案6】:

      git-clean 用于删除工作树中未跟踪的文件。以下是一些可以与git clean 命令一起使用的选项(简要)。

      -d 在未指定路径时使用。所以 git 递归到未跟踪的目录中删除它们。

      -f/--force 删除嵌套的未跟踪文件。

      -i/--interactive 显示将要做什么并以交互方式清理文件。

      -n/--dry-run 显示在不删除任何内容的情况下会发生什么。

      -x忽略文件

      示例:git clean -f -d -> 删除当前目录任何子目录中所有未跟踪的文件。

      【讨论】:

        【解决方案7】:

        您要查找的命令是git clean

        【讨论】:

        • 下次请添加更多描述/示例等。无论什么有助于用户理解它的作用,以及在这种情况下使用什么参数。
        【解决方案8】:

        您可以添加这个有用的别名来硬重置所有文件(已跟踪和未跟踪)并返回到之前的提交版本:

        git config --global alias.reset-hard '!f() { git reset --hard; git clean -df ; }; f'
        

        然后你可以这样重置:

        git reset-hard
        

        【讨论】:

          【解决方案9】:

          删除除.git 文件夹之外的所有内容,然后运行 git reset --hard

          【讨论】:

            【解决方案10】:

            你可能在某个时候做了软重置,你可以通过这样做来解决这个问题

            git add .
            git reset --hard HEAD~100
            git pull
            

            【讨论】:

            • 我认为这不是 OP 想要的。其他任何一个答案都可以更好地实际展示如何解决这个问题。
            • 如果您要添加很多文件,这也可能会很慢。
            • 完全不相关。
            • 这样做,未跟踪的文件将被删除。但作为程序员,每个人都应该努力为问题找到正确的解决方案,而不是使用变通方法和微笑。
            • 伙计们,这个答案还不错(-16)。它解决了 OP 的问题——一个干净的状态。 Git初学者可以理解这些命令。 SO 有很多变通方法,把它当作一种选择。
            猜你喜欢
            • 2018-02-28
            • 2018-07-02
            • 2018-01-13
            • 1970-01-01
            • 2012-07-08
            • 2021-02-22
            • 2014-08-25
            • 2011-08-19
            相关资源
            最近更新 更多