问题描述:
如何丢弃工作副本中不在索引中的更改?
解决方案1:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
对于当前工作目录中的所有未暂存文件,请使用:
git restore .
对于特定文件使用:
git restore path/to/file/to/revert
它与 git switch 一起替换了重载的 git checkout (see here),从而消除了参数消歧。
如果文件同时具有暂存更改和未暂存更改,则仅还原 git diff 中显示的未暂存更改。 git diff --staged 中显示的更改保持不变。
在 Git 2.23 之前
对于当前工作目录中的所有未暂存文件:
git checkout -- .
对于特定文件:
git checkout -- path/to/file/to/revert
– 用于消除歧义(这称为 argument disambiguation)。
这似乎是 git 规范的方式。即如果你输入 git status
如果有未跟踪的文件,则不起作用。 Git 说 error: The following untracked working tree files would be overwritten by checkout: ...。
新手问题,“git checkout -- ”是什么意思?语义上的意思?
@Ninjack git checkout -- . 与 git checkout . 的含义相同,只是您明确表示您没有指定分支名称。他们都说在我目前正在为“。”的分支上检查 HEAD 版本。或者 '。/'。如果您通常执行 git checkout branch-name directory-or-file-name,则会在分支 branch-name 上获得 directory-or-file-name 的 HEAD 版本。
IMO 这个变体是不完美的,因为它无法处理更改清理时更改的存储库不在 HEAD 修订版上并且您不想将其更新为 HEAD 并且只想清理更改的情况。
解决方案2:
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
另一种更快的方法是:
git stash save --keep-index --include-untracked
如果您不想详细说明,则无需包含 --include-untracked。
之后,您可以根据需要使用 git stash drop 命令删除该存储。
@KarimSamir:该问题专门询问不在索引中的更改。 git reset 命令也将丢弃索引中的更改。
混帐结帐 - 。快得多
git stash 和任何种类的 git checkout 都不会丢弃未暂存的删除。根据git status的输出,这里的实际正确答案是有点味道git reset HEAD
这会污染存储堆栈。 git checkout -- . 只用一个命令完成这项工作。
@FelipeTonello 我希望我能给你 100 个代表该评论。在我的测试中,这似乎正是我想要的。相反,我花了最后一个小时使用“git checkout -- *”并解决所有未跟踪的文件错误。
解决方案3:
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com
似乎完整的解决方案是:
git clean -df
git checkout -- .
警告:虽然它不会删除 .gitignore 中直接提及的被忽略文件,但git clean -df 可能会删除文件夹中的被忽略文件。
git clean 删除所有未跟踪的文件,git checkout 清除所有未暂存的更改。
huntsbot.com – 高效赚钱,自由工作
其他两个答案实际上不起作用,这个起作用了。
@dval 这是因为第一个命令删除了未索引的文件,第二个命令删除了未暂存的更改(索引文件)。因此,如果您没有任何阶段性更改,这与使用 git reset --hard 恢复到上次提交相同
如果未跟踪的目录是 git 克隆,请使用 -dff。
小心运行 git clean -df。如果你不明白它的作用,你可能会删除你想要保留的文件,比如 robots.txt、上传的文件等。
正如@ctlockey 所说,如果目录仅由被忽略的文件组成,第一个命令也会删除目录......在我的项目中丢失了一大堆配置文件:(小心。
解决方案4:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
这将检查当前目录的当前索引,从当前目录向下丢弃文件中的所有更改。
git checkout .
或者这个从索引中检查所有文件,覆盖工作树文件。
git checkout-index -a -f
+1 这是正确的答案,因为它正确处理了某些文件同时具有暂存 和 未暂存更改的情况。请注意,此解决方案会丢弃未暂存的更改;如果您希望保留它们,那么您应该使用 @greg-hewgill 的 git stash save --keep-index 答案。
如果您只有一个分支,git checkout -- 将不起作用。 git checkout . 始终有效。
太感谢了!最后一个总是有效的答案!这可以与 git clean 结合使用以删除未跟踪的文件。
不好笑,但这似乎是唯一可行的答案。评分较高的答案似乎无济于事。我确信他们会做一些事情,但他们当然不会“重置”未分级的更改。
解决方案5:
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
git clean -df
从当前目录开始,通过递归删除不受版本控制的文件来清理工作树。
-d:除了未跟踪的文件之外,还删除未跟踪的目录
-f:强制(根据 clean.requireForce 设置可能不需要)
运行 git help clean 查看手册
为什么这个答案没有得到所有的选票?在 2011 年回答,仍然正确。
这应该是公认的答案。
解决方案6:
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
2019 年更新
您现在可以通过以下方式丢弃一个跟踪文件中的未暂存更改:
git restore
并在当前目录(递归)中的所有跟踪文件中:
git restore .
如果您从存储库的根目录运行后者,它将丢弃项目中所有跟踪文件中的未暂存更改。
笔记
git restore 于 2019 年 7 月推出,并在 2.23 版中发布,作为 git checkout 命令拆分为文件的 git restore 和分支的 git switch 的一部分。
git checkout 仍然像以前一样运行,旧的答案仍然完全有效。
当在工作树中运行 git status 且未暂存更改时,现在这是 Git 建议用来丢弃它们的方法(而不是 git checkout – ,因为它过去在 v2.23 之前)。
与 git checkout – . 一样,这只会丢弃跟踪文件中的更改。所以 Mariusz Nowak 的回答仍然适用,如果您想丢弃所有未暂存的更改,包括未跟踪的文件,您可以按照他的建议运行额外的 git clean -df。
我只想在不影响新添加的文件的情况下恢复我未暂存的更改,因此 git restore . 可以完美运行。谢谢。
我做了git restore ,效果很好。
对我来说工作得很好。
根据手册页 git restore . 恢复当前目录中的所有文件,而不是整个存储库。
你说的对。谢谢!我刚刚测试了它,确实是这样。然而,它是递归的。因此,当从项目的根目录运行时,它适用于整个存储库。我将编辑我的答案。
解决方案7:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
我最喜欢的是
git checkout -p
这使您可以有选择地还原块。
也可以看看:
git add -p
我喜欢在丢弃之前看到实际变化的能力。
这就是我使用的。 git checkout -p 然后“a”接受所有。
我从来没有想过。 -p 增加了一个很好的额外安全层。将其与 git clean -d 结合以实际回答 OP。
解决方案8:
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
由于没有答案表明我使用的确切选项组合,这里是:
git clean -dxn . # dry-run to inspect the list of files-to-be-removed
git clean -dxf . # REMOVE ignored/untracked files (in the current directory)
git checkout -- . # ERASE changes in tracked files (in the current directory)
这是所用 git clean 选项的在线帮助文本:
-d
除了未跟踪的文件之外,还删除未跟踪的目录。如果未跟踪的目录由不同的 Git 存储库管理,则默认情况下不会将其删除。如果您真的想删除这样的目录,请使用 -f 选项两次。
-x
不要使用从 .gitignore(每个目录)和 $GIT_DIR/info/exclude 读取的标准忽略规则,但仍要使用通过 -e 选项给出的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。这可以用来(可能与 git reset 结合使用)创建一个原始工作目录来测试一个干净的构建。
-n
实际上不要删除任何东西,只是显示将要做什么。
-f
如果 Git 配置变量 clean.requireForce 未设置为 false,Git clean 将拒绝删除文件或目录,除非给定 -f、-n 或 -i。 Git 将拒绝删除 .git 子目录或文件中的目录,除非给出第二个 -f。
对此解决方案 +1。关于您所说的“git checkout。需要在回购的根目录中完成”,也许您可能会提到我们可以只做git reset --hard? (这实际上等同于 git reset --hard HEAD 并且应该适用于当前目录......)
同样关于第一个命令 git clean -dfx,这是我在运行它之前使用的安全方面的提示:只需运行 git clean -d -x -n 之前,显示要删除的文件列表,然后通过以下方式确认操作运行 git clean -d -x -f(我将参数 -n 和 -f 放在最后,以便能够在终端中快速更改它)
请注意,这是不可逆的,如果您在 .gitignore 中有文件,您将丢失它们。因此,请考虑在此之前备份您的项目。
@MartinG 我只是借此机会合并了我的 two suggestions,包括添加“试运行”步骤的那个(安全总比抱歉好!)。无论如何,如果需要,请随时修改我的编辑!
如何删除出现在 git status 中的未跟踪文件而不删除 .gitignore 中的未跟踪文件?
解决方案9:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
如果您只想删除对现有文件的更改,请使用 checkout (documented here)。
git checkout -- .
没有指定分支,所以它检查出当前分支。
双连字符 (–) 告诉 Git 应该将后面的内容作为它的第二个参数(路径),即您跳过了分支的规范。
句点 (.) 表示所有路径。
如果您希望删除自上次提交后添加的文件,请使用 clean (documented here):
git clean -i
-i 选项启动交互式清理,以防止错误删除。
还有一些其他选项可用于更快地执行;请参阅文档。
如果您希望将更改移动到保留空间以供以后访问,请使用 stash (documented here):
git stash
所有更改都将移至 Git 的 Stash,以供以后访问。
有一些选项可用于更细微的存储;请参阅文档。
这将完全转换您的更改并丢弃先前提交中新添加的文件。
它会删除新添加的文件吗?或者只是撤消旧未暂存文件中的更改?
解决方案10:
huntsbot.com – 高效赚钱,自由工作
最简单的方法是使用以下命令:
此命令用于丢弃工作目录中的更改 -
git checkout -- .
https://git-scm.com/docs/git-checkout
在 git 命令中,未跟踪文件的存储是通过以下方式实现的:
git stash -u
http://git-scm.com/docs/git-stash
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
我来过这里两次,阅读了这个答案,最后忘记了 .。对未来的我:这个时期是必不可少的!
我需要摆脱子目录中的所有本地更改,而不会消除所有其他更改。这个答案很有帮助,谢谢
请描述这两个命令的作用。没有解释真的没用。
出色的。结帐在一个命令中执行最流行的命令在两个命令中执行的操作。也可以用 git clean -fd 来清理不在索引中的文件。
解决方案11:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
我真的发现这篇文章有助于解释何时使用什么命令:http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/
有几种不同的情况:
如果您尚未暂存文件,则使用 git checkout。签出“更新工作树中的文件以匹配索引中的版本”。如果文件还没有被暂存(也就是添加到索引中)…这个命令基本上会将文件恢复到你上次提交的状态。 git checkout – foo.txt 如果你已经暂存了文件,那么使用 git reset。重置更改索引以匹配提交。 git reset – foo.txt
我怀疑使用 git stash 是一种流行的选择,因为它的危险性要小一些。如果您在使用 git reset 时不小心吹走太多东西,您可以随时返回它。默认情况下,重置是递归的。
请查看上面的文章以获取更多建议。
原文链接:https://www.huntsbot.com/qa/jW2l/how-do-i-discard-unstaged-changes-in-git?lang=zh_CN
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式