转载整理自:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256916071d599b3aed534aaab22a0db6c4e07fd0000

0、写在前面

其实,我们每次执行可以改变暂存区或分支的git命令时,只要这个命令操作的文件的内容的散列值还没有在.git/objects目录下作为一个文件的文件名,这个文件就会被添加到.git/objects下,文件名(确切地说散列值的前两个字符会作为一级文件夹名)就是那个散列值,而暂存区和分支里的不过是这个文件的指针而已。作为版本控制的用户,我们主要应关注工作区、暂存区、版本库的关系,.git/objects属于git的底层实现了。

1、工作区、暂存区、版本库

我们执行git init命令的那个目录就是我们的工作区。工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

1.1、把文件从工作区添加到暂存区、版本库中

我们把文件往Git版本库里添加的时候,是可以分两步执行的:

  • 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
  • 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。你可以简单理解为,需要提交的文件修改都通过git add(可连续多次)放到暂存区,然后,一次性通过git commit提交暂存区的所有修改。

我们要注意:在提交以后,工作区、暂存区、版本库的内容都一样了(暂存区、版本库保存的其实是指针)。git提供了两条命令来比较工作区、暂存区和暂存区、版本库当前分支的差异的命令,分别是

  • 查看工作区、暂存区文件差异: git diff
  • 查看暂存区、版本库当前分支最新一次提交之间的差异: git diff --cached

提交以后我们可以分别执行一下这两个命令,你会发现:“在提交以后,工作区、暂存区、版本库的内容都一样了”。

1.2、从暂存区、版本库恢复文件到工作区

自然,每一个程序员都会犯错误。版本控制系统除了提供我们“版本管理”的功能,还应该可以在我们犯了错以后让我们很方便地回退到前一个版本(丢弃工作区的修改)。相比与其他版本控制系统,git还提供了暂存区功能,因此我们还可以回退到上一次修改而不用回退到上一个版本,提供了更大的自由度。

从暂存区恢复,或称“拿暂存区文件替换工作区文件”(譬如错误还在工作区)命令:

git checkout -- file

从当前分支的最新一次提交恢复,或称“拿版本库文件替换暂存区、工作区文件”(譬如错误已经add到了暂存区)命令:

git reset HEAD file

从当前分支的上上次的提交恢复(譬如错误已经被提交):

详见分支管理篇

1.2.1、git reset命令:

2、文件、文件夹改名:

在我们版本升级过程中,除了文件内容的修改之外,文件名和文件夹名有时候也需要改变。有很多git命令需要了解改名历史,譬如git diff。但git不是记录改名,而是探测改名,每次需要了解改名历史时(一般时-M[<n>]或--find-renames[=<n>]参数),git都会去探测改名,默认时50%相似度。

[git]入门-工作区、暂存区、版本库的更多相关文章

  1. 小丁带你走进git的世界二-工作区暂存区分支

    小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git  init git  clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...

  2. Git入门 时光穿梭鸡 版本回退 工作区 暂存区

    分布式集中式 CVS及SVN都是集中式的版本控制系统 , 而Git是分布式版本控制系统 集中式版本控制系统,版本库是集中存放在中央服务器的, 而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得 ...

  3. 完整学习git三 查看暂存区目录树 git diff

    1显示暂存区中的目录树 git ls-files git ls-tree git diff 魔法 1工作区与暂存区比较 git diff 2工作区与HEAD比较 git diff HEAD 3暂存区与 ...

  4. Git 基础 - 删除暂存区的文件

    1 直接删除文件 这个文件会有两个操作:已暂存的修改.未暂存的删除 2 直接删除文件 + 记录删除操作 先在工作目录中删除文件,再使用git rm命令记录此次移除文件的操作(删除暂存区中该文件的修改快 ...

  5. Git(1):版本库+工作区+暂存区

    参考博客:https://blog.csdn.net/qq_27825451/article/details/69396866

  6. git 撤回放到暂存区的文件

    git reset HEAD filename 如:git reset HEAD test.txt 或者使用 git reset .  撤回所有文件(注意后面还有个.)

  7. Git-03-工作区和暂存区

    工作区和暂存区的概念 工作区 工作区:就是电脑里能看到的目录,如现在学习的目录github 暂存区 版本库:工作区内有一个隐藏目录 .git,这个叫做版本库 git版本库中有一个重要的区叫做暂存区(i ...

  8. Git使用指南(2)——工作区,暂存区,版本库

    1 工作区修改添加到暂存区 git add 2 暂存区提交到版本库 git commit 3 版本库更新到暂存区 git reset HEAD 4 删除暂存区文件 git rm --cached< ...

  9. 【Git】(1)---工作区、暂存区、版本库、远程仓库

    工作区.暂存区.版本库.远程仓库 一.概念 1.四个工作区域 Git本地有四个工作区域:工作目录(Working Directory).暂存区(Stage/Index).资源库(Repository或 ...

随机推荐

  1. 近视BFC

    首先按照常规解释一下名词,BFC(Block formatting context)直译为"块级格式化上下文".一个独立的渲染区域,只有Block-level box参与, 它规定 ...

  2. sublime 部分插件

    https://www.cnblogs.com/qingkong/p/5039527.html

  3. 微信小程序点击列表添加 去除属性

    首先说一下场景:我所循环的数据是对象数组,设置了一个属性当作标记,通过这个标记的值判断是否给改元素添加样式 wxml: <view> <view wx:for="{{lis ...

  4. c++ std::advance

    // advance example #include <iostream> // std::cout #include <iterator> // std::advance ...

  5. [数据结构] 2.2 Huffman树

    注:本文原创,转载请注明出处,本人保留对未注明出处行为的责任追究. 1.Huffman树是什么 Huffman树也称为哈夫曼编码,是一种编码方式,常用于协议的制定,以节省传输空间. A - F字母,出 ...

  6. 雷林鹏分享:jQuery EasyUI 数据网格 - 设置排序

    jQuery EasyUI 数据网格 - 设置排序 本实例演示如何通过点击列表头来排序数据网格(DataGrid). 数据网格(DataGrid)的所有列可以通过点击列表头来排序.您可以定义哪列可以排 ...

  7. Inquirer.js

    一个使用界面进行交互的命令行集合 4.0以上的版本只支持node 6以上的,node4请使用3.x 目标和理念(hilosophy) 努力去做一个容易的 嵌入式的(embeddable) 和优美的命令 ...

  8. markdown首行缩进

    首行缩进两个字符:(每个表示一个空格,连续使用两个即可)   半角的空格  全角的空格

  9. oracle中delete、truncate、drop的区别 (转载)

    一.delete 1.delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表 ...

  10. 关于Url路径中出现特殊字符,文件无法下载的问题

    1.原网址  传送门:http://blog.csdn.net/jackljf/article/details/43796137 在站点根目录新建或编辑web.config 文件,找到<syst ...