Git 撤销修改和版本回退

撤销修改

# 撤销修改是指将工做区中的修改撤销
git checkout [文件名或路径]

# 一、撤销工做区中当前目录中的全部修改
git checkout .

# 二、撤销工做区中指定文件的修改
git checkout -- filename

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

git checkout命令还有一个很是重要的做用就是切换分支,可用于分支管理java

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

# 二、切换分支的同时建立分支
git checkout -b dev

版本回退

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

git reset -- hard 版本号

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

git中,HEAD指针指向的是当前版本,也就是最新的conmit id,上一个版本是 HEAD^,上上个版本就是 HEAD^^,上50个版本能够写做HEAD~50 app

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

git reset --hard HEAD^

  

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

只要刚刚的命令行窗口没有关掉,你就能够顺着往上面找,直到发现最新的版本号(如4b2a0c88a2d03675694013ac6a2bd6f55c830cdc),命令行

# 就可使用下面的命令还原到指定的版本,版本号(commit id)不必写全,通常写前七位就够了,Git会自动去匹配:

git reset --hard 4b2a0c8

可是,假如你回退到了某个版本后,把电脑关了。次日又后悔了,想要恢复到最新版本。指针

这时,可使用命令 git reflog 来查看你的每一次操做日志,该命令能够输出对应的版本号的操做记录。这样,咱们就能够恢复到任意版本了。 日志

语法:git reset options blog

git reset 有不少可用选项,可使用命令 git reset -h 来查看it

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

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

    语法:git status

    git status 命令很是有用。它能够查看版本库的当前状态,还能够看到相关操做的提示信息。

  2. 查看修改
    # 若是你修改了工做区中的某些文件,想要查看具体更改了什么内容,可使用 git diff 命令
    git diff .
    git diff filename
  3. 查看工做区和版本库的区别
    # 若是你只是修改了工做区,尚未 git add 到暂存区,想要查看工做区和版本库的区别。
    # 查看工做区和版本库的区别
    git diff
    

     

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

  4. 查看暂存区和版本库的区别
    # 若是你修改了工做区,已经 git add 到了暂存区,想要查看暂存区和版本库的区别。
    git diff --cached
  5. 查看两个版本之间的区别

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

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

    # 比较两个版本之间的差别
    git diff 4129523 0a7d9af
    
    # 4129523:表示上一个版本号
    # 0a7d9af:当前版本号(最新版本号)
    
    # 比较以前的版本和当前版本的差别
    git diff 4129523 head
    
    # 比较某个文件在两个版本之间的差别
    git diff 09d9b45 head ./config/app.php
    
    # 比较以前的版本和当前版本的差别的简写形式
    git diff 4129523
  6. 查看本地的两个分支的区别

    语法:git diff [branch1] [branch2]

    # 比较develop分支和master分支的区别
    git diff develop master
  7. 查看本地分支和远程分支的区别
    # 对比本地的develop分支和远程master分支的区别
    git diff develop origin/master
  8. 查看版本库的历史记录

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

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

场景分析

场景一

  • 假如你只是修改了工做区,尚未 git add 到暂存区。可使用下面的命令撤销工做区中的修改。
# 仅仅是撤销工做区中的修改
git checkout .

场景二

  • 假如你修改了工做区,并把工做区中的修改 git add 到了暂存区
# 若是你想撤销工做区和暂存区中的修改。
git reset --hard HEAD
# 简写为
git reset --hard

# 若是你仅仅只是想要撤销暂存区中的修改。
git reset --mixed
# 简写为
git reset

场景三

  • 假如你修改了工做区,并把工做区中的修改 git add 到了暂存区,而后又 git commit 提交到了版本库。
# 若是你想回退到上一个版本,可使用下面的命令。
git reset --hard HEAD^

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

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

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