如何丢弃 Git 中未暂存的更改?

问题描述:

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

解决方案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大洲远程工作机会,探索不一样的工作方式

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: `git reset --hard` 命令会将 Git 仓库中的 HEAD 指向指定的提交,同时重置暂存区和工作区,这样会丢失工作区中未提交的修改和所有已暂存提交的修改。 如果你只是想撤销暂存区的修改,可以使用以下命令: ``` git reset HEAD ``` 这个命令会将暂存区的修改撤销,但不会影响工作区的修改。如果你想撤销工作区的修改,可以使用以下命令: ``` git checkout . ``` 这个命令会将工作区中所有修改还原到最近的一次提交状态。注意,所有提交的修改都会被丢弃,因此请谨慎使用。 ### 回答2: git reset --hard 暂存文件是指使用git的reset命令来重置工作区和暂存区,并且放弃对某个文件更改,恢复到之前的提交状态。 当我们在进行代码开发时,有时可能会修改一些文件,但事后发现自己的修改是错误的或不需要的。此时,我们可以使用git reset --hard命令来撤销对这些文件的修改。 使用git reset --hard命令,会同时重置工作区和暂存区,将它们恢复到上一次提交的状态。这个命令会永久性地丢弃我们对文件的修改,所以在执行这个命令之前,一定要确保我们不需要保存这些修改。 要使用git reset --hard命令,我们需要先确定要重置的提交版本或分支。可以通过git log命令来查看提交记录,找到我们需要回滚到的版本号或提交哈希。然后,在终端中输入git reset --hard <提交哈希>命令,将工作区和暂存区重置到指定的提交。 需要注意的是,git reset --hard命令会永久性地丢弃所有没有提交的修改,所以在执行这个命令之前,一定要确认工作区中没有重要的保存的更改。在重置之前,也可以使用git stash命令将修改的文件暂存起来,以便稍后可以恢复到当前状态。 综上所述,git reset --hard 暂存文件是一个强制性的重置命令,它可以丢弃文件的修改,恢复到之前的提交状态。但是由于这个命令会永久地丢弃提交的更改,使用之前需要谨慎确认。 ### 回答3: git reset --hard 对于暂存文件的作用是把所有已暂存文件回退到最近一次提交的状态。也就是说,执行这个命令后,暂存区中的文件会被清空,工作目录中的文件会与最近一次提交的版本完全一致。 当我们使用 git add 命令将文件添加到暂存区后,我们有时可能会发现自己添加了一些不必要的或错误的文件。这时,可以使用 git reset --hard 暂存文件来撤销这些暂存文件,使其回到工作目录并且不出现在暂存区中。 另外,当我们想要回退到之前某个提交的状态时,可以使用 git reset --hard 加上想要回退的提交的SHA值来实现。执行该命令后,Git会将HEAD指针和分支指针移动到指定的提交上,并且重置工作目录和暂存区到该提交的状态。这意味着,我们回退后之前的提交及其之后的提交都会被丢弃,工作目录和暂存区会和指定的提交完全一致。 需要注意的是,git reset --hard 命令是具有破坏性的,它会永久性地清空暂存区和工作目录中的文件,并且丢弃掉之前的提交。因此,在执行该命令之前,需要确保已经备份了重要的更改,以免造成数据的不可挽回的损失。 总之,git reset --hard 暂存文件命令用于撤销暂存文件,或者回退到之前某个提交的状态,但需要谨慎使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值