git checkout -- * 并跳过未追踪的文件

4

我试图在自己的犯错之后恢复文件。

git checkout -- * 目前运行得很好。但是,例如,在我的 .gitignore 文件中,我列出了 "LICENSE.txt",它显然不仅适用于该名称的根级文件,而且适用于整个目录树中的每个具有该名称的文件。

因此,当我在 wordpress 文件夹中运行 git checkout -- * 时,会出现错误:

error: pathspec 'blog/license.txt' did not match any file(s) known to git

我该如何运行该命令,使其仅适用于已跟踪的文件?我的另一个选择是逐个浏览每个文件夹并恢复文件。

还要注意,license.txt 不是我唯一被忽略的文件问题。有数十个。


你究竟想通过 git checkout -- * 实现什么目的?也许有更好的方法可以实现,比如使用 git reset --hard - Steve Bennett
2
尝试使用 git checkout -- . 命令 - . 表示当前目录(以及其下的所有内容)。 - porges
@SteveBennett 也许在那个时候使用 git reset --hard 也可以解决问题。当时情况很糟糕,我丢失了一些重要的未跟踪文件,所以不得不从备份中恢复,虽然大部分相同,但还是有一些差异。我使用 git checkout * 来恢复那些在 git status . 中仍显示为更改的文件。 - Buttle Butkus
1个回答

12

如果我正确理解您的问题,您想将所有当前被跟踪的文件重置为上一个提交,并保留未跟踪的文件。

如果是这样,我会按照以下方式进行。

第一种方法

如评论中Porges所述。

首先取消暂存所有当前修改过的文件:

git reset

然后将所有未暂存的修改文件重置为上一个提交。

git checkout -- .

第二种方式(仅适用于Git 1.7.7+)

首先,我会将已跟踪的文件藏匿如下:

git stash

然后我会按以下方式存储未跟踪的文件:

git stash -u

因此,现在您的堆栈上有两个stash:一个在底部带有跟踪文件,另一个在顶部带有未跟踪的文件。按照以下方式弹出跟踪的文件(即应用位于堆栈中第二个的stash):
git stash apply stash@{1}

然后重置到先前的提交:

git reset --hard

最后,应用未跟踪的文件:

git stash apply

这看起来非常不错,但是当我运行 git stash -u 时,我会收到一个错误消息:“未知选项 'stash save': -u”。我使用的是运行在Centos 6上的git版本1.7.1。 - Buttle Butkus
啊,是的,我假设你正在使用1.7.7及以上版本 - Kent Shikama
我几周前刚安装了它。我猜想CentOS像往常一样落后了。你的方法比在根目录使用git checkout -- .更好吗? - Buttle Butkus
1
是的,“git checkout -- .”是一种更简便的方法。 - Kent Shikama
我已经升级到2.0.4,所以现在我也可以按照你的方式操作了。但是,如果它能够完成相同的事情,那么git checkout -- .更简单。 - Buttle Butkus
是的,唯一的问题是你可能需要先取消暂存所有修改过的文件。 - Kent Shikama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接