温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
  • 忘记密码?
登录注册×
获取短信验证码
其他方式登录
点击 登录注册 即表示同意 《亿速云用户服务条款》
  • 服务器
  • 数据库
  • 开发技术
  • 网络安全
  • 互联网科技
登 录 注册有礼
最新更新 网站标签 地图导航
产品
  • 首页 > 
  • 教程 > 
  • 互联网科技 > 
  • 大数据 > 
  • Git Reset三种模式hard,soft,mix各自的用法

Git Reset三种模式hard,soft,mix各自的用法

发布时间:2021-06-29 09:55:14 来源:亿速云 阅读:842 作者:chen 栏目: 大数据

这篇文章主要讲解了“Git Reset三种模式hard,soft,mix各自的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Git Reset三种模式hard,soft,mix各自的用法”吧!

有时候,我们用Git的时候有可能commit提交代码后,发现这一次commit的内容是有错误的,那么有两种处理方法:
1、修改错误内容,再次commit一次 2、使用git reset 命令撤销这一次错误的commit
第一种方法比较直接,但会多次一次commit记录。
而我个人更倾向第二种方法,错误的commit没必要保留下来。
那么今天来说一下git reset。它的一句话概括

git-reset - Reset current HEAD to the specified state

意思就是可以让HEAD这个指针指向其他的地方。例如我们有一次commit不是不是很满意,需要回到上一次的Commit里面。那么这个时候就需要通过reset,把HEAD指针指向上一次的commit的点。
它有三种模式,soft,mixed,hard,具体的使用方法下面这张图,展示的很全面了。

git各个区域和命令关系

Git Reset三种模式hard,soft,mix各自的用法

这三个模式理解了,对于使用这个命令很有帮助。在理解这三个模式之前,需要略微知道一点Git的基本流程。正如上图,Git会有三个区域:

  • Working Tree 当前的工作区域

  • Index/Stage 暂存区域,和git stash命令暂存的地方不一样。使用git add xx,就可以将xx添加近Stage里面

  • Repository 提交的历史,即使用git commit提交后的结果

文件存入Repository流程

Git Reset三种模式hard,soft,mix各自的用法

以下简单敘述一下把文件存入Repository流程:

  1. 刚开始 working tree 、 index 与 repository(HEAD)里面的內容都是一致的

    阶段1

Git Reset三种模式hard,soft,mix各自的用法

  1. 当git管理的文件夹里面的内容出现改变后,此時 working tree 的內容就会跟 index 及 repository(HEAD)的不一致,而Git知道是哪些文件(Tracked File)被改动过,直接将文件状态设置为 modified (Unstaged files)。

     

    阶段2

Git Reset三种模式hard,soft,mix各自的用法

  1. 当我們执行 git add 后,会将这些改变的文件內容加入 index 中 (Staged files),所以此时working tree跟index的內容是一致的,但他们与repository(HEAD)內容不一致。

    阶段3

Git Reset三种模式hard,soft,mix各自的用法

  1. 接着执行 git commit 後,將Git索引中所有改变的文件內容提交至 Repository 中,建立出新的 commit 节点(HEAD)后, working tree 、 index 與与repository(HEAD)区域的内容 又会保持一致。

    阶段4

Git Reset三种模式hard,soft,mix各自的用法

实战演示

reset --hard:重置stage区和工作目录:

reset --hard 会在重置 HEAD 和branch的同时,重置stage区和工作目录里的内容。当你在 reset 后面加了 --hard 参数时,你的stage区和工作目录里的内容会被完全重置为和HEAD的新位置相同的内容。换句话说,就是你的没有commit的修改会被全部擦掉。

例如你在上次 commit 之后又对文件做了一些改动:把修改后的ganmes.txt文件addstage区,修改后的shopping list.txt保留在工作目录

git status

Git Reset三种模式hard,soft,mix各自的用法

最初状态


然后,你执行了reset并附上了--hard参数:

git reset --hard HEAD^

你的 HEAD 和当前 branch 切到上一条commit 的同时,你工作目录里的新改动和已经add到stage区的新改动也一起全都消失了:

git status

Git Reset三种模式hard,soft,mix各自的用法

reset --hard head^之后


可以看到,在 reset --hard 后,所有的改动都被擦掉了。

reset --soft:保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区

reset --soft 会在重置 HEAD 和 branch 时,保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区。

什么是「重置 HEAD 所带来的新的差异」?就是这里:

Git Reset三种模式hard,soft,mix各自的用法

由于 HEAD 从 4 移动到了 3,而且在 reset 的过程中工作目录和暂存区的内容没有被清理掉,所以 4 中的改动在 reset 后就也成了工作目录新增的「工作目录和 HEAD 的差异」。这就是上面一段中所说的「重置 HEAD 所带来的差异」。

此模式下会保留 working tree工作目录的內容,不会改变到目前所有的git管理的文件夹的內容;也会
保留 index暂存区的內容,让 index 暂存区与 working tree 工作目录的內容是一致的。就只有 repository 中的內容的更变需要与 reset 目标节点一致,因此原始节点与reset节点之间的差异变更集合会存在与index暂存区中(Staged files),所以我们可以直接执行 git commit 將 index暂存区中的內容提交至 repository 中。当我们想合并「当前节点」与「reset目标节点」之间不具太大意义的 commit 记录(可能是阶段性地频繁提交)時,可以考虑使用 Soft Reset 来让 commit 演进线图较为清晰点。

Git Reset三种模式hard,soft,mix各自的用法

所以在同样的情况下,还是老样子:把修改后的ganmes.txt文件addstage区,修改后的shopping list.txt保留在工作目录

git status

最初状态

Git Reset三种模式hard,soft,mix各自的用法


假设此时当前 commit 的改动内容是新增了 laughters.txt 文件:

git show --stat

git show --stat

Git Reset三种模式hard,soft,mix各自的用法

如果这时你执行:

git reset --soft HEAD^

那么除了 HEAD 和它所指向的 branch2 被移动到 HEAD^ 之外,原先 HEAD 处 commit 的改动(也就是那个 laughters.txt 文件)也会被放进暂存区:

git status

使用git reset --soft HEAD^后

Git Reset三种模式hard,soft,mix各自的用法
这就是--soft 和 --hard 的区别:--hard 会清空工作目录和暂存区的改动,*而 --soft则会保留工作目录的内容,并把因为保留工作目录内容所带来的新的文件差异放进暂存区

reset 不加参数(mixed):保留工作目录,并清空暂存区

reset 如果不加参数,那么默认使用 --mixed 参数。它的行为是:保留工作目录,并且清空暂存区。也就是说,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录。简而言之,就是「把所有差异都混合(mixed)放在工作目录中」。

还以同样的情况为例:

git status

最初状态

Git Reset三种模式hard,soft,mix各自的用法

修改了 的games.txt 和 shopping list.txt,并把 games.txt 放进了暂存区。

git show --stat

git show --stat

Git Reset三种模式hard,soft,mix各自的用法

最新的 commit 中新增了 laughters.txt 文件。

这时如果你执行无参数reset或者带--mixed参数:

git reset HEAD^
git reset --mixed HEAD^

工作目录的内容和 --soft 一样会被保留,但和 --soft 的区别在于,它会把暂存区清空,并把原节点和reset节点的差异的文件放在工作目录,总而言之就是,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录

git status

git reset HEAD^之后

Git Reset三种模式hard,soft,mix各自的用法

总结

reset 的本质:移动 HEAD 以及它所指向的 branch

实质上,reset 这个指令虽然可以用来撤销 commit ,但它的实质行为并不是撤销,而是移动 HEAD ,并且「捎带」上 HEAD 所指向的 branch(如果有的话)。也就是说,reset 这个指令的行为其实和它的字面意思 "reset"(重置)十分相符:它是用来重置 HEAD 以及它所指向的 branch 的位置的。

而 reset --hard HEAD^ 之所以起到了撤销 commit 的效果,是因为它把 HEAD 和它所指向的 branch 一起移动到了当前 commit 的父 commit 上,从而起到了「撤销」的效果:

git reset

Git Reset三种模式hard,soft,mix各自的用法

Git 的历史只能往回看,不能向未来看,所以把 HEAD 和 branch 往回移动,就能起到撤回 commit 的效果。

所以同理,reset --hard 不仅可以撤销提交,还可以用来把 HEAD 和 branch 移动到其他的任何地方。

git reset --hard branch3

git reset --hard branch3

Git Reset三种模式hard,soft,mix各自的用法

reset三种模式区别和使用场景

区别:
  1. --hard:重置位置的同时,直接将 working Tree工作目录、 index 暂存区及 repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。

  2. --soft:重置位置的同时,保留working Tree工作目录index暂存区的内容,只让repository中的内容和 reset 目标节点保持一致,因此原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files)。所以效果看起来就是工作目录的内容不变,暂存区原有的内容也不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中。

  3. --mixed(默认):重置位置的同时,只保留Working Tree工作目录的內容,但会将 Index暂存区 和 Repository 中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入Working Tree工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。

使用场景:
  1. --hard:(1) 要放弃目前本地的所有改变時,即去掉所有add到暂存区的文件和工作区的文件,可以执行 git reset -hard HEAD 来强制恢复git管理的文件夹的內容及状态;(2) 真的想抛弃目标节点后的所有commit(可能觉得目标节点到原节点之间的commit提交都是错了,之前所有的commit有问题)。

  2. --soft:原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files),所以假如我们之前工作目录没有改过任何文件,也没add到暂存区,那么使用reset --soft后,我们可以直接执行 git commit 將 index暂存区中的內容提交至 repository 中。为什么要这样呢?这样做的使用场景是:假如我们想合并「当前节点」与「reset目标节点」之间不具太大意义的 commit 记录(可能是阶段性地频繁提交,就是开发一个功能的时候,改或者增加一个文件的时候就commit,这样做导致一个完整的功能可能会好多个commit点,这时假如你需要把这些commit整合成一个commit的时候)時,可以考虑使用reset --soft来让 commit 演进线图较为清晰。总而言之,可以使用--soft合并commit节点

  3. --mixed(默认):(1)使用完reset --mixed后,我們可以直接执行 git add 将這些改变果的文件內容加入 index 暂存区中,再执行 git commit 将 Index暂存区 中的內容提交至Repository中,这样一样可以达到合并commit节点的效果(与上面--soft合并commit节点差不多,只是多了git add添加到暂存区的操作);(2)移除所有Index暂存区中准备要提交的文件(Staged files),我们可以执行 git reset HEAD 来 Unstage 所有已列入 Index暂存区 的待提交的文件。(有时候发现add错文件到暂存区,就可以使用命令)。(3)commit提交某些错误代码,或者没有必要的文件也被commit上去,不想再修改错误再commit(因为会留下一个错误commit点),可以回退到正确的commit点上,然后所有原节点和reset节点之间差异会返回工作目录,假如有个没必要的文件的话就可以直接删除了,再commit上去就OK了。

感谢各位的阅读,以上就是“Git Reset三种模式hard,soft,mix各自的用法”的内容了,经过本文的学习后,相信大家对Git Reset三种模式hard,soft,mix各自的用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节
推荐阅读:
  1. git命令
  2. git语法笔记

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

git reset
  • 上一篇新闻:
    原生JS如何改变透明度实现轮播效果
  • 下一篇新闻:
    jQuery怎么实现拖拽排序效果

猜你喜欢

  • linux如何查看当前进程
  • perl怎么过滤文件中的数据
  • python怎么调用dll函数
  • python中prompt的用法是什么
  • linux的unlink函数怎么使用
  • Anaconda安装后无法开启怎么解决
  • 如何在perl中打开文件
  • 怎么用shell脚本检查驱动是否加载
  • 电脑如何更新声卡驱动程序
  • windows硬盘序列号怎么查询
最新资讯
  • 如何在Rails中使用Devise创建复杂的用户身份验证系统
  • Rails中的Custom Validators如何创建和使用
  • 如何在Rails中通过ActiveSupport::Notifications实现自定义事件
  • Rails中的JBuilder是如何工作的用于什么目的
  • 如何在Rails项目中使用Git进行版本控制
  • Rails部署中遇到的常见问题有哪些
  • 如何在Rails中实现和使用WebSockets进行实时通信
  • 解释Rails中Caching Strategies的差异及用例
  • 为何及如何在Rails中使用UUID作为主键
  • Rails如何处理多语言模型翻译
相关推荐
  • 使用Git实现删除所有在本地修改的文件的方法
  • linux中git命令有什么用
  • Git有哪些使用技巧
  • git reset的用法是什么
  • 如何使用Git
  • linux中git命令的作用是什么
  • git reset命令的用法
  • git撤销的用法
  • git如何清除commit
  • git中怎么撤消最后一次提交

相关标签

snagit github gitlab gitolite git 操作 基础 githooks git clone git环境 github pages git commit gitignore git仓库 gitl gitblit gitflow digital ocean gitbook git bash git-bash git服务器
AI

深圳SEO优化公司果洛品牌网站设计推荐常德网站优化按天扣费公司保定百度竞价包年推广多少钱安庆外贸网站建设多少钱眉山模板网站建设多少钱临猗企业网站设计报价驻马店阿里店铺托管哪家好福永网站设计报价金昌模板网站建设报价自贡seo公司宁德设计网站公司阳江英文网站建设价格湘西网站优化按天扣费公司孝感SEO按天计费哪家好光明百搜标王菏泽百姓网标王推广推荐荷坳关键词按天扣费哪家好鸡西网络营销六安外贸网站制作哪家好怒江企业网站设计报价和田网页制作推荐凉山网站改版价格邢台网站推广系统多少钱北海网站改版公司安庆优化多少钱西宁seo网站推广推荐吴忠网站开发公司渭南百度网站优化哪家好临汾百度竞价多少钱绵阳品牌网站设计多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化