git 撤销命令 git reset 使用

一、功能说明

执行 git reset --help 可以看到帮助文档
公共说明:

[]:可选可不选
-q:静默操作,只提示错误信息(不会打印被影响到的文件信息)
commit:提交的 tree(目录树)对象 hash 值(其实就是执行 git log --oneline 前面的一段 hash 串)
工作区: .git 版本库所在的目录

1.1、git reset [-q] [<commit>] [--] <paths>...

说明:使用指定提交下的文件替换暂存区的文件(两个 -- 为了避免路径和引用指向的提交同名冲突),不会改变工作区和引用指向的提交
例如:git reset HEAD <paths>相当于git add <paths> 的反操作

1.2、git reset (--patch | -p) [<tree-ish>] [--] [<paths>...]

说明:选择性将指定提交的文件内容替换暂存区的文件内容
例如:git reset -p HEAD <paths> 相当于git add -p <paths>的反操作 [git add -p 详情待补]

  • 示例:
    构造的环境如下:

执行下列语句,参看下面的执行效果图更清楚:

git diff --cached lyrics.txt #查看暂存区和版本库的区别
git reset -p lyrics.txt #用当前分支HEAD指向的版本库内容替换暂存区的内容
s # 分割成更小的块
n #不替换暂存区的内容
y #替换暂存区的内容
git diff --cached lyrics.txt #查看暂存区和版本库的区别

特别说明:

y - 这块从暂存区退出
n - 这块不从暂存区退出
q - 退出 不做任何操作
a - 将此块和之后的块都退出暂存区
d - 将此块和之后的块都不退出暂存区
g - 在输入s后 选择跳去那一个块
/  - 在输入s后 使用正则表达式找到块
j - 离开当前未决定的块,跳到下一个未决定的块
J - 离开当前未决定的块, 跳到下一个块
k - 离开当前未决定的块, 跳到前一个未决定的块
K - 离开当前未决定的块, 跳到前一个的块
s - 将当前块分割为更小的块(注意连在一起的不能被分割的再小了)
e - 编辑当前块
? - 打印帮助
执行效果

1.3 git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]

说明:此操作会重置提交的引用
例子中使用的初始环境都如下所示:

1.3.1、三种动作

1⃣️ 替换引用的指向,指向新的提交。
2⃣️ 替换暂存区。暂存区内容将和指定的提交内容一样。
3⃣️ 替换工作区。工作区和指定的提交内容一样。

1.3.2、 不同的参数会执行不同的动作

  • -- soft : git reset --soft <commit>
    只执行动作 1⃣️。
    • 🌰举个栗子:
      模拟一次错误的提交,撤销提交后,再查看效果
    git commit -m "我好像写了一个错误的提交说明"
    git log --oneline --graph
    git reset --soft HEAD^ # HEAD^ 在当前况下相当于最后一次提交的前一次提交
    git diff #查看工作区和暂存区的区别
    git diff --cached #查看暂存区和版本库的区别
    

结果说明:工作区和暂存区都恢复到了初始环境的样子,只有上一次提交消失了。
注:修补提交命令 git commit --amend,用于将最新的提交进行重新提交以修补错误的提交说明。其相当于执行了如下命令(.git/COMMIT_EDITMSG保存了上次的提交日志,可以直接修改)

git reset --soft HEAD^
git commit -e -F .git/COMMIT_EDITMSG
  • --mixed git reset --mixed [-N] <commit>
    不带参,则默认为此参数。执行动作1⃣️2⃣️。
    • 🌰举个栗子
git commit -m "我来试一下 --mixed"
git log --oneline --graph
git reset d6ea103 #此处的 d6ea10 只是我的上次提交id,不具有普遍性
# git reset --mixed d6ea103 等同于上一个命令
# git reset --mixed HEAD^ 同上 此命令具有普遍性
git diff #查看工作区和暂存区的区别
git diff --cached #查看暂存区和版本库的区别

结果说明:git diff可以很明显看出来之前加入暂存区的既替余以蕙纕兮,又申之以揽茝。,现在已经被退出暂存区了。但是本地文件没有变化。

  • --hard git reset --hard <commit>
    执行动作1⃣️2⃣️3⃣️。慎用,会改掉工作区文件。
    • 🌰举个栗子
git commit -m "我再悄咪咪试一下 --hard"
git log --oneline --graph
git reset --hard HEAD^
git diff #查看工作区和暂存区的区别
git diff --cached #查看暂存区和版本库的区别
git diff HEAD #查看工作区和版本库的区别
cat lyrics.txt #查看 lyrics.txt 的内容

结果说明:可以看到工作区、暂存区、版本库都没有任何区别了,再看看 lyrics.txt 的内容,就可以发现刚刚工作区的改动全都不见了 ¯\_(ツ)_/¯,如果有需要的改动,从未提交过的内容真的是凉凉。但是之前提交过的541c01c (HEAD -> master) 我再悄咪咪试一下 --hard的内容既替余以蕙纕兮,又申之以揽茝。还是可以找回来的 ----- [撤销后又后悔待补充]

  • --merge git reset --merge <commit>
    如果撤销的是上一个操作是 git pull,执行动作1⃣️2⃣️3⃣️。工作区如果有改动的话,会停止重置。慎用,会改掉工作区文件。
    如果撤销的是上一个操作是 git merge,则执行动作1⃣️3⃣️。虽然工作区本地文件被重置了,但是暂存区会有之前本地的修改。还是慎用。
    🌰栗子见 git merge 撤销
  • --keep git reset --keep <commit>
    执行动作1⃣️2⃣️3⃣️。但是工作区如果有未提交的内容的话,会停止重置。慎用,会改掉工作区文件。
    • 🌰举个栗子
      为了方便写注释(#开头的为注释),此次把所有的都拷下来,图片还在后面有附 ^_^
#先将初始环境的暂存区内容提交了
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git commit -m "再用 --keep 试一下喽"
[master e8c694e] 再用 --keep 试一下喽
 1 file changed, 1 insertion(+)
#再将初始环境的内容加到暂存区
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git add lyrics.txt 
#再在文件 lyrics.txt 中加入新内容
steamed-bundeMacBook-Pro:gitTest steamed-bun$ echo "怨灵修之浩荡兮,终不察夫民心。" >> lyrics.txt 
#查看文件  lyrics.txt 
steamed-bundeMacBook-Pro:gitTest steamed-bun$ cat lyrics.txt 
离骚--高考必背
长太息以掩涕兮, 哀民生之多艰。
余虽好修姱以鞿羁兮,謇朝谇而夕替。
既替余以蕙纕兮,又申之以揽茝。
亦余心之所善兮,虽九死其犹未悔。
怨灵修之浩荡兮,终不察夫民心。
#查看工作区和暂存区的区别 
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git diff 
diff --git a/lyrics.txt b/lyrics.txt
index 9fe96f6..9b05a22 100644
--- a/lyrics.txt
+++ b/lyrics.txt
@@ -3,3 +3,4 @@
 余虽好修姱以鞿羁兮,謇朝谇而夕替。
 既替余以蕙纕兮,又申之以揽茝。
 亦余心之所善兮,虽九死其犹未悔。
+怨灵修之浩荡兮,终不察夫民心。
#查看暂存区和版本库的区别
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git diff --cached
diff --git a/lyrics.txt b/lyrics.txt
index bedad0e..9fe96f6 100644
--- a/lyrics.txt
+++ b/lyrics.txt
@@ -2,3 +2,4 @@
 长太息以掩涕兮, 哀民生之多艰。
 余虽好修姱以鞿羁兮,謇朝谇而夕替。
 既替余以蕙纕兮,又申之以揽茝。
+亦余心之所善兮,虽九死其犹未悔。
#执行撤回命令 可以看到 git 的提示
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git reset --keep HEAD^
error: Entry 'lyrics.txt' would be overwritten by merge. Cannot merge.
#错误:文件 'lyrics.txt' 将被合并覆盖,但是无法合并。
fatal: Could not reset index file to revision 'HEAD^'.
#致命:无法将索引文件重置为“HEAD ^”。
#再试一下将工作区的内容全部提交到暂存区
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git add lyrics.txt 
#在执行撤回命令 依然失败
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git reset --keep HEAD^
error: Entry 'lyrics.txt' would be overwritten by merge. Cannot merge.
fatal: Could not reset index file to revision 'HEAD^'.
#查看工作区和暂存区确实无区别 (其实应该先查看的 囧rz)
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git diff
#将 lyrics.txt 加入到暂存区的内容撤出
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git reset -- lyrics.txt 
Unstaged changes after reset:
M   lyrics.txt
# 可以看到已全部撤出了暂存区了
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git diff 
diff --git a/lyrics.txt b/lyrics.txt
index bedad0e..9b05a22 100644
--- a/lyrics.txt
+++ b/lyrics.txt
@@ -2,3 +2,5 @@
 长太息以掩涕兮, 哀民生之多艰。
 余虽好修姱以鞿羁兮,謇朝谇而夕替。
 既替余以蕙纕兮,又申之以揽茝。
+亦余心之所善兮,虽九死其犹未悔。
+怨灵修之浩荡兮,终不察夫民心。
#进入 vim 删除最后两句新内容 直接打开文件删除也是一样的 
steamed-bundeMacBook-Pro:gitTest steamed-bun$ vim lyrics.txt 
#查看文件内容 可以看到已经不见了
steamed-bundeMacBook-Pro:gitTest steamed-bun$ cat lyrics.txt 
离骚--高考必背
长太息以掩涕兮, 哀民生之多艰。
余虽好修姱以鞿羁兮,謇朝谇而夕替。
既替余以蕙纕兮,又申之以揽茝。
#查看区别
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git diff
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git diff --cached
#再执行撤回命令
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git reset --keep HEAD^
#再次查看文件内容 已经可以看到工作区回到了上一此提交后的情况
steamed-bundeMacBook-Pro:gitTest steamed-bun$ cat lyrics.txt 
离骚--高考必背
长太息以掩涕兮, 哀民生之多艰。
余虽好修姱以鞿羁兮,謇朝谇而夕替。
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git diff 
steamed-bundeMacBook-Pro:gitTest steamed-bun$ git diff --cached
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,874评论 5 147
  • git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git b...
    猿万阅读 5,055评论 1 45
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,913评论 0 11
  • 今天是个好日子,感谢徐老师! 前不久,被金宏老师的文采吸引了,就加了好友。看她名字,我以为是个帅哥。一...
    被爱环绕阅读 563评论 0 3
  • 相关文章 博客原文数据类型总结——概述数据类型总结——String(字符串类型)数据类型总结——Number(数值...
    前端路上的小兵阅读 5,890评论 0 2