美文网首页
git的时光穿梭

git的时光穿梭

作者: size_of | 来源:发表于2017-07-25 14:52 被阅读0次

    版本回退

    当初始化一个git仓库后,.git文件就是你的版本库。你工作的文件目录被称为工作区,而.git文件中存在一个被称为stage(或者叫index)的暂存区。我们工作的大概流程一般是修改工作区的文件,执行 git add 文件名,将改动添加到暂存区,确认无误后执行git commit -m "xxx",再将暂存区的内容提交到主分支。但是如果在这之中出现了错误想撤销上一步操作我们应该怎么办呢?这里分三种情况:

    撤销工作区的修改

    命令git checkout -- 文件名意思就是,把文件在工作区的修改全部撤销,这里又分两种情况:

    一种是文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

    一种是文件已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

    总之,就是让这个文件回到最近一次git commit或git add时的状态。

    撤销暂存区的修改

    如果你发现添加到暂存区的代码出现了bug,那么这时候用命令git reset HEAD 文件名可以把暂存区的修改撤销掉(unstage),重新放回工作区。
    其实这时候你工作区的代码是有问题的,所以你可以用上面介绍的命令git checkout -- 文件名将工作区的修改撤销。

    撤销版本库的修改

    $ git reset --hard HEAD^可以回退到上一个版本,使用git log命令可以查看commit的历史记录和id,$ git reset --hard id前几位就可以回退到想要的版本。具体用法请看下面。

    $ git reset命令的用法

    我们先用git log命令查看commit日志,以下测试代码都以这个主分支为基准

    $ git log
    commit 8f15b4cc534c83d2baf3b312d28c1c78f511fd81
    Author: Elemento <18733660998@163.com>
    Date:   Tue Jul 25 11:38:56 2017 +0800
    
        添加c
    
    commit 6283e2a3c0e0406b8f055ce16215efcbb55573d7
    Author: Elemento <18733660998@163.com>
    Date:   Tue Jul 25 11:38:32 2017 +0800
    
        添加b
    
    commit a78a9273893b6b14ab2438e74abcf32b3c9484fe
    Author: Elemento <18733660998@163.com>
    Date:   Tue Jul 25 11:37:57 2017 +0800
    
        添加a
    
    

    回退版本库

    使用git reset命令回退两个版本

    $ git reset head~2
    Unstaged changes after reset:
    M       test.txt
    
    $ git log
    commit a78a9273893b6b14ab2438e74abcf32b3c9484fe
    Author: Elemento <18733660998@163.com>
    Date:   Tue Jul 25 11:37:57 2017 +0800
    
        添加a
    

    回退工作区和暂存区

    想要 选择性的回退 这两部分则要添加一些参数,比如--soft、--mixed、--hard

    • --soft: 暂存区和工作区都不回退 (建议在命令行执行后,再输入 git status 查看状态)
    • --mixed: 暂存区回退, 工作区不回退。【这是默认选项】(建议同上)
    • --hard:暂存区和工作区都将回退

    测试--soft参数

    $ git reset --soft head^
    
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            modified:   test.txt
    //只有版本库回退了,暂存区中仍有add的内容
    
    

    测试--mixed参数

    $ git reset --mixed head^
    Unstaged changes after reset:
    M       test.txt
    
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            modified:   test.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    //现在版本库和暂存区都回退了,工作区的内容是修改过的,暂未add到暂存区,暂存区为空
    

    测试--hard参数

    $ git reset --hard head^
    HEAD is now at 6283e2a 添加b
    
    $ git status
    On branch master
    nothing to commit, working directory clean
    
    //现在版本库、暂存区和工作区都回退了
    

    更新中,待续...


    参考了廖雪峰的官方网站以及git reset, git checkout, git revert 区别,本文只作为平时的学习笔记。

    相关文章

      网友评论

          本文标题:git的时光穿梭

          本文链接:https://www.haomeiwen.com/subject/hihwkxtx.html