git 撤销修改和版本回退

摘要:
表示重置HEAD指针、index暂存区和工作区。这个才是完整的版本回退。gitreset--hardHEAD#简写为gitreset--hard#如果你仅仅只是想要撤销暂存区中的修改。#查看工作区和版本库的区别gitdiff上述命令只能查看到工作区中已经存在的文件的修改,如果是新创建的文件,它追踪不到。查看暂存区和版本库的区别#如果你修改了工作区,已经gitadd到了暂存区,想要查看暂存区和版本库的区别。

撤销修改

1、撤销工作区中当前目录中的所有修改
git checkout .

2、撤销工作区中指定文件的修改
git checkout -- filename

注意:checkout命令只能撤销工作区中的修改,不能撤销暂存区中的修改

git checkout命令还有一个非常重要的作用就是切换分支,可用于分支管理

1、切换到指定分支(如果分支在本地不存在,会自动从远程仓库拉取)
git checkout dev

2、切换分支的同时创建分支
git checkout -b dev

版本回退

版本回退是指将版本库从当前版本回退到其他版本

语法:git reset -- hard版本号

有时,我们需要将Git版本回退(还原)到以前的某个版本,可以使用git reset命令

在git中,HEAD指针指向的是当前版本,也就是最新的conmit id,上一个版本是HEAD^,上上个版本就是HEAD^^,上50个版本可以写作HEAD~50。

可以使用下面的命令,回退到上一个版本

gitreset--hard HEAD^

这时,我们再使用git log命令查看版本库被修改的日志。却发现,看不到被回退的版本之后的历史记录了。如果,想再回到最新的版本,怎么办?

只要刚刚的命令行窗口没有关掉,你就可以顺着往上面找,直到发现最新的版本号(如4b2a0c88a2d03675694013ac6a2bd6f55c830cdc),于是,就可以使用下面的命令还原到指定的版本:

gitreset--hard 4b2a0c8

版本号(commit id)没必要写全,一般写前七位就够了,Git会自动去匹配。
但是,假如你回退到了某个版本后,把电脑关了。第二天又后悔了,想要恢复到最新版本。
这时,可以使用命令git reflog来查看你的每一次操作日志,该命令可以输出对应的版本号的操作记录。这样,我们就可以恢复到任意版本了。

语法:git reset options

git reset有很多可用选项,可以使用命令git reset -h来查看

其中最常用的三个选项是:

  • --mixed:reset HEAD and index。表示重置HEAD指针和index暂存区,但保持工作区不变。它是默认选项。
  • --soft:reset only HEAD。表示仅仅重置HEAD指针,即只改变HEAD的指向,但保持工作区和暂存区不变。
  • --hard:reset HEAD, index and working tree。表示重置HEAD指针、index暂存区和工作区。这个才是完整的版本回退。

场景分析

场景一

  • 假如你只是修改了工作区,还没有git add到暂存区。可以使用下面的命令撤销工作区中的修改。

    #仅仅是撤销工作区中的修改
    git checkout .

场景二

  • 假如你修改了工作区,并把工作区中的修改git add到了暂存区。

    # 如果你想撤销工作区和暂存区中的修改。
    gitreset--hard HEAD
    # 简写为
    gitreset--hard

    # 如果你仅仅只是想要撤销暂存区中的修改。
    gitreset--mixed
    # 简写为
    gitreset

场景三

  • 假如你修改了工作区,并把工作区中的修改git add到了暂存区,然后又git commit提交到了版本库。

    # 如果你想回退到上一个版本,可以使用下面的命令。(本地修改会全部清除)
    gitreset--hard HEAD^

    # 查看当前的版本号,可以使用。
    git rev-parse HEAD

说明:完整的版本回退,包含三个要素:

    • 更改HEAD指针的指向(即让HEAD指向目标版本)
    • 回退暂存区(即暂存区中的内容也要回退到目标版本)
    • 回退工作区(即工作区中的内容也要回退到目标版本)

以上简单总结如下:

  • 已修改,未暂存:git checkout . (git checkout <file>)
  • 已暂存,未提交: git reset (git reset --hard 会覆盖)
  • 已提交,未推送: git reset --hard origin/master (远程仓库覆盖本地仓库)
  • 已推送: git reset --hard <commitID> (如果要覆盖远程必须强制推 git push -f)

git强制覆盖本地代码(与git远程仓库保持一致)

git强制覆盖:
    git fetch --all  //从另一个存储库下载对象和引用
    git reset --hard origin/master  //放弃本地修改
    git pull  //开始更新
git强制覆盖本地命令(单条执行):
    git fetch --all && git reset --hard origin/master && git pull
第一个是:拉取所有更新,不同步;
第二个是:本地代码同步线上最新版本(会覆盖本地所有与远程仓库上同名的文件);
第三个是:再更新一次(其实也可以不用,第二步命令做过了其实)

Git其他命令

    • 查看版本库的状态

      语法:git status

      git status命令非常有用。它可以查看版本库的当前状态,还可以看到相关操作的提示信息。

    • 查看修改

      # 如果你修改了工作区中的某些文件,想要查看具体更改了什么内容,可以使用 git diff 命令
      gitdiff.
      gitdifffilename

    • 查看工作区和版本库的区别

      # 如果你只是修改了工作区,还没有 git add 到暂存区,想要查看工作区和版本库的区别。

      # 查看工作区和版本库的区别
      gitdiff

      上述命令只能查看到工作区中已经存在的文件的修改,如果是新创建的文件,它追踪不到。如果修改和新文件已经git add到了暂存区,就需要使用下面的命令来查看。

    • 查看暂存区和版本库的区别

      # 如果你修改了工作区,已经 git add 到了暂存区,想要查看暂存区和版本库的区别。

      gitdiff--cached

    • 查看两个版本之间的区别

      如果你修改了工作区,已经git add到了暂存区,并且git commit到了版本库。这样head指针就指向了最新的版本。想要比较两个版本之间的区别。

      语法:git diff [版本号1] [版本号2]

      # 比较两个版本之间的差异
      git diff4129523 0a7d9af

      #4129523:表示上一个版本号
      # 0a7d9af:当前版本号(最新版本号)

      # 比较之前的版本和当前版本的差异
      git diff4129523head
      # 比较某个文件在两个版本之间的差异
      git diff09d9b45 head ./config/app.php
      # 比较之前的版本和当前版本的差异的简写形式
      git diff4129523

    • 查看本地的两个分支的区别

      语法:git diff [branch1] [branch2]

      # 比较develop分支和master分支的区别
      git diff developmaster

    • 查看本地分支和远程分支的区别

      # 对比本地的develop分支和远程master分支的区别
      git diff develop origin/master

    • 查看版本库的历史记录

      如果你想查看版本库提交的历史记录,可以使用git log命令。

      #查看版本库的历史记录
      gitlog
      #查看版本库的历史记录,美化输出
      gitlog--pretty=oneline
      #查看版本库的历史记录,只显示前5条
      gitlog-5
      gitlog-5--pretty=oneline

免责声明:文章转载自《git 撤销修改和版本回退》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇火狐浏览器打开后出现两个主页,其中一个为hao123复选框QCheckBox下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

git拉取单个目录

有时git库里的东西比较多,我们只希望像SVN一样,只拉取git库的一个目录。 例如:基础代码仓库infra-code_ops有很多基础代码,我们只想拉取仓库里nginx-conf目录的文件。 $ git init infra-code_ops-nginx && cd  infra-code_ops-nginx          //初始...

supervisor的command执行两条命令

如下supervisor的进程的comand配置参数只能写一个命令 1、要执行多条命令,可以写个sh文件包含多条命令,然后sh -x xxxx.sh,但这样又多了一个文件, 2、把所有命令放在字符串,然后用eval来执行,这样在shell窗口可以执行,但放在supervisor报找不到eval命令。比如: command = eval "python -u...

mac os git 安装

1. 在 Mac 平台上安装 Git 最容易的当属使用图形化的 Git 安装工具,下载地址为: http://sourceforge.net/projects/git-osx-installer/ 安装界面如下所示: 我安装的是git2.10.0,算是目前最新的版本。 2.打开安装包,可以看到此时的界面为: 我们需要把.pkg的安装包安装到系统当中。我...

git提交代码五部曲

一、 git clone (这个是你新建本地git仓库,如已有可忽略此步) 复制下git项目的https链接,打开git bash客户端,找到你想要放置的路径下,输入链接,可以在链接后边加个其他的名字进行重命名,要是不加的话就显示git项目的名字。输入你的git账号和密码即可获取到对应的git项目代码。 二、 提交代码第一步:git status 查看当...

在Git中如何撤销上一次的commit

有的时候我们一不小心就git commit -m ‘commit message info’解决办法,很简单,只需执行git reset HEAD~这条命令即可,即能保证你原本的修改还在,也能撤销本次提交失误。 这种撤销上一次提交是比较好的,如果是版本回退的话也能解决这个问题,但是版本回退只适合于你本次提交并没有改动什么或者改动不大的情况。如果你改动太多...

clipper库使用的一些心得

clipper  sourceforge官网:http://sourceforge.net/projects/polyclipping/ 1. 版本号差异 之前project里面使用4.8.6,近期升级到最新版本号6.2.1。接口层面有点区别: 老版本号使用Polygon概念,最新版本号用Path取代了Polygon。对用的Polygons用Paths...