git reset 的三种模式

一、前提

参考:建议先阅读:Git Reset 三种模式

这篇文章只是我的的一个笔记

二、三种模式

  • git reset --soft
  • git reset --mixed
  • git reset --hard
    git reset 的三种模式

这三个模式理解了,对于使用这个命令很有帮助。在理解这三个模式之前,需要略微知道一点Git的基本流程。正如上图,Git会有三个区域:

  • Working Tree 当前的工作区域
  • Index/Stage 暂存区域,和git stash命令暂存的地方不一样。使用git add xx,就可以将xx添加近Stage里面
  • Repository 提交的历史,即使用git commit提交后的结果

三、reset三种模式区别和使用场景

1.--soft

--soft 重置位置的同时,保留working Tree工作目录index暂存区的内容,只让repository中的内容和 reset 目标节点保持一致,因此原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files)。所以效果看起来就是工作目录的内容不变,暂存区原有的内容也不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中。

场景1:当你连续commit多个版本时,觉得这几个commit提交不具有太大意义,可以通过git reset --soft 版本号将这些commit合并为一个commit进行提交。

a)这里准备了几个历史commit提交进行测试

git reset 的三种模式

b)回退版本,通过git reset --soft 版本号回退,然后强制进行提交

$ git log -3   #查看历史提交记录
commit 09727f64ca0d422e5aa90e1838f8b1249fea1a9a (HEAD -> master, origin/master, origin/HEAD)
Date:   Wed Jul 7 20:10:20 2021 +0800

    提交4

commit 5193b8066585f387d391b5dd900e5a305be79dbb
Date:   Wed Jul 7 20:09:01 2021 +0800

    提交3

commit 63b99f3c46f8259a28bce0d860d3e66a626f744e
Author: sunchao <15292080775@163.com>Date:   Wed Jul 7 20:08:48 2021 +0800

    提交2
$ git reset --soft 63b99f3c46f8259a28bce0d860d3e66a626f744e		#回退到历史版本2

$ git commit -m "提交4"	#添加到本地仓库

$ git push --force		 #强制提交
此时再来看版本信息,**提交2**已经被覆盖了

git reset 的三种模式

场景2:当我们commit一个提交,但是这个提交并没有被push,我们不需要这个commit,可以通过git reset --soft清除这个没有pushcommit

a)这里提交commit了一个未push的提交

git reset 的三种模式

b)通过git reset --soft 版本号进行回退

$ git log -2
commit f540f2be7c765da3b88e8a0a385d0d4ce9650583 (HEAD -> master)
Date:   Wed Jul 7 20:35:16 2021 +0800

    提交5

commit 0a8f7ec9d568e16766aef5e35e6513f92aa76306 (origin/master, origin/HEAD)
Date:   Wed Jul 7 20:27:44 2021 +0800

    提交4

$ git reset --soft 0a8f7ec9d568e16766aef5e35e6513f92aa76306  #回退到提交4

可以发现,这个没有pushcommit已经不存在了

git reset 的三种模式

2.--mixed

--mixed 重置位置的同时,只保留Working Tree工作目录的內容,但会将 Index暂存区Repository 中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入Working Tree工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。

场景:当你连续commit多个版本时,觉得这几个commit没有意义可以合并时,通过git reset --soft 版本号进行回退

a)测试日志记录如下

git reset 的三种模式

b)通过git reset --soft 版本号进行回退

$ git log -3			#查看历史记录
commit e5b2ba1742b1c0223ff21c13603a7d1b6bec6ff0 (HEAD -> master, origin/master, origin/HEAD)
Date:   Wed Jul 7 20:44:05 2021 +0800

    提交5

commit 0a8f7ec9d568e16766aef5e35e6513f92aa76306
Date:   Wed Jul 7 20:27:44 2021 +0800

    提交4

commit 63b99f3c46f8259a28bce0d860d3e66a626f744e
Date:   Wed Jul 7 20:08:48 2021 +0800

    提交2

$ git reset 63b99f3c46f8259a28bce0d860d3e66a626f744e		#回退到提交2
Unstaged changes after reset:
M       README.md

$ git add .		#将修改内容添加到暂存区			

$ git commit -m "测试提交5"			#提交到本地仓库
[master dc8407a] 测试提交5
 1 file changed, 1 insertion(+), 1 deletion(-)

$ git push --force		#强制提交

git reset 的三种模式

3.--hard

--hard:重置位置的同时,直接将 working Tree工作目录index 暂存区repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。

场景:要放弃目前本地的所有改变時,即去掉所有add到暂存区的文件和工作区的文件,可以执行 git reset -hard HEAD 来强制恢复git管理的文件夹的內容及状态;真的想抛弃目标节点后的所有commit(可能觉得目标节点到原节点之间的commit提交都是错了,之前所有的commit有问题)

a)测试日志
git reset 的三种模式

b)git reset -hard 版本号 进行回退

$ git log -3
commit 167c5f9b9d60e270e7850004fd0dd7f9fe5131d3 (HEAD -> master, origin/master, origin/HEAD)
Date:   Wed Jul 7 20:56:03 2021 +0800

    提交6

commit dc8407a1f9a68cdc2f66b53299d8030ee62bfdba
Date:   Wed Jul 7 20:49:35 2021 +0800

    测试提交5

commit 63b99f3c46f8259a28bce0d860d3e66a626f744
Date:   Wed Jul 7 20:08:48 2021 +0800

    提交2
    
$ git reset --hard dc8407a1f9a68cdc2f66b53299d8030ee62bfdba
HEAD is now at dc8407a 测试提交5

c)查看差异
git reset 的三种模式
ba结尾的版本就是我们回退的版本,说明工作目录已经回退
git reset 的三种模式
d) 此时我们可以修改以后再次提交

上一篇:Python实战之dict简单练习


下一篇:pycharm永久激活 注册码过期 如何配置永久不过期