git:代码回退restore 、reset、revert

这篇具有很好参考价值的文章主要介绍了git:代码回退restore 、reset、revert。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

友好提示看这篇需要对git有一定了解!!!

git中有很几个关于代码回退的命令:restore 、reset、revert ,初学git的同学们可能搞不清楚什么时候该用哪个,根据我的一点点经验,简单介绍一下它们,希望能帮到大家

(我的水平有限,内容仅供参考.,哪里有问题,欢迎指出)

一: restore(恢复)

  • 针对的是暂存区的恢复(重点理解)
git restore [file]
将不在暂存区的文件撤销更改
git restore --staged [file]
将提交到暂存区的文件恢复到工作区

例1:将新增文件从暂存区到工作区(绿色变红),针对的是add操作

//创建a.txt            
touch a.txt				红色
//编辑a.txt				
echo "aaa" >> a.txt  	红色
//将文件添加到暂存区	
git add a.txt			绿色
//如何将a.txt 退回到工作区呢?
git restore --staged a.txt 变红色了
注意!已经在本地仓库的文件,用git restore --staged 命令无论如何也恢复不到工作区(变红),因为restore只针对暂存区

例2:旧文件在暂存区的修改,但没有add

旧文件 a.txt			  灰白色
//编辑a.txt				
echo "aaa" >> a.txt  	蓝色
//如果将暂存区文件,在工作区的更改恢复到以前
git restore  a.txt

二: reset(重置)

  • 针对的本地仓库的恢复(重点理解)

当我们进行了错误的提交,但是还没有push到远程分支,想要撤销本次提交,建议使用git reset 命令

git reset 有三个参数

git reset --hard [commit Id]
reset --hard 会在重置 HEAD 和branch的同时,重置stage区和工作目录里的内容。
你的stage区和工作目录里的内容会被完全重置为和HEAD的新位置相同的内容。换句话说,就是期间的所有修改会被全部擦掉。
git reset --soft [commit Id]
reset --soft 会在重置 HEAD 和 branch 时,保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区。
git reset --mixed(默认) [commit Id]
reset 如果不加参数,那么默认使用 --mixed 参数。
它的行为是:保留工作目录,并且清空暂存区。也就是说,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录。简而言之,就是「把所有差异都混合(mixed)放在工作目录中」

补充!!!

git reset 也支持HEAD
//git reset --hard HEAD 表示当前commit,作用也是工作区(删除)、暂存区(删除)、本地仓库(回滚)这种,和指向其它commit没什么区别
//一般用这个命令,将写了半天的代码恢复到没写之前~.~,有没有发现和IDEA中的Rollback很像呢?
//没错Rollback的原理就是:git reset --hard HEAD
git reset --hard HEAD

git restore,git,git

其它方面和revert的HEAD一样
#提交记录
A1 ---> A2 ---> A3 ---> A4 ---> A5 ---> A6(最新版本)
#对应的HEAD值,一般HEAD指向最新的一条A6
 5 ---> 4 ---> 3 ---> 2 ---> 1 ---> 0(最新版本)

例1 撤销一次提交

旧文件 a.txt			  灰白色
//编辑a.txt				
echo "hard" >> a.txt  	蓝色
//提交更改到暂存区
git add a.txt			蓝色
//提交更改到本地仓库
git commit -m "hard测试"  灰白色
//查看提交日志
git log --oneline

结果类似如下:

$ git log --oneline
bc9abf9 (HEAD -> master) ss
6151ecf (origin/master) fix:origin2的修改
220c79d ceshi3
4cd4ece ceshi2

其中bc9abf9 、6151ecf … 就是commit Id的简短版本,够用了

//如何撤销上一次的提交呢,使用 reset --hard  之前的commitId 
reset --hard  6151ecf 
//就发现上一次提交消失了,并且本地暂存区的代码,工作区的代码全部都恢复到之前的commitId版本了

如果我们想保留暂存区的代码

//假如在git commit -m "hard测试" 后
//编辑了a.txt,但不add到暂存区
echo "test" >> a.txt
//如果我们想保留工作区的代码更新
//可以使用 reset --soft  6151ecf 或者  reset --mixed  6151ecf
//它俩的区别是mixed会将暂存区的修改恢复到工作区(恢复到add之前的状态,可以参考git restore --staged 理解),而soft不会

总结:

三种模式都会撤销commit的提交,也就是本地仓库会回滚
soft  工作区(保留)、暂存区(保留)、本地仓库(回滚)
mixed 工作区(保留)、并将暂存区退回到工作区(不是删除,只是需要重新add)、本地仓库(回滚)所以也叫混合模式
hard  工作区(删除)、暂存区(删除)、本地仓库(回滚)

三: revert(恢复)

  • 针对的是本地仓库的恢复

1、revert的原理是,在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化。它不会改变过去的历史,所以是首选方式,没有任何丢失代码的风险

2、revert可以抵消上一个提交,那么如果想要抵消多个需要执行 git revert 倒数第一个commit id 倒数第二个commit

3、这个就常用于当你提交了一次commit之后发现提交的可能有问题就可以用到revert

4、还有一种情景是已经有很多人提交过代码,但是想改之前的某一次commit记录又不想影响后面的也可以使用revert,他会把你后面提交的记录都放到工作区只是合并的时候需要注意一点

如果commit后push到远程分支上了,建议用git revert

revert有两种方式:

git revert [commitId]
#对commitId执行反向操作,恢复到commitId的上一个commitId的代码
git revert [commitId]
git revert HEAD
#提交记录
A1 ---> A2 ---> A3 ---> A4 ---> A5 ---> A6(最新版本)
#对应的HEAD值,一般HEAD指向最新的一条A6
 5 ---> 4 ---> 3 ---> 2 ---> 1 ---> 0(最新版本)
#HEAD相当于HEAD~0   表示对最近的一次提交(A6)实施反向操作,也就是将代码变成A5的版本
#相当于 git revert HEAD~0 相当于 git revert A6
git revert HEAD 
#git revert HEAD~1 表示git revert A5,也就是将代码变成A4的版本
git revert HEAD~1
#如果要回到A3,那么就要生成A4,A5,A6相反的提交,这里可以用范围( ] 前开后闭
git revert HEAD~3..HEAD

注意!

1.执行 git revert HEAD 后会自动commit,并进入vim界面,让你填写commit 消息
#如果生成了反向操作,但暂时不想自动提交可以用--no-commit
git revert --no-commit HEAD
2.如果我们跳过HEAD~ HEAD~1和HEAD~2,直接执行git revert HEAD~3 ,会出现和HEAD~ HEAD~1和HEAD~2的冲突
解决方式一就是:一次生成多个反向操作
git revert HEAD~3..HEAD
解决方式二就是:自己解决冲突咯,然后再add .,commit,push 
//我个人喜欢第二种(),但是我推荐你用第一种(生成多个反向的commit,很清晰)

例1 如果生成相反的提交操作

//创建文件 a.txt
touch a.txt
//开始第一次
echo "1" >> a.txt
git add .
git commit -m "feat:1"
//开始第二次编辑
echo "2" >> a.txt
git add .
git commit -m "fix:2"
//开始第三次编辑
echo "3" >> a.txt
git add .
git commit -m "fix:3"
//开始第四次编辑
echo "4" >> a.txt
git add .
git commit -m "fix:4"
//开始第五次编辑
echo "5" >> a.txt
git add .
git commit -m "fix:5"
//五次差不多了,push
git push

查看下日志

//--oneline :日志简略版
//-5 :只展示最近5条
$ git log --oneline -5
1e4c0e3 (HEAD -> master, origin/master) fix:5
ba8edff fix:4
742997a fix:3
a668a6f fix:2
e8ffae4 fix:1

如果我们想恢复到fix:3的代码,那么就需要对fix:5和fix:4做revert

//生成多个反向commit,不需要解决冲突
git revert HEAD~2..HEAD
//生成一个反向commit,需要解决冲突
git revert HEAD~1
1e4c0e3 (HEAD -> master, origin/master) fix:5
ba8edff fix:4
742997a fix:3
a668a6f fix:2
e8ffae4 fix:1

如果我们想恢复到fix:3的代码,那么就需要对fix:5和fix:4做revert文章来源地址https://www.toymoban.com/news/detail-744285.html

//生成多个反向commit,不需要解决冲突
git revert HEAD~2..HEAD
//生成一个反向commit,需要解决冲突
git revert HEAD~1

到了这里,关于git:代码回退restore 、reset、revert的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Git 基础知识--stash 存储、reset 回退及恢复

    简介 Git 提供了 stash 存储的功能,即当你在工作到一半突然需要切换到另一个分支上,但又不想提交时,可将当前做出的修改通过 git stash 命令存储起来,之后再从其中重新读取之前的状态。 注意事项 若修改的文件没有执行 git add 即未被跟踪,则该文件不会被 git stash 存储,

    2023年04月10日
    浏览(49)
  • git reset 版本回退或撤销上一次pull操作

    在拉取分支准备合并的时候,发现分支拉错了,不想提交,这时候你应该回退一下你所拉取的分支 比如我现在已经执行完git pull 了,但是想回头git pull之前的内容 upstream 是我远程分支 pro是我远程分支的生产环境 现在我们先看看历史提交记录 git reflog 打印的更为详细一些 这里

    2024年02月11日
    浏览(50)
  • git reset回退版本【Git异常】You are in ‘detached HEAD‘ state

    git clone项目后,在main分支回退版本,出现报错 detached HEAD称为分支游离状态 1、从远程库clone下来一个远程的repository; 2、clone下来之后,git自动在本地建立了一个本地分支master,并自动与远程库master关联; 3、现在在操作checkout其他分支名(dev_v1);因为本地的工作区目前是刚刚

    2024年02月11日
    浏览(48)
  • git 常用基本命令, reset 回退撤销commit,解决gitignore无效,忽略记录或未记录远程仓库的文件,删除远程仓库文件

    https://blog.csdn.net/a704397849/article/details/135220091 idea 中 rest 撤销commit过程如下: Git - Rest Head… 在To Commit中的HEAD后面加上^,点击Reset即可撤回最近一次的尚未push的commit Reset Type 有三种: Mixed(默认方式),保留本地源码,回退 commit 和 index 信息,最常用的方式 Soft 回退到某个版

    2024年02月02日
    浏览(65)
  • Git回退代码操作大全

    git回退代码的三种方式mixed,soft,hard 基于IDEA操作,也有纯命令操作,操作方式几乎差不多,在这里不做赘述。 一、.mixed的操作(IDEA的默认操作) 1.左下角git指向标,点击看到我们的git操作日志。选择你要回退的版本。 复制Reversion Number*** 2.在git----resposity-----Reset Hard粘贴你的Reversion N

    2024年02月09日
    浏览(44)
  • Git回退已经提交commit的(还未推送push的)代码及撤回代码回退

    1.Git回退已经提交的代码 原文链接(原文写的是已经推送push的代码) http://t.csdn.cn/CDjgq 已经开始难过了,我提交后没有推送就按照上文提示进行了代码回退,结果idea里面没得我最后一次提交的代码。。。然后我开始了第二轮操作, 撤回 代码回退 2.撤回代码回退 1)首先输入

    2024年02月13日
    浏览(68)
  • Java后端入职第四天,就被要求代码回退(Git回退实战)

    初入职场,由于自己的失误或者对git不熟悉,把被人的代码给冲突掉了,然后需要立马回滚,对于新手开发,应该比较常见吧!或者,比较多一种情况,错误把工程add了到了暂存区,比如一些本地配置,本来就不应该提交的,又或者,开发中只提交部分代码,又想最新的提交

    2024年02月06日
    浏览(37)
  • git同步更新、提交代码、回退操作、合并提交

    一、从远程仓同步更新到个人仓(分支) 1、git clone -b xxx分支 xxx个人仓地址(clone个人仓分支到本地) 2、cd xxx/(进入clone项目的根目录) 3、git remote -v(查看origin upstream)       git remote add upstream xxx远程仓地址(添加上游代码库) 4、git fetch upstream(获取原仓库的更新)

    2024年02月07日
    浏览(62)
  • Git 回退代码的两种方法对比

    Git 回退代码版本 在项目的开发中,有时候还是会出现,一些误提交了一些代码,这时候就会想撤回提交的代码,在Git中有两种方法可以使用,现在通过对比方法比较这两种方法的区别,分别适用于哪些情况? 在Git中回退代码,经常使用revert或者reset来做,这两种操作都可以

    2024年02月07日
    浏览(59)
  • git merge合并分支代码后如何回退合并操作

    这次问题产生的原因还是自己操作过于急躁了,新功能开发完成之后没有实时的与经理沟通就进行了新功能分支合并的操作,导致当前版本部分功能由于没有同步产生了一些问题,因此需要把代码进行回退操作; 但是分支代码修改了许多文件,并且已经推送到了远程仓库,手

    2024年02月08日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包