• Git_回退到上一次commit与pull


    工作区、暂存区、版本库

    • 工作区:就是你在电脑里能看到的目录。
    • 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
    • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

    下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

    • 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树

    • 图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

    • 图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。

    • 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

    • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

    • 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

    • 当执行 git rm --cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。

    • 当执行 git checkout . 或者 git checkout – 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。

    • 当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

    git的工作流程一般是这样的:

    1. 在工作区中添加、修改文件

    2. 将需要进行版本管理的文件放入暂存区

    3. 将暂存区域的文件commit到本地库(版本库)

    4. 推送本地库到远程库

    因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)

       3、文件的四种状态

    版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。

    GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用

    SHA-1算法计算文件的校验和。

    Untracked:未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.

    Unmodify:文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified.如果使用git rm移出版本库, 则成为Untracked文件

    Modified:文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状 态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改

    Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存,文件状态为Modified

     下面的图很好的解释了这四种状态的转变:

    新建文件--->Untracked

    使用add命令将新建的文件加入到暂存区--->Staged

    使用commit命令将暂存区的文件提交到本地仓库--->Unmodified

    如果对Unmodified状态的文件进行修改---> modified

    如果对Unmodified状态的文件进行remove操作--->Untracked

     

    二、四个区域常用命令

       1、新建代码库
    # 在当前目录新建一个Git代码库
    git init
    # 新建一个目录,将其初始化为Git代码库
    git init [project-name]
    # 下载一个项目和它的整个代码历史
    git clone [url]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
       2、查看文件状态
    #查看指定文件状态
    git status [filename]
    #查看所有文件状态
    git status
    
    • 1
    • 2
    • 3
    • 4
        3、工作区<-->暂存区
    # 添加指定文件到暂存区
    git add [file1] [file2] ...
    # 添加指定目录到暂存区,包括子目录
    git add [dir]
    # 添加当前目录的所有文件到暂存区
    git add .
    #当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用(⚠️)
    git rm file_path
    #当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 这个时候直接push那边这个文件就没有,如果push之前重新add那么还是会有。
    git rm --cached file_path
    #直接加文件名   从暂存区将文件恢复到工作区,如果工作区已经有该文件,则会选择覆盖
    #加了【分支名】 +文件名  则表示从分支名为所写的分支名中拉取文件 并覆盖工作区里的文件
    git checkout
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
        4、工作区<-->资源库(版本库)
    #将暂存区-->资源库(版本库)
    git commit -m '该次提交说明'
    #如果出现:将不必要的文件commit 或者 上次提交觉得是错的  或者 不想改变暂存区内容,只是想调整提交的信息
    #移除不必要的添加到暂存区的文件
    git reset HEAD 文件名
    #去掉上一次的提交(会直接变成add之前状态)   
    git reset HEAD^ 
    #去掉上一次的提交(变成add之后,commit之前状态) 
    git reset --soft  HEAD^ 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
        5、远程操作
    #将暂存区-->资源库(版本库)
    git commit -m '该次提交说明'
    #如果出现:将不必要的文件commit 或者 上次提交觉得是错的  或者 不想改变暂存区内容,只是想调整提交的信息
    #移除不必要的添加到暂存区的文件
    git reset HEAD 文件名
    #去掉上一次的提交(会直接变成add之前状态)   
    git reset HEAD^ 
    #去掉上一次的提交(变成add之后,commit之前状态) 
    git reset --soft  HEAD^ 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
       6、其它常用命令
    # 显示当前的Git配置
    git config --list
    # 编辑Git配置文件
    git config -e [--global]
    #初次commit之前,需要配置用户邮箱及用户名,使用以下命令:
    git config --global user.email "you@example.com"
    git config --global user.name "Your Name"
    #调出Git的帮助文档
    git --help
    #查看某个具体命令的帮助文档
    git +命令 --help
    #查看git的版本
    git --version
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    参考

    一个小时学会Git

    转载自
    Git(1)—工作区、暂存区、版本库、远程仓库
    Git 工作区、暂存区和版本库

  • 相关阅读:
    C/C++微实践 - 细胞计数
    【JavaScript】实现仿windows计算器(完整版)
    kr第三阶段(二)32 位汇编
    话费充值API
    C++ Reference: Standard C++ Library reference: C Library: cwchar: wmemcmp
    获得Windows官方映像(ISO)
    详解机器学习最优化算法
    搜索与图论篇——图的最短路
    人与人之间的单机五子棋 —— C语言实现
    Scala核心-编译解释
  • 原文地址:https://blog.csdn.net/XinShou___/article/details/132762114