众所周知,现在Git属于比较流行的版本控制工具,但是我们在使用Git的过程中难免会遇到提交错误情况,比如小编曾经把IDEA的配置文件和项目一起提交到远程仓库了,当时简单粗暴地把整个仓库删了,太暴力了。今天我们来尝试一种更加优雅的方式,让代码回到提交以前的样子。
在正式讲述优雅的方式之前,我们先来看下一个文件的旅程,从本地到远程仓库需要经历哪些区域呢?Git主要可以划分以下几个文件区域:工作区、暂存区、本地仓库、远程仓库。一开始我们在工作区创建修改文件,新来的小文件一般需要经历 git add,然后进入暂存区,这算是上了Git版本控制的贼船了,暂存区的文件想要进入本地仓库就需要 git commit,此时还需要提交一份文件说明。最后通过 git push把文件推送到远程仓库。
我们来一步一步的玩,首先是添加到暂存区还没有提交到本地仓库的文件该怎么撤回呢?这时候我们可以直接使用 git reset命令,此命令可以直接把所有添加到暂存区未提交的文件撤回到工作区。
接着是已经提交到本地仓库的文件,我们可以通过git log查看提交日志的。这里我们常用的撤回可以分为下面两种,一是把文件撤回到暂存区,二是把文件撤回到工作区。
1、文件撤回到暂存区git reset--soft XXX(版本号)
比如我们把版本从c2撤回到c1版本,则可以使用此命令 git reset--soft c1,此时从c1版本到c2版本之间提交的所有文件都会被打到暂存区,但是并不会修改你本地的文件内容,你可以继续提交。
2、文件撤回到工作区git reset--mixed XXX(版本号)
比如我们把版本从c2撤回到c1版本,则可以使用此命令 git reset--mixed c1,此时从c1版本到c2版本之间通过添加提交到本地仓库的文件都会回到工作区,已经在本地仓库,版本迭代期间修改内容的文件回到暂存区,但是并不会修改你本地的文件内容,你可以继续操作。
3、撤销所有提交git reset--hard XXX(版本号)
这个命令可以说是硬核操作,不仅会撤销提交的操作,还会更改你本地文件,同样那c1和c2版本举例子,
- 此操作会把c1到c2版本之间所有添加暂存区并提交到本地仓库的文件删除掉,
- 版本更新期间修改内容的文件会把内容还原到c1版本,文件回到工作区。
- 所有添加到暂存区未提交到本地仓库的文件会被删除
- 未添加到暂存区的文件不受影响,因为他们还没有搭上Git版本控制的贼船
- 此操作执行之后,回收站都找不到。
关于 git reset
的命令还有 git reset--merge
、 git reset--keep
,可以自己去查一查。
那么提交到远程仓库的文件该怎么办呢? git reset只对本地的文件有作用,对远程仓库上就是无效的了。这时候就需要新的命令 git revert,这个可以理解成回退到某个版本,并且生成一个新的版本,此时并不会修改之前的提交信息。git revert是版本的回退,但却是一次新的提交信息,将本地代码回退到指定版本,这时候你可以 git push把线上的代码更新一下。
有时候使用 git reset--hard也可以达到更改远程仓库的目的,但是在多人操作的时候,你想要撤回某次提交,要留点痕迹,不然可能会出大问题。总之,提交容易,撤销的时候要多加注意了。
收录于合集 #Git学习笔记
上一篇Git合并单个文件时的命令都是什么含义呢?