所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

git版本回退选哪个|git reset/revert/stash区别及实战用法

git版本回退选哪个|git reset/revert/stash区别及实战用法 一

文章目录CloseOpen

这篇文章帮你把三个命令的核心区别讲透:reset是“时光倒流”直接修改提交历史,适合本地未推送到远程的错误;revert是“和平撤销”通过新增反向提交抵消变更,不破坏历史,适合已推送的代码;stash是“临时寄存”未完成的改动,方便切换分支时保存工作进度。更有实战场景演示——比如误提交后的回退、多分支切换的代码暂存、保留历史的撤销操作,帮你快速对应问题选对命令,再也不用在版本回退时慌手慌脚。

你肯定遇到过这种情况:刚敲完git commit -m "修复支付Bug",下一秒刷新页面就发现——哦豁,支付接口的参数传反了;或者改了一半的用户中心功能,产品突然说要先切到另一个分支改紧急需求,这时候代码改了一半扔了可惜、提交又怕污染分支;再或者上周推到远程的代码,今天测试说有逻辑漏洞,得撤销但又不能删了之前的提交记录……

这些场景里,Git的resetrevertstash三个命令总能“救场”,但我敢说80%的开发者刚学的时候都搞不清:到底什么时候用哪个?用错了会不会把仓库搞崩? 我刚学Git那年就踩过巨坑——帮同事处理误提交时,把reset hard用到了已经推送到远程的分支上,结果团队所有人拉代码都提示“历史不一致”,被组长追着改了俩小时才恢复。后来我把这三个命令的用法揉碎了试,结合Git官方文档(没错,就是那个能把人看睡着但巨权威的git-scm.com)的说明,终于摸出了一套“不用记术语也能选对”的方法。

先把三个命令的“本质”给你讲透——像区分“时光机”“抵消魔法”和“临时抽屉”

其实不管是resetrevert还是stash,核心都是“处理代码变更”,但处理的场景和方式完全不一样,我用三个生活化的比喻帮你记住:

  • git reset:“时光机”——直接回到过去,但会抹掉后面的痕迹
  • 你可以把Git的提交历史想象成一条“时间线”,每个提交都是一个“时间点”。reset的作用就是把当前分支的HEAD指针(就是你当前所在的提交位置)“拉”回之前的某个时间点,并且可选地抹掉工作区或暂存区的变更。

    比如你刚做了两个提交:A→B→C(C是最新的),用git reset hard B,那么你的分支会直接回到B的状态,C这个提交就“消失”了——不管C里写了什么,都会被抹掉。

    但这里有个致命的坑:如果C已经被推送到远程仓库(比如GitHub、GitLab),你再用reset修改本地历史然后推送到远程,会直接覆盖团队的提交记录!我去年帮同事处理过这事:他把错误的代码推到远程后,用reset hard回退到之前的版本,再git push -f强制推送,结果团队其他人拉代码时全报错,因为他们本地的历史里还有C这个提交,而远程的历史已经没了。最后还是用git revert重新撤销才解决。

    所以reset的正确打开方式:只用于本地未推送到远程的错误提交——比如你刚commit但还没git push,这时候用reset回退,没问题。

  • git revert:“抵消魔法”——新增一个提交,把之前的变更“掰回去”
  • 如果说reset是“删记录”,那revert就是“补记录”。它不会修改已有的提交历史,而是创建一个新的提交,把你要撤销的那个提交的内容“反向操作”一遍

    比如你之前提交了C(修改了a.js文件),现在要撤销C,用git revert C,Git会生成一个新的提交D,里面的内容是“撤销C对a.js的修改”——这样历史记录就变成了A→B→C→D,所有人拉代码的时候都会看到“哦,原来C被撤销了”,不会乱。

    我现在处理已推送的错误提交,10次有9次用revert——比如上个月修复线上Bug时,我误把测试环境的配置文件提交到远程,就是用revert撤销的,团队其他人根本没感觉到影响。

  • git stash:“临时抽屉”——把没写完的代码“存起来”,回头再取
  • 你有没有过这种情况:正在改Feature A的代码,突然要切到BugFix分支改紧急问题,但Feature A的代码才写了一半,没法commit——这时候stash就是你的“救星”。它能把工作区和暂存区的变更暂时存到一个“ stash栈”里,让你的工作区回到干净状态,方便切换分支。

    我每天至少用3次stash:比如早上改用户头像上传功能,改到一半产品说要先处理支付回调的Bug,我就敲git stash save "用户头像功能未完成",把代码存起来,切到BugFix分支改完,再切回来敲git stash pop,之前的代码就回来了。

    这里要提醒你:stash的内容会存在本地,不会同步到远程,所以如果换电脑或者删了本地仓库,stash的内容就没了。我之前有次把stash忘在公司电脑上,回家想继续写,结果找不到了,从那以后我都会给stash加注释(比如git stash save "xxx功能未完成"),或者定期用git stash list看一下有没有没取的stash。

    直接上“实战场景”——遇到问题不用想,对照着用就行

    光懂区别还不够,得知道什么场景下用什么命令。我把日常开发中最常遇到的3个场景列出来,每个场景给你写清楚步骤,连坑都帮你踩过了:

    场景1:刚commit但没push,发现代码错了——用git reset

    比如你刚做了一个本地提交(没推到远程),发现代码里有Bug,这时候用git reset soft HEAD~1

  • soft:保留工作区的变更(也就是你写的代码不会被删),只把HEAD指针回退到上一个提交;
  • HEAD~1:表示“上一个提交”,如果要回退两个提交,就是HEAD~2
  • 步骤:

  • git reset soft HEAD~1,把提交记录回退到上一个版本;
  • 修改代码里的Bug;
  • 重新git add .git commit
  • 坑提醒:别用hardhard会把工作区的变更也抹掉,要是你没备份代码,就哭去吧——我刚学Git的时候就犯过这错,把soft写成hard,结果把改了3小时的代码全删了,只能重新写。

    场景2:代码已经push到远程,要撤销——用git revert

    比如你昨天把代码推到远程仓库,今天测试说有逻辑错误,这时候绝对不能用reset(会改历史),得用git revert

    步骤:

  • 找到要撤销的提交ID(用git log看,比如ID是abc123);
  • git revert abc123,Git会自动生成一个新的提交,内容是“Revert “之前的提交信息”
  • 敲git push把这个新提交推到远程。
  • 为什么安全? 因为revert没有修改历史,只是新增了一个提交——团队其他人拉代码的时候,会看到“这个提交被撤销了”,不会有冲突。

    场景3:改到一半要切分支——用git stash

    比如你在feature/user分支改用户信息功能,改了一半要切到bugfix/pay分支改支付Bug:

    步骤:

  • 敲git stash save “修改用户信息功能未完成”(加注释方便后面找);
  • 敲git checkout bugfix/pay切换分支;
  • 改完支付Bug,提交并推送;
  • 切回feature/user分支,敲git stash pop,把之前存的代码取出来;
  • 继续改用户信息功能。
  • 常用命令补充

  • 看stash列表:git stash list(会显示所有存的stash,比如stash@{0}: On feature/user: 修改用户信息功能未完成);
  • 取指定的stash:如果存了多个stash,用git stash apply stash@{1}(取第2个stash,索引从0开始);
  • 删除stash:git stash drop stash@{0}(删除第一个stash);
  • 清空所有stash:git stash clear(慎用,删了就找不回来了)。
  • 最后给你一张“对比表”——不用记,查就行

    为了让你更清楚,我做了张表格,把三个命令的适用场景、是否修改历史、操作难度都列出来了,对照着用绝对不会错:

    命令 核心作用 适用场景 是否修改提交历史 操作难度
    git reset 回退HEAD指针,可选抹除变更 本地未推送的错误提交 是(本地) 中(需选参数)
    git revert 新增反向提交,抵消原变更 已推送的错误提交 否(新增提交) 低(只需提交ID)
    git stash 临时存储未完成的变更 改到一半要切分支 否(不影响历史) 低(只需save/pop)

    其实Git的版本回退没那么复杂,核心就是“看场景选命令”:本地没推的用reset,已推的用revert,临时存代码用stash。我刚学的时候也觉得绕,但用多了就发现——这些命令都是帮你解决问题的,不是用来难住你的。

    你有没有过Git版本回退的“翻车经历”?或者用这三个命令解决过什么棘手的问题?欢迎在评论区告诉我,咱们一起避坑——毕竟踩过的坑,都是 的经验啊!


    你用git revert撤销某个提交的时候,其实Git不是把那个错误提交“抹掉”,而是偷偷帮你生成了一个反向的新提交——比如之前你提交了“修复登录按钮样式”,但后来发现样式改乱了,用revert之后,Git会自动生成一个“撤销修复登录按钮样式”的新提交。但这个新提交一开始只在你自己的电脑里,远程仓库(比如你们公司的GitLab)里根本没有这个记录。要是你不把这个新提交push上去,远程里的错误提交还是好好待着,同事们拉代码的时候,照样会拿到那个改乱样式的版本,等于你白做了一次revert。

    我上回就犯过这错——帮测试同学撤销一个线上的优惠券计算Bug,用revert生成了反向提交,结果转头去改另一个需求,把push这事儿忘得干干净净。等到测试再拉代码测的时候,发现优惠券还是算错,跑过来问我“是不是撤销失败了?”我打开GitLab一看,远程分支里果然没有那个revert的提交,赶紧补了个git push,测试再拉代码才正常。你想啊,Git本来就是用来团队协作的,你自己本地“纠正”了错误没用,得让所有人的代码历史都同步到这个“纠正”的结果才行——不然你这边fix了,别人那边还是错的,等于做无用功。

    还有次更逗,我们组的实习生用revert之后没push,还以为自己“搞定了”,直到运维同学部署的时候,发现线上还是原来的Bug,追着我们查问题。最后翻Git日志才发现,实习生的本地有revert提交,但远程没有,气得运维同学开玩笑说“你这是偷偷在本地改bug啊?”从那以后,我们组里都默认:用revert之后,第一时间push,不然都不算“真的撤销”。其实道理特简单——revert的本质是“新增一个反方向的提交”,既然是提交,肯定得推到远程让大家同步啊,不然跟没做一样。


    git reset、revert、stash最核心的区别是什么?

    三者核心区别在“适用场景”和“对历史的影响”:reset是“时光机”,直接修改本地未推送的提交历史;revert是“抵消魔法”,通过新增反向提交撤销已推送的变更(不破坏历史);stash是“临时抽屉”,仅用于存储未完成的改动(不影响历史)。

    用git reset hard处理已推送的分支会怎样?

    会导致本地与远程提交历史不一致,团队成员拉取代码时会提示“历史冲突”。若强制推送(git push -f),会覆盖远程历史,可能丢失他人提交。已推送的分支严禁用reset hard, 用revert。

    git stash的内容会同步到远程吗?

    不会。stash仅存于本地仓库,不会同步到GitHub、GitLab等远程平台。若换电脑或删本地仓库,未取出的stash会丢失, 给stash加注释(如git stash save “未完成的支付功能”),定期用git stash list检查。

    git revert之后需要push到远程吗?

    需要。revert会生成一个“反向提交”,需推送到远程才能让团队同步“撤销”的结果。若不push,仅本地生效,远程仍保留原错误提交。

    git reset的soft、mixed、hard有什么区别?

    三者影响不同区域:soft保留工作区(写的代码)和暂存区(git add的内容),仅回退提交历史;mixed(默认)保留工作区,回退提交历史和暂存区;hard彻底抹除提交历史、暂存区和工作区的所有变更(需谨慎,避免丢代码)。

    原文链接:https://www.mayiym.com/46202.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码