六、Git基础操作之撤销操作

版本控制的关键是可撤销性,即可以使项目回退到某些操作之前状态。Git作为一款非常优秀的版本控制软件具备了丰富的撤销的命令来应对不同的场景,下面我们来学习一下。

1.修改最后一次提交

  • 命令:git commit --amend
  • 作用:本次提交覆盖上次提交,以此达到修改上次提交的目的。
  1. 未修改直接提交
    未修改直接再次提交

    值得注意的是,两次提交的项目内容和提交人没有变化,但是由于提交的时间不同,导致commit对象的内容不同,因此产生内容的ID也不相同。

  2. 修改后再提交
    修改后再提交

2. reset、revert和checkout

Git使用reset、revert和checkout三个命令来回退项目到某一个历史快照。
回退有两个影响级别:

  • commit级别:根据指定的commit来恢复项目整体到历史的某一快照。
  • 文件级别:根据指定commit和文件路径来恢复指定文件到某一历史版本。

2.1 commit级别回退

1)回退Git仓库
  • 命令:git reset --soft [commit]
  • 作用:把HEAD引用的当前分支的commit引用移动到指定commit,以此达到回退的目的。
恢复git仓库到上一次提交

重新根据reset命令撤销刚才的撤销操作(是不是有点绕口)


撤销刚才的撤销操作

恢复到撤销前的状态
2)回退Git仓库和暂存区
  • 命令:git reset [commit]/git reset --mixed [commit]
  • 作用:本命令会恢复Git仓库到指定commit,并根据指定commit清空覆盖暂存区(不会提示冲突,因为是强行覆盖)。
  • 结果:1)不在指定commit的文件树中的工作区的目录和文件会变成未跟踪状态;2)与指定commit的文件树中的内容不同的文件会变成已修改状态,待加入暂存区。
回退Git仓库和暂存区
3)回退Git仓库、暂存区和工作区
git reset
  • 命令:git reset --hard [commit]
  • 作用:根据指定commit的文件树,覆盖git仓库和暂存区,清空工作区所有已跟踪文件然后以指定commit的内容代替。
  • 结果:1)只有工作区内处于未跟踪状态的目录和文件会维持原来状态;2)其他文件都会与指定commit内容具有相同内容。
git reset --hard

未跟踪文件不被清除
git revert
  • 命令1:git revert [commit] 作用:打补丁的形式撤销某次历史版本;
  • 命令2:git revert -n [commit]..[commit] 作用:撤销一个commit区间
  • 原理:根据diff操作计算出指定commit与其之前commit的内容差异,针对该差异计算出反补丁,应用反补丁到当前git仓库、暂存区和工作区,并产生一次提交。
  • 条件:1)保持暂存区clean状态;2)工作区不能有和revert补丁冲突的处于已修改状态的文件,例如不能修改同一行等。
git revert

revert的冲突情况
4)reset和revert的区别
初始状态
  • git reset不会产生新的提交,只通过移动HEAD引用的分支指向的commit来恢复项目快照。


    初始状态执行git rest HEAD~后结果
  • git revert不会影响已有历史,它会产生新的提交来撤销某次或一定范围的修改。


    初始状态执行git revert HEAD后结果
  • 区别列表
命令 git reset git revert
原理 改变分支的commit的引用 对已有commit引用打反补丁
副作用 改变commit历史 不会改变commit历史
适用性 本地分支 公共分支
冲突 无冲突 会有冲突
优点 无冲突的恢复到某次历史快照 可针对中间的某次提交进行撤销操作
本质 覆盖操作 修补操作
2.2 文件级别回退
1)回退暂存区文件
  • 命令:git reset [commit] [file],若是commit是HEAD可替换为--
  • 作用:根据指定commit,撤销暂存区指定文件的操作;
  • 结果:若新增,则删除;若删除和修改,则恢复。
2)回退工作区文件
  • 命令1:git checkout file
  • 作用:把暂存区文件检出到工作区;
  • 命令2:git chekcout [commit] [file],若是commit是HEAD可替换为--
  • 作用:根据指定commit,从git仓库检出指定文件到暂存区工作区

3.提交树

Git中每次提交都会存储在Git仓库,只是有些提交经过reset、删除分支、删除储藏等操作后不被分支和标签引用,变成悬挂状态(dangling)。我们可以通过以下命令查看这些提交(Git的提交树和vim的undo树异曲同工)。

1)完整提交树
  • 命令:git log -ggit reflog来查看
  • 作用:显示所有操作,包括撤销的。
2)有效提交树
  • 命令:git log查看
  • 作用:显示当前有效的操作
3)撤销的悬挂提交(dangling commit)
  • 命令:git fsck --lost-found
  • 作用:通过校验Git仓库的完整性(通过引用链),找出悬挂对象。
4)一图以蔽之
提交树

4.储藏和恢复

由于revert、分支合并等场景下的操作会与工作区和暂存区的内容产生冲突,若不想提交当前工作区和暂存区的修改内容,可以通过储藏命令将其储藏起来,然后在合适的时候恢复工作区和暂存区。

git stash       # 储藏当前工作区和暂存区
git stash list  # 查看当前的储藏列表
git stash apply # 恢复上一次的储藏内容
git stach pop   # 恢复上一次的储藏内容,并将其从储藏区删除

5.清除未跟踪文件

  • 命令1:git clean -f 作用:删除未跟踪文件
  • 命令2:git clean -df 作用:删除未跟踪文件和目录
  • 一般与git reset --hard命令搭配使用。
git reset --hard commit  # 恢复git仓库、暂存区和工作区(不包含未跟踪内容)到指定commit
git clean -df # 删除当前处于未跟踪状态的文件和目录
git status # 当前处于commit,且暂存区和工作区都处于clean状态

参考

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

推荐阅读更多精彩内容

  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,465评论 1 26
  • 概述 这次主要来讲讲Git的反悔操作,自己平时在写代码的过程中经常会出现想要弃用所有的改动或回滚到上一次commi...
    jumpingfrog0阅读 19,722评论 1 12
  • “醉过才知酒浓,爱过才知情重。你不能做我的诗,正如我不能做你的梦。” 01 北方的一月正值寒冬时节,纯白色的雪花纷...
    蓝蓝小姐阅读 10,087评论 34 45
  • 多年前以为英雄们是白胸脯上贴胸毛硬抗打出来的。现在才知道,英雄们多数都是跑路跑出来的,来到机场,发型用口水撸顺。关...
    灯真亮阅读 101评论 0 0
  • 文/木易每文 天空飘起了雪花,越下越大,模糊了视线,隐去了所有的颜色,世界变成了最单纯的模样。 早上妈妈发来语音,...
    木易每文阅读 504评论 2 3