Git撤销&回滚操作(git reset 和 get revert)

git的工作流

工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 git add xx 和 git commit xxx 之后的。

暂存区:已经 git add xxx 进去,且未 git commit xxx 的。

本地分支:已经git commit -m xxx 提交到本地分支的。

代码回滚

在上传代码到远程仓库的时候,不免会出现问题,任何过程都有可能要回滚代码:

1、在工作区的代码

git checkout -- a.txt # 丢弃某个文件,或者
git checkout -- .  # 丢弃全部

注意:git checkout – . 丢弃全部,也包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去。这几个前提都说的是,回到暂存区之前的样子。对之前保存在暂存区里的代码不会有任何影响。对commit提交到本地分支的代码就更没影响了。当然,如果你之前压根都没有暂存或commit,那就是回到你上次pull下来的样子了。

2、代码git add到缓存区,并未commit提交

git reset HEAD . 或者
git reset HEAD a.txt

这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化

3、git commit到本地分支、但没有git push到远程

git log # 得到你需要回退一次提交的commit id
git reset --hard <commit_id> # 回到其中你想要的某个版
或者
git reset --hard HEAD^ # 回到最新的一次提交
或者
git reset HEAD^ # 此时代码保留,回到 git add 之前

4、git push把修改提交到远程仓库

1)通过git reset是直接删除指定的commit

git log # 得到你需要回退一次提交的commit id
git reset --hard <commit_id>
git push origin HEAD --force # 强制提交一次,之前错误的提交就从远程仓库删除

2)通过git revert是用一次新的commit来回滚之前的commit

git log # 得到你需要回退一次提交的commit id
git revert <commit_id> # 撤销指定的版本,撤销也会作为一次提交进行保存

3) git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;
- git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除

开发过程中,你肯定会遇到这样的场景:

场景一:

糟了,我刚把不想要的代码,commit到本地仓库中了,但是还没有做push操作!

场景二:

彻底完了,刚线上更新的代码出现问题了,需要还原这次提交的代码!

场景三:

刚才我发现之前的某次提交太愚蠢了,现在想要干掉它!

撤销

上述场景一,在未进行git push前的所有操作,都是在“本地仓库”中执行的。我们暂且将“本地仓库”的代码还原操作叫做“撤销”!

情况一:文件被修改了,但未执行git add操作(working tree内撤销)

git checkout fileName
git checkout .

情况二:同时对多个文件执行了git add操作,但本次只想提交其中一部分文件

$ git add *
$ git status
# 取消暂存
$ git reset HEAD <filename>

情况三:文件执行了git add操作,但想撤销对其的修改(index内回滚)

# 取消暂存
git reset HEAD fileName
# 撤销修改
git checkout fileName

情况四:修改的文件已被git commit,但想再次修改不再产生新的Commit

# 修改最后一次提交
$ git add sample.txt
$ git commit --amend -m"说明"

情况五:已在本地进行了多次git commit操作,现在想撤销到其中某次Commit

git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]

具体参数和使用说明,请查看:Git Pro深入浅出(二)中的重置揭秘部分

回滚

上述场景二,已进行git push,即已推送到“远程仓库”中。我们将已被提交到“远程仓库”的代码还原操作叫做“回滚”!注意:对远程仓库做回滚操作是有风险的,需提前做好备份和通知其他团队成员!

如果你每次更新线上,都会打tag,那恭喜你,你可以很快的处理上述场景二的情况

git checkout <tag>

如果你回到当前HEAD指向

git checkout <branch_name>

情况一:撤销指定文件到指定版本

# 查看指定文件的历史版本
git log <filename>
# 回滚到指定commitID
git checkout <commitID> <filename>

情况二:删除最后一次远程提交

方式一:使用revert

git revert HEAD
git push origin master

方式二:使用reset

git reset --hard HEAD^
git push origin master -f

二者区别:

  • revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在;
  • reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。

情况三:回滚某次提交

# 找到要回滚的commitID
git log
git revert commitID

删除某次提交

git log --oneline -n5

git rebase -i "commit id"^

注意:需要注意最后的^号,意思是commit id的前一次提交

git rebase -i "5b3ba7a"^

在编辑框中删除相关commit,如pick 5b3ba7a test2,然后保存退出(如果遇到冲突需要先解决冲突)!

git push origin master -f

通过上述操作,如果你想对历史多个commit进行处理或者,可以选择git rebase -i,只需删除对应的记录就好。rebase还可对 commit 消息进行编辑,以及合并多个commit。

到此这篇关于Git撤销&回滚操作(git reset 和 get revert)的文章就介绍到这了,更多相关Git撤销&回滚操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-07-29

git 删除分支和回滚的实例详解

git 删除分支和回滚的实例详解 [git 删除本地分支] git branch -D br [git 删除远程分支] git push origin :br (origin 后面有空格) git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id [本地代码库回滚]: git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除 git reset --hard HEAD~3:将最近3次的提交回滚 [远程代码

基于Git的常用撤销技巧与解决冲突方法(推荐)

git checkout . #本地所有修改的.没有的提交的,都返回到原来的状态 git stash #把所有没有提交的修改暂存到stash里面.可用git stash pop回复. git reset --hard HASH #返回到某个节点,不保留修改. git reset --soft HASH #返回到某个节点.保留修改 撤销Git add操作 git reset HEAD <file> # 取消add操作并保留修改 git checkout -- <file> # 若继续

Git使用小技巧之回滚与撤销详解

前言 日常的开发,我们难免会创建错误的git提交记录,整个时候git给我们提供了两个命令来解决这个问题.一个命令是git reset,另一个是git revert.两者有啥区别呢?两者主要的区别是,git reset命令是回滚某次提交,被回滚的提交将不会出现在提交记录中,而git revert命令是创建一个新的提交来达到撤销的目的,被撤销的提交和撤销的提交都会出现在提交记录中. 准备 首先呢,我们还是需要准备一个git仓库,并且准备一个可以修改的文件,文件名无所谓,我这里就创建了一个README

git如何撤销commit的方法(未push)

撤销commit一般用git reset ,语法如下: git reset [ --mixed | --soft | --hard] [<commit ID>] 1.使用参数--mixed(默认参数),如git reset --mixed <commit ID>或git reset <commit ID> 撤销git commit,撤销git add,保留编辑器改动代码 2.使用参数--soft,如git reset --soft<commit ID> 撤销

简单谈谈Git中的回滚操作

首先介绍下场景 首先,一定要想清楚,自己想干什么. 找redis源码作为例子,查看所在的分支git branch 3.0 3.2 * unstable 取前5条commit看看 git log --pretty=format:"%h - %an, %ar : %s" -5 e9d861e - antirez, 27 hours ago : Clear child data when opening the pipes. e565632 - antirez, 27 hours ago :

Git 撤销操作、删除文件和恢复文件

大致介绍 经过前面的学习,已经建立了版本库,并上传了文件,这次来学习对这些文件进行基本的操作,即: ◆ 撤销操作 ◆ 删除文件 ◆ 恢复文件 我在此之前,已经将三个文件提交到了版本库 撤销操作 撤销操作的语法: git checkout -- 文件名 撤销操作一般有两种情况: ◆ 文件修改后还没有提交到暂存区,进行撤销操作之后,文件恢复到和版本库中一模一样 ◆文件修改后提交到了暂存区,进行撤销之后,文件恢复到在提交到暂存区之前的状态 现在index.htm中的内容是: index.html 我们

Git里多种撤销操作的最佳方法

前言 相信大家都知道任何版本控制系统的一个最有的用特性就是"撤销 (undo)"你的错误操作的能力.在 Git 里,"撤销" 蕴含了不少略有差别的功能.当你进行一次新的提交的时候,Git 会保存你代码库在那个特定时间点的快照:之后,你可以利用 Git 返回到你的项目的一个早期版本. 撤销一个"已公开"的改变 场景: 你已经执行了 git push, 把你的修改发送到了 GitHub,现在你意识到这些 commit 的其中一个是有问题的,你需要撤销

C#/.NET使用git命令行来操作git仓库的方法示例

我们可以在命令行中操作 git,但是作为一名程序员,如果在大量重复的时候还手动敲命令行,那就太笨了. 本文介绍使用 C# 编写一个 .NET 程序来自动化地使用 git 命令行来操作 git 仓库. 这是一篇很基础的入门文章. 最简单的运行 git 命令的代码 在 .NET 中,运行一个命令只需要使用 Process.Start 开启一个子进程就好了.于是要运行一个 git 命令,我们其实只需要这句足以: Process.Start("git", "status")

在Virtualbox下为Ubuntu16.04开机自动挂载共享目录的最佳方法

玩虚拟机的一般都会给虚拟机设置共享目录,便于操作和使用.比如我在64位win10系统下,用Virtualbox安装了Ubuntu 16.04虚拟机,那么我一般都会将win10系统下的一些目录映射到Ubuntu里面去.以前,我都是通过将共享目录的信息直接写入到/etc/fstab文件中来实现自动挂载(关于这一点如何操作,此处不做详解,大家自行百度一下就知道了,很简单).但是,用久了发现几个问题: 第一,我需要挂载到虚拟机的目录位置有好几个(比如有一个临时文件的存放目录tmp,有一个工作项目代码区的

PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)

本文实例讲述了PHP入门教程之使用Mysqli操作数据库的方法.分享给大家供大家参考,具体如下: Demo1.php <?php //使用 mysqli 对象操作数据库 //创建 mysqli 对象(资源句柄) $_mysqli = new mysqli(); //连接数据库 1.主机名(ip) 2.账户 3.密码 4.数据库 //mysqli_connect 函数 == $_mysqli -> connect(); $_mysqli -> connect('localhost','ro

Android ListView里控件添加监听方法的实例详解

Android ListView里控件添加监听方法的实例详解 关于ListView,算是android中比较常见的控件,在ListView我们通常需要一个模板,这个模板指的不是住模块,而是配置显示在ListView里面的东西,今天做项目的时候发现想要添加一个ImageView监听方法,发现崩了,也许是好久没有动ListView竟然忘了不能直接在主UI的xml文件里面调用其他xml文件的控件,哪怕ListView用的是这个xml文件. [错误示范]: 直接调用ImageView这个控件是ListV

C#使用XML序列化操作菜单的方法

本文实例讲述了C#使用XML序列化操作菜单的方法.分享给大家供大家参考.具体分析如下: 之前的一篇文章<C#递归读取XML菜单数据的方法>没使用XML序列化来操作菜单,而且发现那还有一个问题,就是在XML菜单的某个菜单节点前加上一些注释代码的就不能读取,现在使用XML序列化后可以很方便的读取,故在此写一写. XML菜单的节点代码如下: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?>   &l

PHP入门教程之PHP操作MySQL的方法分析

本文实例讲述了PHP操作MySQL的方法.分享给大家供大家参考,具体如下: 设置Zend 软件所有 UTF-8 编码 设置单个项目 UTF-8 的编码 Demo1.php <?php header('Content-Type:text/html; charset=utf-8;'); //第一步,连接到 Mysql 服务器 3306 //第二步参数,服务器地址:第二个参数,服务器的用户名:第三个参数,服务器密码 //@ 如果出错了,不要出现警告或错误,直接忽略 //die 函数之前,先连接一下,报

分布式爬虫处理Redis里的数据操作步骤

存入MongoDB 1.启动MongoDB数据库:sudo mongod 2.执行下面程序:py2 process_youyuan_mongodb.py # process_youyuan_mongodb.py # -*- coding: utf-8 -*- import json import redis import pymongo def main(): # 指定Redis数据库信息 rediscli = redis.StrictRedis(host='192.168.199.108',