GIT中reset, restore and revert指令的区别

本文详细介绍了Git中的gitreset、gitrevert和gitrestore命令,包括它们各自的功能、使用场景及区别。gitreset通过移动分支指针回退提交,可以软、混合、硬三种方式操作。gitrevert则是创建一个新的提交来撤销之前的更改,保留提交历史。gitrestore用于撤销工作区或暂存区的更改,不改变提交历史。理解这些命令有助于更有效地管理Git仓库。

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

工作区、暂存区、本地仓库、远程仓库,之间的联系
在这里插入图片描述

—————————————————————————————————————————

在日常git工作流中,经常涉及到回退暂存区、回退工作区等撤销操作。
有三个名称相似的命令:git reset,git restore和git revert。

  • git-revert 是进行新的提交,以还原其他提交所做的更改。
  • git-restore 使得在工作空间但是不在暂存区的文件撤销更改(内容恢复到没修改之前的状态)
  • git restore --staged 是将暂存区的文件从暂存区撤出,但不会更改文件的内容
  • git-reset是关于更新分支,移动顶端(tip)以便从分支中添加或删除提交。 此操作更改提交历史记录。
    git reset也可以用来还原索引,与git restore重叠。

git reset

通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。

注:这种只对本地分支有效,对远程分支无效。

如下所示,我们通过git reset HEAD~1命令回退分支记录
在这里插入图片描述
结论:

  • Git 把 master 分支移回到 C1;现在我们的本地代码库根本就不知道有 C2 这个提交了。
  • 在reset后, C2 所做的变更还在,但是处于未加入暂存区状态。
  • git reset a.txt 相当于git add a.txt的逆操作,如果a.txt时新建文件,则不起作用

场景:撤销commit

本地git add 之后,git commit了,但需要撤销本次commit动作
git reset --soft HEAD^
这样就成功的撤销了你的commit
注意, 仅仅是撤回commit操作,您写的代码仍然保留。
HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2

reset 其他参数

–mixed
不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。

–soft
不删除工作空间改动代码,撤销commit,不撤销git add .

–hard
删除工作空间改动代码,撤销commit,撤销git add .
注意完成这个操作后,就恢复到了上一次的commit状态。

另外要注意:撤销指定commit,之后的所有提交都被删掉,如果在错误那次commit之后已经有其他commit,仅仅删掉或撤销那一次commit用指令:

git rebase -i HEAD~5

这个时候,远程分支高于本地分支版本:
git push origin branch --force
——————————————————————————————

git revert

如下图所示,我们通过git revert HEAD命令进行撤销
在这里插入图片描述
git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销
作为一次最新的提交

* git revert HEAD                  撤销前一次 commit
* git revert HEAD^               撤销前前一次 commit
* git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。

git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容

结论: 在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2’ 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2’ 的状态与 C1 是相同的。
revert 之后就可以把你的更改推送到远程仓库与别人分享。

以上介绍了reset 和 revert之后,下边看下二者的区别
git revert 和 git reset的区别

  1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
  2. 在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
  3. git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

——————————————————————————————————

git restore指令

(1)先用git status看一下状态
在这里插入图片描述
(2)打开a.c添加点内容(原本内容是aaa)
在这里插入图片描述
(3)再用git status看一下状态
在这里插入图片描述
此时a.c的状态是刚刚更改过,但是还没有用git add指令添加到暂存区中,也就是说a.c目前处于工作区下。

(4)使用git restore,也就是:

git restore a.c

(5)用git status看一下状态
在这里插入图片描述
(6)最后看一下a.c中的内容
在这里插入图片描述
结论:
git restore指令使得在工作空间但是不在暂存区的文件撤销更改(内容恢复到没修改之前的状态)
等同于git checkout file 一样的效果,将工作区修改的文件内容回撤掉

git restore --staged

使用git add a.c 之后,add到暂存区,使用git restore --staged之后,文件修改的内容并没有改变。

结论:
git restore --staged的作用是将暂存区的文件从暂存区撤出,但不会更改文件的内容,即本地工作区中文件被修改内容还在。

### Git中恢复提交或撤回某个Commit的方法 #### 使用`git revert` 当希望保留历史记录并创建一个新的提交来撤销之前的更改时,可以选择使用 `git revert` 命令。此方法不会改变现有的提交历史,而是通过增加新的提交来回滚指定的变更[^1]。 ```bash git revert <commit-hash> ``` 这将在项目的历史中添加一条新纪录,表示已取消特定提交所带来的改动。 #### 利用`git rebase` 对于那些不介意重写提交历史的情况,则可采用交互式的rebase方式。这种方式允许直接移除不需要的提交而不留下痕迹。需要注意的是,在公共分支上执行此类操作可能会给其他协作者带来麻烦,因此应当谨慎行事。 ```bash git rebase -i HEAD~n ``` 这里的 n 是指要编辑最近多少个提交;在打开的文本编辑器里标记出想要删除或者修改的提交项前缀为 drop 或 edit 即可完成相应动作。 #### 应用`git reset` 如果仅需简单地丢弃最新的若干次本地未推送至远程仓库的提交,那么最简便的办法莫过于运用 `git reset` 。依据不同的需求场景,有三种模式可供选择: - **Soft**: 只移动HEAD指向的位置,工作区和暂存区保持不变; - **Mixed**(默认): 移动HEAD的同时清空索引文件(即暂存区域),但是工作树不做任何变动; - **Hard**: 将当前目录下的所有内容都还原到目标提交的状态,包括已经跟踪过的文件以及尚未被加入版本控制的新文件。 具体命令如下所示: ```bash git reset --soft|mixed|hard HEAD~m ``` 其中 m 代表欲返回至上数第几个父级节点处停止。 另外,在IDEA环境中也能够方便快捷地处理这类情况——无需手动输入繁琐的指令就能轻松达成目的[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值