Git丢弃对一个文件的改动的方法详解

 更新时间:2026年05月06日 08:32:34   作者:金銀銅鐵  
当我们进行日常开发时,有时候需要丢弃对一个文件的改动,为了便于描述,我们假设这个文件是 f.txt,会有两种情况,本文会对两种情况进行讨论,需要的朋友可以参考下

背景

当我们进行日常开发时,有时候需要丢弃对一个文件的改动。为了便于描述,我们假设这个文件是 f.txt\text{f.txt}f.txt。会有两种情况 ⬇️

  • 仅丢弃 f.txt\text{f.txt}f.txt 尚未暂存 的改动
  • 丢弃 f.txt\text{f.txt}f.txt 已暂存 的改动 + 尚未暂存 的改动

本文会对这两种情况分别进行介绍

要点

仅丢弃尚未暂存的改动

执行以下两个命令中的 任何一个 都可以丢弃 尚未暂存 的改动

git restore <file>
## 或者
git checkout <file>

注意事项

  • 执行命令时,需要将 <file> 替换为您想指定的文件(例如 f.txt\text{f.txt}f.txt
  • 如果您是第一次使用它们,请不要用重要的项目来进行试验,以防误操作(尚未暂存 的改动被丢弃之后就找不回来了)

丢弃 已暂存 的改动 + 尚未暂存 的改动

执行以下两个命令中的 任何一个 都可以丢弃 已暂存 的改动 + 尚未暂存 的改动

git restore --staged --worktree <file>
## 或者
git checkout HEAD <file>

注意事项

  • 执行命令时,需要将 <file> 替换为您想指定的文件(例如 f.txt\text{f.txt}f.txt
  • 如果您是第一次使用它们,请不要用重要的项目来进行试验,以防误操作(已暂存/尚未暂存 的改动被丢弃之后就找不回来了)

正文

示例

准备工作

请将以下代码保存为 main.sh (具体的名称并不重要)

## Prepare a temp dir for our test
mkdir temp
cd temp

## Prepare for the initial commit
git init
echo "Content committed" >> f.txt
git add f.txt
git commit -m "initial commit"

## Stage some content in f.txt
echo "Staged content in f.txt" >> f.txt
git add f.txt

## Add some content to be staged in f.txt
echo "Content to be staged ..." >> f.txt

通过执行下方的命令就可以运行 main.sh ⬇️

bash main.sh

运行完 main.sh 之后,当前目录中会多出一个 temp 目录。在当前目录执行 tree temp 命令后,应该可以看到如下的内容

temp
└── f.txt

1 directory, 1 file

通过执行如下命令,可以切换到 temp 目录中 ⬇️

cd temp

temp 目录中,我们执行如下命令就可以看到 f.txt\text{f.txt}f.txt 的状态

git status

执行该命令后,可以看到 f.txt\text{f.txt}f.txt 中既有 已暂存 的改动(如下图绿色框所示),也有 尚未暂存 的改动(如下图红色框所示)

各个状态的 f.txt\text{f.txt}f.txt 的内容列举如下

内容
commit\text{commit}commitf.txt\text{f.txt}f.txtContent committed
已暂存的 f.txt\text{f.txt}f.txtContent committed
Staged content in f.txt
当前的 f.txt\text{f.txt}f.txtContent committed
Staged content in f.txt
Content to be staged ...

如果我们想让 f.txt\text{f.txt}f.txt 变回下图红框里的这个样子,那么只需要丢弃 尚未暂存 的改动

如果我们想让 f.txt\text{f.txt}f.txt 变回下图绿框里的这个样子,那么需要丢弃 已暂存 的改动 + 尚未暂存 的改动

我们分别来看

情形一:仅丢弃尚未暂存的改动

请注意:尚未暂存 的改动被丢弃之后就找不回来了

第一种方式:基于git restore\text{git restore}git restore命令

我们可以用 git restore\text{git restore}git restore 命令来丢弃 f.txt\text{f.txt}f.txt 中尚未暂存的改动

git restore f.txt

执行该命令后,我们再用 git status\text{git status}git status 命令和 cat f.txt\text{cat f.txt}cat f.txt 命令验证一下

从红色框的内容可以看出,f.txt\text{f.txt}f.txt 的变化符合预期。

第二种方式:基于git checkout\text{git checkout}git checkout命令

我们也可以用 git checkout\text{git checkout}git checkout 命令来丢弃 f.txt\text{f.txt}f.txt 中尚未暂存的改动

git checkout f.txt

执行该命令后,可以再用 git status\text{git status}git status 命令和 cat f.txt\text{cat f.txt}cat f.txt 命令验证一下

从红色框的内容可以看出,f.txt\text{f.txt}f.txt 的变化符合预期。

情形二:丢弃 已暂存 与 尚未暂存 的改动

请注意:已暂存/尚未暂存 的改动被丢弃之后就找不回来了

第一种方式:基于git restore\text{git restore}git restore命令

我们可以用 git restore\text{git restore}git restore 命令来丢弃 f.txt\text{f.txt}f.txt已暂存 的改动 + 尚未暂存 的改动

git restore --staged --worktree f.txt

执行该命令后,我们再用 git status\text{git status}git status 命令和 cat f.txt\text{cat f.txt}cat f.txt 命令验证一下 ⬇️

从红色框的内容可以看出,f.txt\text{f.txt}f.txt 的变化符合预期。

第二种方式:基于git checkout\text{git checkout}git checkout命令

我们也可以用 git checkout\text{git checkout}git checkout 命令来丢弃 f.txt\text{f.txt}f.txt已暂存 的改动 + 尚未暂存 的改动

git checkout HEAD f.txt

执行该命令后,我们再用 git status\text{git status}git status 命令和 cat f.txt\text{cat f.txt}cat f.txt 命令验证一下 ⬇️

从红色框的内容可以看出,f.txt\text{f.txt}f.txt 的变化符合预期。

参考资料

Git Cheat Sheet

下图中的内容与本文有关

git restore 命令的文档

下图红色框中的内容和本文有关

git checkout 命令的文档

下图红色框中的内容和本文有关

以上就是Git丢弃对一个文件的改动的方法详解的详细内容,更多关于Git丢弃文件改动的资料请关注脚本之家其它相关文章!

相关文章

  • 搭建websocket消息推送服务,必须要考虑的几个问题

    搭建websocket消息推送服务,必须要考虑的几个问题

    面对各种新场景对websocket功能和性能越来越高的需求,不同的团队有不同的选择,下面给大家分享构建websocket服务时必须要考虑的一些技术特性以及能显著提高用户体验的功能,感兴趣的朋友跟随小编一起看看吧
    2020-04-04
  • 关于base64编码的原理及实现方法分享

    关于base64编码的原理及实现方法分享

    我们的图片大部分都是可以转换成base64编码的data:image。 这个在将canvas保存为img的时候尤其有用
    2012-03-03
  • sqoop如何指定pg库的模式(方法详解)

    sqoop如何指定pg库的模式(方法详解)

    sqoop是一个用来将hadoop中hdfs和关系型数据库中的数据相互迁移的工具,可以将一个关系型数据库(mysql、oracle等)中的数据导入到hadoop的hdfs中,也可以将hdfs的数据导入到关系型数据库中,本文给大家介绍sqoop如何指定pg库的模式,一起看看吧
    2022-01-01
  • http 200、301、304等状态码详解

    http 200、301、304等状态码详解

    在利用httpwatch进行抓包分析时,我们经常会看到200、301、304这几个状态码。具本三者是什么意思呢?这里脚本之家小编就为大家介绍一下
    2017-07-07
  • git远程操作异常:correct access rights问题及解决

    git远程操作异常:correct access rights问题及解决

    这篇文章主要介绍了git远程操作异常:correct access rights问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • vscode使用restClient实现各种http请求的操作方法

    vscode使用restClient实现各种http请求的操作方法

    这篇文章主要介绍了vscode使用restClient实现各种http请求的操作方法,定义变量以及使用环境变量和返回数据作为变量的操作代码,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • 详解Git 的 rebase 命令使用方法

    详解Git 的 rebase 命令使用方法

    这篇文章主要介绍了Git 的 rebase 命令使用方法,接下来,我们使用rebase命令,其命令一般形式为git rebase feature,即表示在 master 分支上执行rebase命令,将 feature 分支的代码合并到 master 分支,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • VS2019无法启动程序(系统找不到指定文件)解决办法

    VS2019无法启动程序(系统找不到指定文件)解决办法

    这篇文章主要介绍了VS2019无法启动程序(系统找不到指定文件)解决办法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 用户权限管理设计[图文说明]

    用户权限管理设计[图文说明]

    用户管理权限设计一直是大家讨论的热点,因为几乎涉及到每一个开发的业务系统。我找了很多很多的资料,大家的核心基本上都是一样的:基于角色管理. 用户,角色,模块,权限的相互组合,就可以形成一个强大的权限管理系统。
    2008-12-12
  • 一文详解Git中分支本地和远程删除的方法

    一文详解Git中分支本地和远程删除的方法

    在使用 Git 进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧
    2025-06-06

最新评论