一、前提
参考:建议先阅读:Git Reset 三种模式
这篇文章只是我的的一个笔记
二、三种模式
- git reset --soft
- git reset --mixed
-
git reset --hard
这三个模式理解了,对于使用这个命令很有帮助。在理解这三个模式之前,需要略微知道一点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提交进行测试
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**已经被覆盖了
场景2:当我们commit
一个提交,但是这个提交并没有被push
,我们不需要这个commit
,可以通过git reset --soft
清除这个没有push
的commit
a)这里提交commit
了一个未push
的提交
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
可以发现,这个没有push
的commit
已经不存在了
2.--mixed
--mixed
重置位置的同时,只保留Working Tree工作目录的內容,但会将 Index暂存区 和 Repository 中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入Working Tree工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。
场景:当你连续commit
多个版本时,觉得这几个commit
没有意义可以合并时,通过git reset --soft 版本号
进行回退
a)测试日志记录如下
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 #强制提交
3.--hard
--hard
:重置位置的同时,直接将 working Tree工作目录、 index 暂存区及 repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。
场景:要放弃目前本地的所有改变時,即去掉所有add到暂存区的文件和工作区的文件,可以执行 git reset -hard HEAD 来强制恢复git管理的文件夹的內容及状态;真的想抛弃目标节点后的所有commit(可能觉得目标节点到原节点之间的commit提交都是错了,之前所有的commit有问题)
a)测试日志
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)查看差异
以ba
结尾的版本就是我们回退的版本,说明工作目录已经回退
d) 此时我们可以修改以后再次提交