本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/git_code_roll_back_revert_and_reset

reset

某些特殊的情况下,需要回退到先前的某一次提交。

git log 查找想要回退的commit的id后运行:

git reset --hard 2c1e288

回退后git log只会显示回退版本之前的提交。如果需要返回最新的提交,使用git reflog查看对应的id。

git reset只适合本地的回退和查看先前代码。如果远程仓库已有最新的提交,git会认为远程仓库的代码较新,需要先同步远程代码再进行修改,此情况下建议使用revert。

git reset –soft –mixed –hard

HEAD~为例(HEAD前的一次提交)

git reset --soft HEAD~ 会回到前一次提交的commit执行之前的状态
git reset --mixed HEAD~ 会回到前一次提交的add执行之前的状态
git reset --hard HEAD~ 会回到前一次提交的add执行之前的状态,并且将目录里的所有文件调整为前一次的提交状态

通常回退时需要将文件也回退需要加 –hard 标签。

git的文件组织

git将所有的文件以hash码命名放在仓库中存储。

HEAD指针,一般可以理解为当前commit状态的一个快照(指向仓库中当前commit的所有的文件)。每次commit或者merge等会创建新的commit节点时,会让HEAD指向新的位置。

reset会改变HEAD指针的位置与HEAD对应的分支指针的位置,checkout只会改变HEAD指针指向的分支。

revert

git revert <commit-id> 相当于取消一次commit ,会让结果和没有这一次提交一样,并非像reset那样直接回到某一次commit的代码。

使用revert不会破坏历史记录,只是提交一个新的修改使修改后代码和以前一致。

实质上相当于用前的代码merge 后的代码,因此如果后面对代码文件做了修改需要解决冲突。

revert一个merge commit

注意revert用在merge的commit上的情况有坑

git revert <commit-id> -m 1 需要添加-m参数,指定是merge前的第几个分支(git log上的merge后)。

revert的主要麻烦:如果存在分支合并的情况,如下,从m1 revert到a2时会添加一个新的提交m2,当m2与b2 merge时会显示已经merge过

a1 -> a2 -> m1 -> m2
b1 -> b2 /

因此在两个分支还需要合并时,不能直接使用merge,而要先revert上一次的revert,让两次revert抵消,也就是 git revert <m2 commit id>

为了少折腾,碰到两个分支以后注定还是要合并的情况,还是不要revert了吧,或者revert之后改完相应的代码就revert回来,貌似没人提到更好的解决方案….

不常用的回退

以下命令存在危险性不建议使用,而且一般也没有使用必要。注意某些操作针对未提交前的处理,可能导致对文件修改的丢失。git对已提交的文件几乎总是可以恢复的,因此建议尽量在提交后处理。

git checkout <file> 撤销文件修改(到上一次提交)。
git commit --amend 重新提交,提交后删除上一次提交。

git 代码回滚与爬坑 -- reset and revert的更多相关文章

  1. git的回滚与撤销【reset and revert】

    git的工作流程-- 3个区域 工作区:我们可以看到的文件内容 在操作 git add 之前的!! 缓存区:是不可见的  已经git add操作,还没git commit -m "" ...

  2. git代码回滚:Reset、Checkout、Revert的选择

    代码回滚:Reset.Checkout.Revert的选择 Zhongyi Tong edited this page on Dec 8, 2015 · 5 revisions Pages 19 Ho ...

  3. 6.Git代码回滚

    1.代码修改并提交 我们已经成功地添加并提交了一个helloWorld.txt文件,现在,是时候继续工作了. 于是,我们继续修改helloWorld.txt文件,改成如下内容: $ vi helloW ...

  4. git代码回滚的两种选择

    回滚到指定commit,且保持该commit之前和之后的提交记录 使用git revert命令. git revert HEAD // 回滚到前一次 commit git revert HEAD^ / ...

  5. git代码回滚

    有时候我们用git提交代码后发生了错误,代码冲突了啊等等,我们需要将代码回到以前的某个版本 git代码回退有两种办法 一.git reset(推荐): 它是将最新的commit删除,用以前的某个版本的 ...

  6. 转一篇Git代码回滚技巧

    转 https://github.com/geeeeeeeeek/git-recipes/wiki/5.2-代码回滚:Reset.Checkout.Revert的选择

  7. Git如何回滚代码?

    摘要: 多年以后,你面对一个需要回滚的Git仓库,准会想起这篇博客. 某一天,用户跟我反馈,他不能分配任务了.我去看了一下Fundebug捕获的报错信息: 可知,出错原因是前端发送的请求参数有问题.这 ...

  8. 代码回滚:Reset、Checkout、Revert的选择

    代码回滚:Reset.Checkout.Revert的选择 Git仓库有三个主要组成——工作目录,缓存区和提交历史. 从图中我们可以看出,缓存区或者叫索引,其实是指一整套即将被下一个提交的文件集合.也 ...

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

    转自:https://blog.csdn.net/asoar/article/details/84111841 git的工作流 工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 ...

随机推荐

  1. C# EF 加密连接数据库连接字符串

    不多说,直接上代码 public partial class Model1 : DbContext { private static string connStr = ""; pu ...

  2. 一、Windows docker入门篇

    win7.win8 等需要利用 docker toolbox 来安装,国内可以使用阿里云的镜像来下载,下载地址:http://mirrors.aliyun.com/docker-toolbox/win ...

  3. kvm第五章--虚拟迁移

  4. iOS - 苹果官方Apple Pay开发文档(中文版)- Apple Pay(1)

    翻译自苹果官方Apple Pay开发文档.目前版本为1.0 概览: Apple Pay为用户从你的App里购买实际的物品和服务提供简单而安全的方法.通过Touch ID,用户可使用储存在iPhone ...

  5. pandas(四)

    合并  merge,concat,join pd.merge(df1,df2,on=‘列名’,how='') df1.join(df2,how='outer',on='') pd.concat([df ...

  6. Python基础——运行机理

    Python解释器 从Python这门编程语言的实现上来讲,Python是一个名为解释器的软件包,包含:一个解释器 和 支持的库 解释器又有不同版本:CPython.Jython.IronPython ...

  7. 解决mybatis实体类和数据库列名不匹配的两种办法

    我们在实际开发中,会遇到实体类与数据库类不匹配的情况,在开发中就会产生各种各样的错误,那么我们应该怎么去解决这一类的错误呢?很简单,下面我们介绍两种解决方法: 首先我们看一下数据库和实体类不匹配的情况 ...

  8. vim配置笔记

    1. vim两种配置方法 1)配置文件 全局配置文件:/etc/vim/vimrc或者/etc/vimrc 用户个人配置文件:~/.vimrc 2)命令模式 命令行模式下直接输入配置命令即可.如:se ...

  9. Django之路——2 Django的安装

    Django的安装分为两种方式,一种是命令行安装,另外一种是pycharm安装.在这里只说一种在命令行里面安装的 1.命令行安装 这个自不必多说,直接上干货,如果遇到pip版本过低,安装失败的,请自自 ...

  10. jQuery实现点击复制效果

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...