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

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

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

在日常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中reset, restore and revert指令的区别_第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中reset, restore and revert指令的区别_第2张图片
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看一下状态
GIT中reset, restore and revert指令的区别_第3张图片
(2)打开a.c添加点内容(原本内容是aaa)
GIT中reset, restore and revert指令的区别_第4张图片
(3)再用git status看一下状态
GIT中reset, restore and revert指令的区别_第5张图片
此时a.c的状态是刚刚更改过,但是还没有用git add指令添加到暂存区中,也就是说a.c目前处于工作区下。

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

git restore a.c

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

git restore --staged

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

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

你可能感兴趣的:(SCM-Git,git)