如何在 Git 中撤消最近的本地提交?

简介: 如果不小心将错误的文件提交到 Git,但尚未将提交推送到服务器。如何从本地仓库撤消这些提交?你完成了一次简单的提交 git 操作,但经过一些推送前的检查,发现存在很多问题,需要重新修改,需要撤消此次操作。如果,你是一个很熟悉 git 操作的人来说,这很简单,反之,希望你能好好看看此文。

你完成了一次简单的提交 git 操作,但经过一些推送前的检查,发现存在很多问题,需要重新修改,需要撤消此次操作。如果,你是一个很熟悉 git 操作的人来说,这很简单,反之,希望你能好好看看此文。

git 中的 head 与本地文件的关系

HEAD 是当前分支引用的指针,它总是指向某次commit,默认是上一次的commit。 这表示 HEAD 将是下一次提交的父结点。 通常,可以把 HEAD 看做你的上一次提交的快照。当然HEAD的指向是可以改变的,比如你提交了commit,切换了仓库,分支,或者回滚了版本,切换了tag等。
从这一点来看,head 和本地文件的状态可以说存在千丝万缕关系,但,我们不能说,head 的指针指向的文件状态和当前文件的状态一致,这得取决于你每一次的 git 操作。为方便说明,作以下假设:
假设你有这个,其中 C 是你的 HEAD,(F)是你的文件的状态。A、B 都是之前的提交状态。

   (F)
A-B-C
    ↑
  master

现在有以下几种撤销 C 提交的方案可以选择:

  1. 在撤销 C 提交后,保留 C 提交时的文件状态
  2. 在撤销 C 提交后,不保留 C 提交时的文件状态

方案一:git reset --hard

由于 C 提交方案彻底错误,无需在原文件上继续修改,需要回到某个提交状态下,才能继续修改,故在撤销 C 提交后,不保留 C 提交时的文件状态,如下:

 (F)
A-B
  ↑
master

操作方法:git reset --hard HEAD~1

方案二:git reset --soft

或许,C 提交方案并不是完全不可取,而是需要在其现有基础上进行修改,但并不需要保留过多提交的中间过程,所以需要回退到某次提交版本,并保留当前文件状态,即在撤销 C 提交后,不保留 C 提交时的文件状态。如下:

   (F)
A-B-C
  ↑
master

操作方法: git reset --soft

补救措施

如果,进行撤销操作后,又发现,其实 C 提交也有可取之处,需要回退此次提交,那该怎么办呢?

  1. 查找提交的所有提交修改记录的哈希ID:git reflog
  2. 恢复了该提交::git checkout -b someNewBranchName shaYouDestroyed

注:提交实际上不会在大约 90 天内在 Git 中被销毁,因此通常可以返回并挽救一个不想删除的提交。

目录
相关文章
|
安全 Java API
Java一分钟之——Java模块系统:模块化开发(Jigsaw)
【5月更文挑战第20天】Java 9引入了Jigsaw模块系统,改善代码组织和依赖管理。模块通过`module-info.java`定义,声明名称、导出包及依赖。常见问题包括依赖循环、未声明依赖和过度导出。避免这些问题的策略包括明确声明依赖、谨慎导出包和避免循环依赖。通过实例展示了模块间的关系,强调理解模块系统对于构建整洁、安全和可维护的Java应用的重要性。
211 5
|
存储 监控 安全
DOS 拒绝服务攻击及其预防和缓解方法
【8月更文挑战第20天】
1335 0
|
存储 人工智能 安全
|
缓存 网络协议 Serverless
阿里云CDN简介和使用流程
本文档介绍了如何在阿里云上配置和使用CDN服务。首先,需要注册并实名认证阿里云账号,然后购买CDN服务。接着,添加要加速的域名,通过CDN控制台和阿里云云解析DNS进行配置,并验证CNAME设置是否生效。之后,配置源站信息,可以选择OSS域名、IP、源站域名或函数计算域名作为源站。最后,设置缓存规则,如缓存过期时间、状态码过期时间、自定义HTTP响应头等,以优化资源访问效率。
阿里云CDN简介和使用流程
|
C#
C#如何实现窗体最小化到托盘
C#如何实现窗体最小化到托盘
338 0
|
PyTorch 算法框架/工具 并行计算
PyTorch 2.2 中文官方教程(二十)(3)
PyTorch 2.2 中文官方教程(二十)
330 0
|
SpringCloudAlibaba 负载均衡 Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(五)OpenFeign的使用
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(五)OpenFeign的使用
299 0
|
XML 缓存 前端开发
HTTP协议:当下最主流的应用层协议之一,你确定不了解一下吗?
HTTP协议:当下最主流的应用层协议之一,你确定不了解一下吗?
HTTP协议:当下最主流的应用层协议之一,你确定不了解一下吗?
|
tengine Linux 应用服务中间件
基于 Alpine 环境源码构建 alibaba-tengine(阿里巴巴)的 Docker 镜像
当前 alibaba-tengine 发布版本为 v3.0.0,github 源码地址:https://github.com/alibaba/tengine/releases/tag/3.0.0
1021 2
|
负载均衡 前端开发 Java
聊聊 Spring Cloud 全链路灰度发布 方案~
聊聊 Spring Cloud 全链路灰度发布 方案~

热门文章

最新文章