zoukankan      html  css  js  c++  java
  • git 撤销修改和版本回退

    撤销修改

    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 。

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

    git reset --hard HEAD^

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

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

    git reset --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 到了暂存区。

         

      # 如果你想撤销工作区和暂存区中的修改。
      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 指向目标版本)
      • 回退暂存区(即暂存区中的内容也要回退到目标版本)
      • 回退工作区(即工作区中的内容也要回退到目标版本)

    以上简单总结如下:

    • 已修改,未暂存: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 命令
        git diff .
        git diff filename

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

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

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

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

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

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

        git diff --cached

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

        如果你修改了工作区,已经 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

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

        语法:git diff [branch1] [branch2]

           

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

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

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

      • 查看版本库的历史记录

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

        # 查看版本库的历史记录
        git log

        查看版本库的历史记录,美化输出
        git log --pretty=oneline

        查看版本库的历史记录,只显示前 5 条
        git log -5

        git log -5 --pretty=oneline

  • 相关阅读:
    清明节实现所有网页变灰色
    点击按钮,复制文本
    Matlab笔记
    spring框架中配置mysql8.0需要注意的地方(转载)
    移动吉比特H2-2光猫超级用户与密码
    JS关闭chorme页面
    MATLAB利用solve函数解多元一次方程组
    微信聊天记录导出为csv,并生成词云图
    fmt.Sprintf(格式化输出)
    iris,context源码分析
  • 原文地址:https://www.cnblogs.com/-mrl/p/15476877.html
Copyright © 2011-2022 走看看