Git操作文件的时候手贱了,怎么恢复?

2024-03-21 14:08
文章标签 恢复 操作 怎么 git 手贱

本文主要是介绍Git操作文件的时候手贱了,怎么恢复?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们在使用git的过程当中很难避免的一点就是手贱,因为人嘛总有犯错疏忽的时候,有时候一不小心就操作错了。我也经常遇到这种情况,所以这时候对git的了解和掌握就非常重要,即使操作错了,我们也可以通过git还原到我们希望它变成的状态。下面我们来看几个例子,来实际体验一下git的强大。

不小心add错了

这是一个非常非常容易出现的问题,我自己也经常遇到。有时候编译出了二进制文件,明明知道是不应该添加进git管理的。因为添加进来之后会使得整个repo变得非常大,别人clone和pull都非常费劲。而且前面也说过了,一旦commit之后,即使你删除了,这份文件依然还是会保存在git仓库当中。

所以如果我们发现不小心把一个我们的测试文件也一起add进来了,我们commit了之后才发现。这个时候应该怎么办?

我们来实际操作一下,比如我们创建了一个叫做a.test的文件用来测试。结果测试完成之后忘记了删除,直接commit了。这个时候我们要把它删除,应该怎么做呢?

我们要做的就是把它删除,有人会说我们直接rm -rf删除不行吗?我们试试看就知道了。

这样删除了之后你会发现它会提示你,说这个改动没有被commit,因为我们只是删除了操作系统当中的文件,并没有删除git仓库当中已经储存的文件。所以只是这样删除了之后,即使我们再次commit提交,git会记录成一次对这个文件的删除操作。虽然我们看不到这个文件了,但是它仍然在git当中占据空间。

所以要删除只能使用git rm命令来进行,它会将文件从git版本管理以及文件系统当中一起移除。当我们提交之后,从下一个提交开始,这个文件就不会被存储一份了。

这里有一个小问题是为什么会从下一个版本开始?因为我们做的事情只是从git中删除掉文件,而不是撤销add文件的操作。所以git当中会记录两条,一条是记录了添加文件,一条是删除了文件。比如说我们在add file的commit当中提交了文件,在delete file的commit当中删除了文件,在delete以及之后的提交当中,是没有这个文件的记录的,但是在add file这个commit当中这个记录仍然存在。

所以问题来了,如果我就想把这个文件从git仓库当中完全删除,一点记录都不留下呢?其实也简单,我们只需要在commit的时候加上–amend参数即可。–amend表示不提交新的commit而是在当前的commit上修补,这样相当于add file和delete file的commit合并成了一个,那么这个文件的记录也就不存在了。

不过使用–amend需要小心,如果记录已经push过远程,会导致和远程的记录不吻合。这个时候需要使用git push -f来强行push。但是强行push会覆盖远程的commit,可能导致其他人代码的混乱,是一个非常危险的操作,请一定谨慎

只想撤销,不想删除

除了我们不小心提交了本该要删除的内容,还有一种很常见的情况是我们的文件是很重要的,但是我们不想提交到git。比如我们编译出来的二进制文件,它们都是要用到的,只是不应该被push到git而已。我们在add了之后才发现add错了文件,于是我们想要撤销,有办法吗?

比如这个时候我们已经add了文件,但是还没有commit,我们想要把这个a.test文件从暂存区删除,这样就不会被记录下来了。我们应该怎么做呢?

其实很简单,也是通过git rm命令。因为这个时候还没有commit,也就是说这个文件还没有被提交进git仓库当中,我们只需要把它从暂存区移除就可以了。如果使用git rm命令,它既会从暂存区移除,也会从本地删除文件。我们不想删除本地的文件,这个时候我们只需要加上一个参数–cached,表示我们只想移除已经缓存在git暂存区的内容。

我们发现这个文件回到了被add之前的状态。

但假如我们不小心已经commit了,已经提交进git仓库了之后才发现,这个时候应该怎么办?

这个时候我们需要做的是撤销这个commit,给我们一次重新来过的机会。我们使用的命令是git reset --soft HEAD^,git reset命令非常危险,我们操作的时候需要谨慎。如果不小心用了–hard参数会回滚所有的操作,直接恢复到某一个commit时的状态。比如说我们当前在version3,我们回到了version1,如果使用–hard操作的话,version2和version3的所有改动都会丢失。因此一定谨慎使用–hard,最好使用–mixed或者是–soft,它不会修改本地的文件。关于这两个的区别,我们将会以后在介绍git reset命令的时候详细介绍。

这里的HEAD指的是当前git节点的指针,HEAD^表示的是上一个版本。当然我们也可以用commitid来代替。

我们发现一切都恢复到了illustrate unstage commit这个提交之前的状态,那么我们只需要从缓存当中删除a.test,再次提交即可。

这么操作完了之后你会发现在git log当中illustrate unstage commit这个提交不见了。的确如此,因为它被我们撤销了,同样,reset操作也会导致本地和远程状态不一样。如果要push的话也需要-f强制进行,这也是一个危险的操作,一定要谨慎。

撤销修改

加入我们想要撤销的不是一个文件,而是一次修改呢?就比如我们git add了之后才发现某一个文件的修改错了,我们想要把它恢复到之前的状态,这时候应该怎么操作呢?

我们在第五篇里加上了一行废话,但是等我们git add了之后才发现第五篇里有这么一个无用的改动。这时候应该怎么操作呢?

这个时候我们想要做的是撤销这个文件的修改,如果我们只是要把它从暂存区中移除来恢复到git add之前的状态,我们可以使用git reset,但是这个文件当中的修改依然还是存在。这个时候我们可以用一个命令叫做checkout,这个命令有很多种用途,我们先介绍其中的一种。

我们可以使用git checkout – filename来回滚某一个文件的改动,注意这个也是一个危险操作,它会直接将文件恢复到之前提交的状态。中间的改动会全部丢失,因此一定要想好了再操作。在git当中有一个原则,只要是提交过的内容几乎都是可以找回的,而没有提交的内容丢失之后就很难找回了,因此对于这种改变没有提交内容的命令,我们一定要小心。

最后我们来看下效果,我们checkout之后,第五篇文章当中的改动真的消失了。不仅是从暂存区消失了,就连文件本身当中的改动也不见了。

到这里我们常见的几种需要撤销改动的场景以及对应的方法就逗介绍完了,对于新手来说,这些命令应该是非常常用的。虽然其中的一些操作说起来危险,但是只要我们想清楚了再操作,三思而后行,是可以避免悲剧发生的。而且操作危险的命令我感觉更加提升我们的能力,因为小心谨慎会逼迫你加深理解。

好了,今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发

原文链接,求个关注

在这里插入图片描述

这篇关于Git操作文件的时候手贱了,怎么恢复?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/832844

相关文章

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Python中操作Redis的常用方法小结

《Python中操作Redis的常用方法小结》这篇文章主要为大家详细介绍了Python中操作Redis的常用方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解一下... 目录安装Redis开启、关闭Redisredis数据结构redis-cli操作安装redis-py数据库连接和释放增

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允