讓你的代碼回到過去,git reset 與 git revert 的用處

先简单了解档案存入 repository(仓库)的流程

Git 简单来说分为三个区域:

1、工作区(working directory): 我们实际操作的资料夹(档案)

2、暂缓区(stage snapshot): 将工作区档案的快照新增到暂存区域

3、git 目录(.git directory): 提交暂存区域的档案快照永久地储存在 Git 目录

git 流程

git reset --hard and --soft 穿梭你提交的版本之间

  • hard
    git reset --hard HEAD :此种模式完全不保留原始 commit 结点的任何资讯,会连同资料夹中实体档案内容都进行重置,也就是直接将工作区、暂缓区及 git 目录都重置成目标Reset结点的资料内容。

具体操作:

回复到上一个(或更前的)版本。
git reset --hard HEAD 回复到最新提交版本
git reset --hard HEAD~ // 等于 ~1 回复到上一个提交版本
git reset --hard HEAD~n // n 等于往上第几个提交版本 回复之前指定的提交版本

例子一:

假设我发现最新的代码版本有bugs,想回复更前的版本,你可以输入:
git log --oneline -n // (n 是最近几多次的提交记录)
如下所示,便会显示最近5次的提交记录。

Kwokde-MacBook-Pro:test stevechung$ git log --oneline -5 // 最近5次提交记录
ba2f0a4 (HEAD -> master, origin/master) test4 //最新提交的记录
f3a6683 test1 // 上一个提交的记录
4f0f054 test2
6fefa2d test1
77f9ec8 reset

如果你想回复到 f3a6683 test1 ,输入 git reset --hard HEAD~
如果你想回复到 4f0f054 test2 ,输入 git reset --hard HEAD~2
如果你想回复到 6fefa2d test1 ,输入 git reset --hard HEAD~3
如此类推。

假设我回复到 4f0f054 test2 这个版本,输入后便会显示:

Kwokde-MacBook-Pro:test stevechung$ git reset --hard HEAD~2 // 回复到 4f0f054 test2
HEAD is now at 4f0f054 test2 // 这代表成功回复至你指定的版本

小知识:HEAD 是什么 ?
HEAD 是一个指标,指向某一个分支,通常你可以把 HEAD 当做「目前所在分支」看待。

假设你回复之前的版本后,又想回复到最新提交的版本,就可以用:

  • git reflog :查看所有讯息版本
  • git reset --hard commit_id : 根据 commit id 回复到指定版本
例子二:

你可以输入 git reflog 查看所有讯息版本,如下所示:

Kwokde-MacBook-Pro:test stevechung$ git reflog // 查看所有讯息版本
4f0f054 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~2 // 这是例子一、回复的当前提交记录
ba2f0a4 (origin/master) HEAD@{1}: commit: test4 // 假设你要回复到例子一、开头使用的这个版本
f3a6683 HEAD@{2}: commit: test1
4f0f054 (HEAD -> master) HEAD@{3}: commit: test2
6fefa2d HEAD@{4}: commit: test1
77f9ec8 HEAD@{5}: commit: reset
58f0631 HEAD@{6}: reset: moving to HEAD
58f0631 HEAD@{7}: commit (initial): gitreset

ba2f0a4 就是 commit id,每个经 git commit -am "" 提交到历史记录区(仓库)都会生成一组 commit id,可以按以下输入:

Kwokde-MacBook-Pro:test stevechung$ git reset --hard ba2f0a4 //回复到的指定commit id 的提交记录版本
HEAD is now at ba2f0a4 test4 // 这代表成功回复至你指定的版本
  • soft
    git reset --soft HEAD / commit id :此模式下会保留工作区资料内容,不会异动到目前所有的实体档案内容;也会保留暂缓区资料内容,让暂缓区与 git 目录资料内容是一致的。

具体操作:

Kwokde-MacBook-Pro:test raykwok$ git reflog // 查看所有讯息版本
ba2f0a4 (HEAD -> master, origin/master) HEAD@{0}: reset: moving to ba2f0a4
4f0f054 HEAD@{1}: reset: moving to HEAD~2
ba2f0a4 (HEAD -> master, origin/master) HEAD@{2}: commit: test4
f3a6683 HEAD@{3}: commit: test1
4f0f054 HEAD@{4}: commit: test2
6fefa2d HEAD@{5}: commit: test1 // 计划回复到前 3 个版本 - 6fefa2d
77f9ec8 HEAD@{6}: commit: reset
58f0631 HEAD@{7}: reset: moving to HEAD
58f0631 HEAD@{8}: commit (initial): gitreset
Kwokde-MacBook-Pro:test raykwok$ git reset --soft HEAD~3 // 回复到 6fefa2d 版本
Kwokde-MacBook-Pro:test raykwok$ git reflog
6fefa2d (HEAD -> master) HEAD@{0}: reset: moving to HEAD~3 // 回复成功
ba2f0a4 (origin/master) HEAD@{1}: reset: moving to ba2f0a4
4f0f054 HEAD@{2}: reset: moving to HEAD~2
ba2f0a4 (origin/master) HEAD@{3}: commit: test4
f3a6683 HEAD@{4}: commit: test1
4f0f054 HEAD@{5}: commit: test2
6fefa2d (HEAD -> master) HEAD@{6}: commit: test1
77f9ec8 HEAD@{7}: commit: reset
58f0631 HEAD@{8}: reset: moving to HEAD
58f0631 HEAD@{9}: commit (initial): gitreset

git revert 撤销一个提交的同时会创建一个新的提交。

  • revert
    git revert HEAD 新增一个 Commit 来反转(或说取消)另一个 Commit 的内容,原本的 Commit 依旧还是会保留在历史纪录中。虽然会因此而增加 Commit 数,但通常比较适用于已经推出去的 Commit,或是不允许使用 Reset 或 Rebase 之修改历史纪录的指令的场合。

具体操作:

Kwokde-MacBook-Pro:test raykwok$ git revert HEAD~2 // 提交revert 取消上一次提交
[master 1b6942a] Revert "gitreset" // 增加了一个 Commit 1b6942a 用以代替上次提交的版本
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 README.md
Kwokde-MacBook-Pro:test raykwok$ git reflog
1b6942a (HEAD -> master) HEAD@{0}: revert: Revert "gitreset" // 增加一个 Commit 来取消 6fefa2d
6fefa2d HEAD@{1}: reset: moving to HEAD
6fefa2d HEAD@{2}: reset: moving to HEAD~3

总结:

本文是小弟学习前端写有关于git reset 与 git revert 的用处,请大家多多指教。如有任何意见及交流,可在下方留言,谢谢!

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

推荐阅读更多精彩内容