背景

所以,经常会遇到已经提交远程仓库,但是又不是我想要的版本,要撤下来。

回退版本一般使用git reset,又分为:

# 不删除工作空间改动代码,撤销commit,不撤销git add .
git reset --soft xxx---版本号---xxxx # 删除工作空间改动代码,撤销commit,撤销git add . 注意完成这个操作后,就恢复到了上一次的commit状态。
git reset --hard xxx---版本号---xxxx

  

两种。

可以用git reset --soft HEAD~1(git reset --hard HEAD~1), 用来表示上一个版本,因为上一版本其实就是当前-1。git reset --soft HEAD~1 也可写成 git reset --soft HEAD^  。

也可以用git reset HEAD 表示当前版本,运行后并不会有什么变化,因为HEAD就是当前。

说这两者区别前,我们首先要明白一个东西,commits。

它在git中扮演了一个重要角色,我们平常用的一些操作git clone ,git commit 都会产生commits,通俗的讲这个就是版本号。

但是git reset并不会产生commits(不是不会产生,而是会产生 但是都是一样的),我们可以先看看自己项目中的commits,使用如下命令:git reflog。

前面那一串数字就是commits。而git reset可以看成不产生commits,它只是改变了当前HEAD指向的commits。

git reset --soft 表示只是改变了HEAD的指向,本地代码不会变化,我们使用git status依然可以看到,同时也可以git commit提交。

git reset --hard后者直接回改变本地源码,不仅仅指向变化了,代码也回到了那个版本时的代码,所以使用是一定要小心,想清楚

备注:

如果commit注释写错了,只是想改一下注释,只需要,git commit --amend,此时会进入默认vim编辑器,修改注释完毕后保存就好了。

解决方案1

注意这个git  reflog 列表是逆序排列的,最上面的最新的commit。

git reset --hard HEAD~1后,最后一个(HEAD->master),将一直往下走,并进一步接近 

以上图所示的状态时,如果再来两次 git reset --hard HEAD~1, 将回到初次提交后的状态。

之后,使用git status ,可发现此时还在缓存区中的代码,其含义是,第一次初始化提交后 ,进行了之后的add后新加入的文件 。

注意这种操作是本地的仓库操作,如果你连续commit了很多次,而这些commit还没有来得及提交远程仓库。此时如果想回到上次本地commit的话,也可以如上操作。再push,便可达到目的。

这时候就好办了,我们选择很多,可以直接修改代码,再commit,也可以取消git add 命令, 如:

git rm -f --cached .idea/*

解决方案2 (推荐)

首先,通过git log查看提交信息,以便获取需要回退至的版本号。

然后,通过git reset –soft <版本号>重置至指定版本的提交,达到撤销提交。

$ git reset --soft  85dee0d8b108c7450e0c820b2d72928f98d94f93

参数soft指的是:保留当前工作区,以便重新提交 。
还可以选择参数hard,会撤销相应工作区的修改,一定要谨慎使用。

通过git push origin master –force强制提交当前版本号,以达到撤销仓库远程版本号的目的。

Cheetah@xxx MINGW64 /e/Projs/enft/data/cv_key_frame (master)
$ git push origin master -f
Total 0 (delta 0), reused 0 (delta 0)
To github.com:AnthonyGIS/video_frame.git
+ c63650a...85dee0d master -> master (forced update) Cheetah@xxx MINGW64 /e/Projs/enft/data/cv_key_frame (master)

  

最后,修改代码,重新提交和推送。

//修改代码,添加修改
git add .
//重新提交
git commit -m "xxx"
//重新推送
git push origin master

参考文章

Git撤回已经推送(push)至远程仓库提交(commit)的版本的更多相关文章

  1. 使用 git 将代码推送到多个仓库

    使用 git 将代码推送到多个仓库 起因     起初,在 GitHub 建了一个仓库,200+ 的 commits .后来(终于在眼泪中明白...误

  2. git推送文件到远程仓库

    远程仓库未创建 git init 初始化一只本地仓库 把你的项目扔进去(或者基于初始化仓库建立项目vue init webpack demoxxxx) git status //查看状态 git ad ...

  3. Git 推送文件到远程仓库

    Configure Git for the first time: git config --global user.name "xxxxx xx"git config --glo ...

  4. git 创建标签推送远程分支

    目录 git 创建标签推送远程分支 查看tag 创建tag 推送标签到远程仓库 删除tag git 创建标签推送远程分支 标签概念: tag, 对于迭代频繁的项目. 每一个标签可以理解为一个版本. 创 ...

  5. Git使用小技巧之多个远程仓库

    想要获取更多文章可以访问我的博客 - 代码无止境. 这是一个普通的工作日,小代正在勤勤恳恳的写代码.这时陈BOSS走到小代身边,跟小代说:"我们的代码需要同时推送到Github和码云两个仓库 ...

  6. git 使用详解(7)-- 远程仓库的使用

    要参与任何一个 Git 项目的协作,必须要了解该如何管理远程仓库.远程仓库是指 托管在网络上 的项目仓库,可能会有好多个,其中有些你 只能读,另外有些可以写.同他人协作开发某个项目时,需要管理这些远程 ...

  7. Git应用详解第五讲:远程仓库Github与Git图形化界面

    前言 前情提要:Git应用详解第四讲:版本回退的三种方式与stash 这一节将会介绍本地仓库与远程仓库的一些简单互动以及几款常用的Git图形化界面,让你更加方便地使用git. 一.Git裸库 简单来说 ...

  8. 键盘侠Linux干货| 使用SSH方式推送文件至github仓库

    前言 作为一名优秀的计算机从业人员,相信大家github应该都知道吧.(优秀的代码托管工具) 但是由于平常使用的https方式克隆的本地仓库,每次git push时都需要输入帐号密码才能将我们修改的文 ...

  9. Github远程仓库提交代码步骤

    1.克隆远程仓库     1)当没有设置默认目录时         git clone 仓库地址 本地存放目录 //没有目录的情况    2)当设置了本地存放目录时         先打开路径,命令: ...

随机推荐

  1. 在线http模拟工具

    在线http模拟工具http://www.atool.org/httptest.php

  2. 0.9.0.RELEASE版本的spring cloud alibaba sentinel+gateway网关实例

    sentinel除了让服务提供方.消费方用之外,网关也能用它来限流.我们基于上次整的网关(参见0.9.0.RELEASE版本的spring cloud alibaba nacos+gateway网关实 ...

  3. Web.Config中配置字符串含引号的处理

    配置文件中往往要用到一些特殊的字符, Web.Config默认编码格式为UTF-8,对于XML文件,要用到实体转义码来替换.对应关系如下: 字符 转义码 & 符号 & & 单引 ...

  4. C++接口的概念

    满足下面条件: 1.类中没有定义任何的成员变量 2.所有的成员函数都是公有的 3.所有的成员函数都是纯虚函数 4.接口是一种特殊的抽象类

  5. PHP IE9 AJAX success 返回 undefined 问题解决

    jquery的AJAX返回结果为undefined,并且有“由于出现错误c00ce56e”的错误提示.这个问题是由于IE9不能解析其他编码而产生的.解决这个问题之需要按照W3C规范,声明一下编码为ut ...

  6. [ kvm ] 学习笔记 3:KVM 基础功能详解

    1. 构建 KVM 环境 KVM 从诞生开始就需要硬件虚拟化的支持,KVM 必需的硬件虚拟化扩展分别是:Intel 的虚拟化技术(Intel VT)和 AMD 的 AMD-V 技术.首先处理器(CPU ...

  7. jvm(1)---java内存结构

    jvm主要由三个子系统构成:类加载子系统,运行时数据区,执行引擎 运行时数据区主要包括: 1.本地方法栈:登记native方法,执行时加载本地方法库 2.程序计数器:就是一个指针,用来存储指向下一条执 ...

  8. formSelects隐藏功能键

    隐藏后 方法: // selectId就是select的id,这是在select渲染完后执行 $("#selectId").parent().find(".xm-sele ...

  9. dotnet core use Redis to publish and subscribe

    安装Redis 同样我这边再次使用Docker, 方便快捷: # 拉取镜像 docker pull redis # 运行镜像 docker run -d -p 6379:6379 --name red ...

  10. 031 Android 异步任务(AsyncTask)

    1.介绍 AsyncTask(了解即可),重点掌握Handler+Thread 2.实现方法 3.执行步骤 4.java后台 package com.lucky.test36asynctask; im ...