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撤销&回滚操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 简单谈谈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里多种撤销操作的最佳方法

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

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

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

  • 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 删除分支和回滚的实例详解

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

  • 基于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 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 chec

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

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

  • 解析php mysql 事务处理回滚操作(附实例)

    很多新手在进行项目过程中,会碰到这样一种情况,如:论坛扣币项目中,用户支付论坛币的时候如果突然断网.电脑死机.停电.等其它自然灾害时,导致本次交易没有成功(即用户的币已经扣掉了,但是服务器数据库中没有消费记录等其它情况),这种情况应该怎么样进行处理呢? 在这个时候,我们可以用Mysql事务回滚来进行处理,那代码怎么写呢? 那下面我就来说一说这个mysql事务回滚应该怎么处理. 首先MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的! 那如果,我们的数据表已经存

  • jquery中each循环的简单回滚操作

    话不多说,请看代码: var ispass = true; var obj = new Object(); $.each(data,function(i,td){ var sum=data[i].sum; var num=data[i].num; var id=data[i].num; if(num>sum){ ispass=false; alert("数量不能大于总数量!"); sum+=num; return false; } obj[id]=sum; }) if(!ispa

  • SQL Server 添加Delete操作回滚日志方式

    我们在操作表的时候难免会遇到误删除,或者删掉的数据还想恢复的情况. 也许细心的朋友会用begin tran rollback/commit 这种事务来避免出现失误,但这并不是最保险的. 如果提交了事物发现删错了或者忘记提交从而导致表被锁,这些问题总是不可避免的. 废话不多说了,下面直接进入正题,通过触发器记录删除日志,避免误删除带来的尴尬. 下面这段sql粘过去直接运行,建立一个存储过程: CREATE PROCEDURE [dbo].[SP_DELETE_LOG] @TABLENAME VAR

  • mybatis 事务回滚配置操作

    在mybatis进行批量操作的时候,插入多条数据时,设置回滚但是前面几条还是插入,经过尝试 问题所在: 官网api上openSession(false)就可以回滚了,但是用session.getConnection().getAutoCommit()查看还是true 解决方法: 将DataSource配置改为AutoCommit(false) 将conn设置setAutoCommit(false),用conn进行提交,回滚操作 例子: SqlSession session = sqlSessio

  • Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍

    1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 代码如下: ed_user = User('ed', 'Ed Jones', 'edspassword')session.add(ed_user) 上面两段代码执行完后对象持久化了么?你或许会兴冲冲的跑去数据库里查看,结果却失望而归--数据库里什么都没有.为什么呢?因为SQLAlchemy采取的是

  • laravel 执行迁移回滚示例

    Laravel鼓励敏捷.迭代的开发方式,我们没指望在第一次就获得所有正确的. 我们对于自己编写和设计数据库,可以通过迁移文件,不断的重复去测试. 但是有些时候我们需要去执行迁移回滚 (1) 建议使用 执行上一次迁移回滚 如果是本地开发(一般都在前期开发) 执行:php artisan migrate:rollback(迁移文件在/database/migrations下) 如果是在文件夹下的回滚呢? 执行:php artisan migrate:rollback --path=/database

随机推荐