git reset 的三种模式

现实生活中虽然没有后悔药,但程序世界是有的。 reset 就是git中的后悔药,而且还可以根据参数不同来调整后悔的程度。

说明:本文章并非git基础知识,需要对gi命令有一定的熟练程度才能理解,如果看官对 『工作区』『暂存区』『存储库』这三个词比较陌生,或者完全不理解是什么,那还是先请去看看git基础知识,再回头来往下浏览,以免浪费宝贵时间

1,前置知识说明

  • 工作区: 即 Working Tree 或 Working Directory,不同文章中叫法不同。
  • 暂存区:即 Index/Stage 或 Staged Snapshot。
  • 存储库:即 Repository。

当我们新增或修改文件时,文件最先会放在工作区,这个阶段是我们正在进行文件的创建和编辑阶段。当使用 git add 命令,即表示我们的创建或编辑工作已经完成,准备将劳动成果添加到git仓库,但这时所有的创建或修改还只是临时的,被改动的文件只是转移到暂存区临时保存,并没有真正影响到git仓库的内容,只有使用 git commit 命令之后,所有的改动才最终生效,git 仓库中也产生新的文件版本记录。

简单来说,一个文件在git目录中有三种情况:
1,刚刚添加到目录中,或刚刚被修改过,此时文件被记录在工作区。
2,执行了 git add 命令, 此时文件由工作区转移到了暂存区
3,执行了 git commit 命令,此时文件由暂存区转移到git仓库,即存储库。

2,resset 的三种模式

如果把上面的 添加文件到 执行 git commit 的过程看作是前进,那么 git reset 就是回退,reset 的不同模式,其实就是回退几步,上面的提交一共有三步,对应的,reset 可以让你选择是回退一步,两步,还是三步。

以一个实例来说明,新建一个名称为 git-reset 的文件夹,使用执行 git init 将该文件夹初始化为一个git目录,然后进行如下操作:
1,新建一个文本文件 1.txt, 并添加内容为 1234
2,执行 git add 1.txt
3,执行 git commit -m '添加1.txt文件'
如果操作无误,使用 git log 命令查看日志,应该会看到一条提交记录。

为了方便下面的 reset 命令的理解 ,再继续进行如下操作:
4,修改1.txt,在原来内容后面添加 abcd。 (1.txt 最终的内容为 1234abcd)
5,执行 git add 1.txt
6,执行 git commit -m '修改1.txt文件,添加新内容'
如果操作无误,使用 git log 命令查看日志,应该会看到两条提交记录。

  • --hard
    硬核模式,完全回退(就是肠子都悔清了,恨不得事情没有发生过), 就是回退三步。
    在上面的例子中,执行如下命令:
$  git reset --hard HEAD^

执行完成之后,查看1.txt的内容,会发现只有1234,也就是说,1.txt 被退回到了上面 6步中的第三步之后的状态,456这三步相当于就没有发生过。
这就是--hard 模式,完全回退,使用此参数,在上一次执行 git commit 命令之后的所有操作都将会被抹除,相当于没有发生过,也就是之前在上一次git commit 命令之后的所有操作都是做了无用功,白费力气了。

**警告: **此模式相当危险,除非你已经完全明白这个参数的含义以及执行这条命令之后的结果,否则不建议使用该参数。

  • --mixed
    混合模式,回退到工作区(后悔不已,希望事情回到最初开始,自己可以做些事情来改变剧情的发展),就是回退两步。
    为方便理解,将上面的 456三步再做一次(因为经过上面的 --hard 之后,456已经被抹掉了,相当于没发生),然后执行如下命令:
$  git reset --mixed HEAD^

执行完成之后,使用 git status 查看状态,并查看1.txt 的文件内容,会发现内容还是1234abcd,但git status显示的文件名称是红色,这是没有执行git add 1.txt 命令的状态,也就是说操作被回退到了第4步之后。
这就是 --mixed 模式,也是reset 的默认模式,即与 git reset HEAD^ 效果是一样的,文件的修改操作并没有被抹除,也就是文件操作没有影响,但git操作被撤消了。
这是最常用的模式,所以如果不使用参数,默认即是这个模式。

  • --soft
    轻度模式(或可以叫软模式),回退到暂存区(内心其实是不怎么后悔的,只是想修改一下提交记录)。
    为方便理解,将上面的56两步再做一次(道理同上),然后执行如下命令:
$  git reset --soft HEAD^

执行完成之后,使用 git status 查看状态,并查看1.txt 的文件内容,会发现内容还是1234abcd,但git status显示的文件名称是绿色,这是执行了git add 命令,但没有执行 git commit 命令的效果,说明操作被回退到了第5步之后。

3,总结

git reset 的三种不同模式,其实对应的就是 git 提交的三个步骤,只要弄清楚了git提交的步骤,并能熟练使用,那么 git reset 其实也不难理解了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容