撤销修改(撤销本地工作区的修改)

本文介绍如何使用Git命令撤销文件修改,包括未提交到暂存区的本地修改和已暂存但未提交的修改。提供了具体步骤和实例,帮助读者掌握Git的基本撤销操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

情形一:只是在本地对文件进行了修改,且本次修改还没有git add到暂存区。

  1. 可以手动地在本地修改之前更改后的文件,手动把文件恢复到上一个版本的状态。
  2. 可以使用 git checkout -- file 命令,来丢弃工作区的改动

假如我在README.md中写了下面的话:

下面的内容可能会导致自己丢饭碗
I have a stupid boss!

命令git checkout -- README.md意思就是,把README.md文件在工作区的修改全部撤销,这里有两种情况:
一种是README.md自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git checkout 没有 – 是切换分支的功能。

情形二:在假定是凌晨3点,你不但写了一些胡话,还git add到暂存区了,现在需要撤销在暂存区中的修改,同时丢弃工作区的修改。

分两步:
1.把暂存区的修改撤销掉(unstage),重新放回工作区**

git reset HEAD file

比如,我项目里有大量的图片数据,之前错误的使用了git add -A指令,导致所有的图片都被git所管理了。这个时候,我可以使用git reset HEAD *.jpg,这样图片就从暂存区中撤销了,不再被git所管理。

2.丢弃工作区的修改

git checkout -- file 

比如我本地新建了一个Delete_stage_repository.txt文档,我git add添加到暂存区,但是还没有commit,这个时候我想清空暂存区的内容,就可以
使用git reset HEAD Delete_stage_repository.txt。然后再使用git status查看状态,显示以下信息:

位于分支 master
您的分支领先 'origin/master' 共 2 个提交。
  (使用 "git push" 来发布您的本地提交)
未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)
    Delete_stage_repository.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

说明新建Delete_stage_repository.txt文档这一修改已经在暂存区中被清空了

### 如何使用 Git 撤销已做的修改 #### 工作区修改撤销 当需要丢弃工作区中的未提交修改时,可以通过以下命令实现: ```bash git checkout -- <file> ``` 或者使用更现代的方式: ```bash git restore <file> ``` 这两条命令的作用相同,都是用于恢复指定文件的工作区状态至最近一次提交的内容[^1]。 #### 暂存区的修改撤销 如果已经通过 `git add` 将更改添加到了暂存区,但尚未提交,则可以使用以下命令将其从暂存区移除: ```bash git reset <file> # 只针对某个文件 git reset # 针对所有文件 ``` 此操作不会影响工作区的状态,仅清除暂存区的变化[^2]。 #### 提交后的撤销方式 对于已经完成的提交,有多种方式进行撤销: ##### 1. **硬重置 (Hard Reset)** 硬重置会将当前分支回滚到指定版本,并丢失该版本之后的所有更改(包括工作区和暂存区)。例如: ```bash git reset --hard <版本号> ``` 这里的 `<版本号>` 是目标提交的哈希值,可通过 `git log` 查看历史记录获取。需要注意的是,`--hard` 参数会导致不可逆的数据损失,因此需谨慎操作[^4]。 另外,也可以直接同步远程仓库的最新状态作为基准来强制更新本地分支: ```bash git reset --hard origin/<分支名> ``` ##### 2. **软重置 (Soft Reset)** 相比之下,“软重置”更加安全,因为它只改变 HEAD 指针的位置而不删除任何实际改动内容。适用于希望保留现有变更以便稍后再处理的情况: ```bash git reset --soft <版本号> ``` ##### 3. **反向提交 (Revert Commit)** 不同于上述两种方法直接抹去特定的历史记录,`revert` 命令会在不破坏原有时间线的前提下新增一条反转原提交效果的新纪录: ```bash git revert <commit-hash> ``` 这种方式特别适合多人协作场景下修正错误而无需担心干扰他人进度的情形[^3]。 #### 推送回退版本到远程服务器 在某些情况下可能还需要把调整过的本地库推送到远端共享给团队成员们知晓最新的进展状况。然而由于默认机制不允许强行覆盖已有数据所以得额外附加选项才能达成目的: ```bash git push origin <分支名> --force ``` ### 注意事项 - 执行涉及 `--hard` 的指令前务必确认无误以免造成重要资料遗失。 - 定期保存副本以防万一发生意外情况能够迅速回复正常运作环境。 - 在公共合作型项目里推荐优先考虑采用 `revert` 而不是简单粗暴地删减过往动作轨迹。 ```python # 示例 Python脚本片段展示如何自动化部分流程(仅供参考学习用途) import os def undo_last_commit(): os.system('git reset --soft HEAD~1') undo_last_commit() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值