转载整理自: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. ssh 框架整合事,使用注解,action提示找不到

    There is no Action mapped for namespace [/] and action name [/select] associated with context path [ ...

  2. 【搬运工】mysql用户权限设置

    关于mysql的用户管理,笔记 1.创建新用户 通过root用户登录之后创建 >> grant all privileges on *.* to testuser@localhost id ...

  3. Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?

    Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么? 答:Object-c的类不可以多重继承,可以实现多个接口(协议),Cate ...

  4. 谈谈传统BIO网络编程模型的局限性与NIO

    先来看看我们的server端: 创建一个serversocket,进行监听,每来一个客户端,就启动一个新启动为其服务: private void createListenSocket() { //如果 ...

  5. psycopg2+postgis+pgAdmin4

    基于docker的postgres 部署见这篇 https://www.cnblogs.com/xuanmanstein/p/7742647.html 连接数据库 import psycopg2cla ...

  6. Phpstorm-远程连接服务器实时编辑代码

    一,配置远程服务器FTP 1.打开Phpstorm >>> 选择 2.选择 3.输入项目名称(此项目名称不会同步到服务器,只是在本地电脑上的项目名称) 4.将编辑器设置为实时自动同步 ...

  7. Confluence 6 在升级过程中查看合并日志

    为了监控升级的过程,你应该查看 application log 日志中的输出. 通常日志经常将会显示多个日志实例,这个实例是定义在日志的 INFO 级别的,通常格式如下: WikiToXhtmlMig ...

  8. JavaScript入门篇

    记录一下在慕课网学习JavaScript的过程. 以下内容均来自慕课网. 传送:https://www.imooc.com/code/401 为什么学习JavaScript 1. 所有主流浏览器都支持 ...

  9. jsp页面输出当前时间

    <% out.print(new java.text.SimpleDateFormat("yyyy年MM月dd号 hh:mm:ss").format(new Date())) ...

  10. 转:为什么根据IP地址查询物理所在地,而不是mac地址?

    来自 https://mp.weixin.qq.com/s/aOZQGMnMI2nkX4-qcJL4WQ 读者 不是说mac地址是计算机网卡唯一的地址吗?这样不是可以直接定位到某一台机器吗?为什么要用 ...