题 如何丢弃Git中的未分级更改?


如何放弃工作副本中不在索引中的更改?


3869
2017-09-09 19:33


起源


也可以看看 stackoverflow.com/questions/22620393/... - Cees Timmerman
git-clean 仅从工作树中删除未跟踪的文件 git-scm.com/docs/git-clean - Gboyega
澄清Asenar上面的评论, git-clean -df 可能很危险。它将删除本地未跟踪的文件(例如,由.gitignore覆盖)仔细阅读以下所有内容并考虑git checkout。代替 - jacanterbury
'git clean -df'警告!我试过了,丢失了无法恢复的密钥文件夹...哎哟! - Gabe Karkanis
打 git status 提出了如何做到这一点的建议! git checkout -- . - Paulo


答案:


另一种更快捷的方法是:

git stash save --keep-index

包括 --include-untracked 如果你想彻底了解它。

在那之后,你可以用一个 git stash drop 命令,如果你喜欢。


2182
2017-09-09 19:39



要彻底了解它,你想要的 --include-untracked同样。 - T.J. Crowder
@KarimSamir:这个问题专门询问有关的变化 不在索引中。该 git reset 命令也将丢弃索引中的更改。 - Greg Hewgill
git checkout - 。更快 - Frank
不是 git stash,也没有任何种类 git checkout 将丢弃未分级的删除。根据输出 git status,这里的实际正确答案是一些味道 git reset HEAD - Chris Warth
这会污染存储堆栈。 git checkout -- . 仅使用一个命令完成工作。 - Felipe Tonello


对于所有未暂存的文件,请使用:

git checkout -- .

对于特定文件使用:

git checkout path/to/file/to/revert

确保在最后包括期间。


4197
2017-09-09 19:37



这似乎是git规范的方式。也就是说,如果你打字,git会告诉你这么做 git status - ABMagil
如果有未跟踪的文件,则不起作用。吉特说 error: The following untracked working tree files would be overwritten by checkout: ...。 - Michael Iles
新手问题,什么是“git checkout - 。”在语义上意味着什么? - kaid
@Ninjack git checkout -- . 意思是一样的 git checkout .除了你明确指出你没有指定分支名称这一事实。他们都说要检查我目前正在进行的分支上的HEAD版本''。要么 '。/'。如果你这样做 git checkout branch-name directory-or-file-name 一般来说,你得到HEAD版本 directory-or-file-name 在树枝上 branch-name。 - akgill
IMO这个变体是不完美的,因为当更改的存储库在更改清理时没有在HEAD修订版上并且您不想将其更新为HEAD并且想要仅清理更改时,它不处理这种情况。 - alexykot


似乎完整的解决方案是:

git clean -df
git checkout -- .

git clean 删除所有未跟踪的文件(警告:虽然它不会删除.gitignore中直接提到的忽略文件, 它可能会删除驻留在文件夹中的被忽略文件)和 git checkout 清除所有未分级的更改。


1615
2017-08-29 18:28



其他两个答案实际上并不起作用,这个答案确实有效。 - John Hunt
@dval这是第一个命令删除了未编制索引的文件,第二个命令删除了(索引文件的)未分级更改。因此,如果您没有任何阶段性更改,则与恢复到上一次提交相同 git reset --hard - Amanuel Nega
使用 -dff 如果未跟踪的目录是git克隆。 - accuya
小心运行git clean -df。如果您不明白它的作用,您可能会删除您要保留的文件,例如robots.txt,上传的文件等。 - ctlockey
正如@ctlockey所说,第一个命令也是 如果目录仅由忽略的文件组成,则删除目录...在我的项目中丢失了一大堆配置文件:(小心。 - Maxime Lorant


这将检出当前目录的当前索引,从当前目录向下丢弃文件中的所有更改。

git checkout .

或者这会从索引中检出所有文件,覆盖工作树文件。

git checkout-index -a -f

274
2018-06-20 10:28



嗨,有什么区别 git checkout . 和 git checkout -- .? - Evan Hu
@Evan:在这种情况下没有区别。 - Robert Siemer
@Robert Siemer和一般情况? - RJFalconer
@Evan:问这个问题的好地方。 - 这与OP的问题无关,与此处的答案无关。 - Robert Siemer
+1这是正确的答案,因为它正确处理了某些文件同时进行的情况 和 不分阶段的变化。请注意,此解决方案会丢弃未分级的更改;如果你想保留它们,那么你应该使用@ greg-hewgill的回答 git stash save --keep-index。 - Rhubbarb


git clean -df

通过从当前目录开始递归删除不受版本控制的文件来清除工作树。

-d:除了未跟踪的文件外,删除未跟踪的目录

-f:力量(可能没有必要取决于 clean.requireForce 设置)

git help clean 看手册


210
2017-12-07 13:09



为什么这个答案没有全部票数?在2011年回答,仍然是正确的。 - Eugene Braginets


我最喜欢的是

git checkout -p

这使您可以选择性地还原块。

也可以看看:

git add -p

82
2017-10-10 12:31



我喜欢在丢弃之前看到实际变化的能力。 - Penghe Geng
这就是我使用的。 git checkout -p然后“a”接受所有。 - Mattis
我从来没有想过。那 -p 增加了一个额外的安全层。结合它 git clean -d 实际回答OP。 - Stephan Henningsen


由于没有答案表明我使用的确切选项组合,这里是:

git clean -dfx
git checkout .

这是使用过的在线帮助文​​本 git clean 选项:

-d

除了未跟踪的文件之外,删除未跟踪的目录。如果未跟踪的目录由不同的Git存储库管理,则默认情况下不会删除它。使用 -f 如果你真的想要删除这样的目录,请选择两次。

-f

如果是Git配置变量 clean.requireForce 未设置为 false,除非给出,否则Git clean将拒绝删除文件或目录 -f-n, 要么 -i。 Git会拒绝删除目录中的目录 .git 子目录或文件,除非秒 -f 给出。

-x

不要使用忽略规则 .gitignore (每个目录)和 $GIT_DIR/info/exclude,但仍然使用给出的忽略规则 -e 选项。这允许删除所有未跟踪的文件,包括构建产品。这可以使用(可能与...结合使用) git reset)创建一个pristine工作目录来测试一个干净的构建。

也, git checkout . 需要在回购的根目录中完成。


67
2018-04-28 19:46



此解决方案的+1。关于你的评论“git checkout。需要在repo的根目录中完成”,也许你可能会提到我们可以做的 git reset --hard代替? (实际上相当于 git reset --hard HEAD 并应该工作当前目录...) - ErikMD
还关于第一个命令 git clean -dfx,这是我在运行之前用于保护安全的一个提示:运行 git clean -d -x -n 之前,要显示要删除的文件列表,然后通过运行确认操作 git clean -d -x -f (我提出了论点 -n,分别 -f 到底能够在终端快速改变它) - ErikMD
请注意,这是不可逆转的,如果你有文件 .gitignore 你会失去他们。因此,请考虑在此之前备份您的项目。 - Rob