一、背景:
偶尔会遇到git的版本分支的文件被误改的情况,需要还原,此篇文章可能会帮助到你。
PS:
来理解下 Git 工作区、暂存区和版本库概念,可以更好的理解以下的还原操作。
* 工作区:就是你在电脑里能看到的目录
* 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
* 版本库:工作区有一个隐藏目录 .这个不算工作区,而是 Git 的版本库。
详解的流程图如下:
 
二、git常用命令详解
1.git status:
查看工作区代码相对于暂存区的差别
2.git add .:
将当前目录下修改的所有代码从工作区添加到暂存区,.代步当前目录
3.git commit -m 'message':
将缓存区的内容添加至本地仓库
4.git pull orgin master:
先将远程仓库master中的信息同步到本地仓库master中
5.git push orgin master:
orgin是远程主机,master表示是远程服务器上的master分支和本地分支重名的简写,分支名是可以修改的
6.git checkout -- test001.txt (或还原全部 git checkout -- *)
将工作区修改的文件直接还原为最新版本
7.git reset HEAD
回退至当前版本(本地仓库,并移出暂存区)
8.git reset HEAD^
回退至上个版本(本地仓库,并移出暂存区)
9.git reset --hard HEAD^
回退至上一个版本(本地仓库,并移出暂存区,同时更新工作区的文件)
10.git reset --hard HEAD^^
回退至上上个版本(本地仓库,并移出暂存区,同时更新工作区的文件)
11.git reset –hard commitID 
回退到某一次提交记录(不可逆,之前的提交记录会清除)
12.git revert commitID -m 1
撤销某一次的提交记录
 
三、还原至上一次的提交后(工作区修改了文件,未提交至暂存区)
1.举例说明,git仓库内修改文件test001.txt从 001 -> 001modify
此时界面查看文件包含感叹号.未入暂存区
echo -e 001modify > test001.txt
2.使用git checkout -- test001.txt 将工作区修改的文件直接还原.
此时查看:界面文件为绿色标记,命令行git status状态正常,无提交内容
git checkout -- test001.txt
 
 
四、还原至上一次的提交后(工作区修改了文件,并提交至暂存区,未提交到本地仓库)
1.举例说明,git仓库内修改文件test001.txt从 001 -> 001modify,并add加入暂存区:
echo -e 001modify > test001.txt
2.回退当前的版本: 
界面文件为感叹号标记, 查看状态暂存区内容被移出,本地文件任为修改后.
git reset HEAD
3.使用git checkout -- test001.txt 将工作区修改的文件直接还原. 
此时界面文件为绿色标记,查看状态无提交内容.
git checkout -- test001.txt
 
五、还原至上一次的提交后(工作区修改了文件,并提交至暂存区,已提交到本地仓库,未推送远程仓库)
1.举例说明,git仓库内修改文件test001.txt从 001 -> 001modify,并add加入暂存区:
此时界面文件为感叹号标记
echo -e 001modify > test001.txt
2.使用git commit将修改提交至本地仓库,此时文件状态无感叹号,提示未push远程仓库
3.使用git reset HEAD^回退到上一个版本: 
此时文件状态为感叹号,修改移出暂存区
git reset HEAD^
4. 使用git checkout -- test001.txt 将工作区修改的文件直接还原. 
此时文件状态绿色
git checkout -- test001.txt
5.git push无法将本地仓库推送至远程仓库
使用git push提示报错,因为本地仓库与远程仓库不一致
此时需要推送的话使用强制提交
git push --force
 
六、还原至上一次的提交后(工作区修改了文件,并提交至暂存区,已提交到本地仓库,并已推送远程仓库)
1.本地文件修改,add加入暂存区,commit提交至本地仓库,push推送到远程仓库
此时文件内容被修改,windows文件为绿色标记,状态无提交内容.
2.使用git reset HEAD^直接回退至上个版本:
此时工作区文件仍为修改后,文件状态显示已移出暂存区
git reset HEAD^
3.使用git checkout -- test001.txt 将工作区修改的文件直接还原. 
此时界面文件为绿色标记,查看状态无提交内容.
git checkout -- test001.txt
4.使用git push --force强制提交本地仓库至远程仓库
git push --force
 
七、还原至上一次的提交后(当前版本已push,一步操作)
1.本地文件修改,add加入暂存区,commit提交至本地仓库,push推送到远程仓库
此时文件内容被修改,windows文件为绿色标记,状态无提交内容.
2.使用git reset --hard HEAD^还原至上一个版本
git reset --hard HEAD^
此时同时将文件从暂存区移除,并替换工作区为上个版本,界面标记为绿色
3.使用git push --force强制提交本地仓库至远程仓库
git push --force
 
八.还原至上上次的提交的版本
1.两次提交记录文件修改test001.txt与test002.txt,并分别push远程仓库
通过git log查看提交的记录:
2.使用git reset --hard HEAD^^还原至上一个版本
git reset --hard HEAD^^
此时同时将文件从暂存区移除,并替换工作区为上个版本
3.如需要将本地仓库推送至远程仓库使用强制提交
git push -f
九、还原至某一次提交记录
1.使用git log查看提交的记录信息
2. 使用git reset –hard commitID 还原到某一次提交
git reset --hard 508523eb52ffd6ca274cb01605503fb8bd6bc65a
此时只会把远程版本(对应的commitId)覆盖到本地仓库,然后如果本地做了修改想要提交现修改后的版本到远程就必须强行推送
3.git push -f强制推送本地仓库直远程仓库
git push -f
4.注意:操作不可逆,此时查看git log,还原版本后的记录不复存在
 
十.还原掉其中一次提交并保留其余的提交
1.git log查看日志并找到需要撤销的记录
2.使用git revert commitID -m 1 命令来撤销某一次的提交
git revert 44e1cf32e0d914865d3476d3a765a83a7253586c -m 1
进入对话框保存后记录被撤销
3.查看git log已经撤销,无需推送
ps:当存在分支合并的情况下慎用git revert,会还原已经合并记录的提交.

GIt后悔药:还原提交的操作(谨慎操作)的更多相关文章

  1. Git撤销提交和修改相关操作

    团队开发中经常遇到错误删除文件,错误提交等情况,那么使用Git该如何正确的进行撤销和恢复呢? 一.增补提交 git commit –C HEAD –a --amend -C表示复用指定提交的提交留言, ...

  2. git常用操作 配置用户信息、拉取项目、提交代码、分支操作、版本回退...

    git常用操作 配置用户信息.拉取项目.提交代码.分支操作.版本回退... /********git 配置用户信息************/ git config --global user.name ...

  3. # .NET Core下操作Git,自动提交代码到

    .NET Core下操作Git,自动提交代码到 转自博客园(阿星Plus) .NET Core 3.0 预览版发布已经好些时日了,博客园也已将其用于生产环境中,可见 .NET Core 日趋成熟 回归 ...

  4. [转]git图解(3):分支操作

    本文转自:https://www.jianshu.com/p/342a9f8db004   title_img.png git 的分支是它最明显的特性, 大部分人听别人推荐使用git都会听到“git分 ...

  5. Git入门到高级系列2-git高级操作

    视频课程地址 腾讯课堂 git 清理 git clean命令用来从你的工作目录中删除所有没有tracked过的文件. 命令 说明 git clean -n 告诉你哪些文件会被删除. 记住他不会真正的删 ...

  6. Git 学习(三)本地仓库操作——git add & commit

    Git 学习(三)本地仓库操作——git add & commit Git 和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念.这在上文已有提及,本文具体说明什么是工作区及暂存区,以及 ...

  7. Git应用详解第七讲:Git refspec与远程分支的重要操作

    前言 前情提要:Git应用详解第六讲:Git协作与Git pull常见问题 这一节来介绍本地仓库与远程仓库的分支映射关系:git refspec.彻底弄清楚本地仓库到底是如何与远程仓库进行联系的. 一 ...

  8. React---简单实现表单点击提交插入、删除操作

    import React,{Component,Fragment} from 'react' class App extends Component { constructor(){ super() ...

  9. 【Spring】20、使用TransactionSynchronizationManager在spring事务提交之后进行一些操作。

    本文内容 如何在spring事务提交之后进行一些操作,这些操作必须得在该事务成功提交后才执行,回滚则不执行. 要点 如何在spring事务提交之后操作 如何在spring事务回滚之后操作 实现方案 使 ...

随机推荐

  1. mybatis plus 增删改自动填充字段值

    说明 本文实现以下需求效果 创建数据时自动填充 createUserId 和 createTime 更新数据时自动填充 updateUserId 和 updateTime(每次修改都自动填充新的 up ...

  2. Centos7部署Redis集群

    Redis简介 Redis(Remote Dictionary Server)是完全开源的.遵守BSD协议的.高性能的Key-Value数据库. Redis与其他Key-Value缓存产品有一下三个特 ...

  3. css3常用动画

    //有道云笔记链接 http://note.youdao.com/s/72qbBVyv  

  4. Java面试宝典学习笔记【2020】

    Java面试题总结 一.Java基础 1)Java有没有goto? goto是C语言中的,通常与条件语句配合使用,可用来实现条件转移, 构成循环,跳出循环体等功能.Java保留了这个关键字但是没有使用 ...

  5. 如何用HMS Core位置和地图服务实现附近地点路径规划功能

    日常出行中,路径规划是很重要的部分.用户想要去往某个地点,获取到该地点的所有路径,再根据预估出行时间自行选择合适的路线,极大方便出行.平时生活中也存在大量使用场景,在出行类App中,根据乘客的目的地可 ...

  6. CSS元素的几种显示模式

    元素的显示模式 元素的显示模式就是元素以生么方式进行显示,比如<div>自己占一行,比如一行可以放多个<span>. HTML元素一般分为块元素和行内元素. 块元素 常见的块元 ...

  7. pandas:多层索引

    多层索引是指在行或者列轴上有两个及以上级别的索引,一般表示一个数据的几个分项. 1.创建多层索引 1.1通过分组产生多层索引 1.2由序列创建 1.3由元组创建 1.4可迭代对象的笛卡尔积 1.5将D ...

  8. java通过socket实现https get 请求网页

    1. 首先要初始化ssl context SSLContext context = SSLContext.getDefault(); socket = (SSLSocket) context.getS ...

  9. Cabloy-CMS中区块的开发与效果

    关于区块 Cabloy-CMS引入了区块的概念,通过区块可以快速向文章添加各种类型的内容,比如:插入一个地图子页面.插入一首音乐,等等 Cabloy-CMS中的区块可以类比于Wordpress古腾堡编 ...

  10. Spark读取elasticsearch数据指南

    最近要在 Spark job 中通过 Spark SQL 的方式读取 Elasticsearch 数据,踩了一些坑,总结于此. 环境说明 Spark job 的编写语言为 Scala,scala-li ...