[git]入门-工作区、暂存区、版本库
转载整理自: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]入门-工作区、暂存区、版本库的更多相关文章
- 小丁带你走进git的世界二-工作区暂存区分支
小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git init git clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...
- Git入门 时光穿梭鸡 版本回退 工作区 暂存区
分布式集中式 CVS及SVN都是集中式的版本控制系统 , 而Git是分布式版本控制系统 集中式版本控制系统,版本库是集中存放在中央服务器的, 而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得 ...
- 完整学习git三 查看暂存区目录树 git diff
1显示暂存区中的目录树 git ls-files git ls-tree git diff 魔法 1工作区与暂存区比较 git diff 2工作区与HEAD比较 git diff HEAD 3暂存区与 ...
- Git 基础 - 删除暂存区的文件
1 直接删除文件 这个文件会有两个操作:已暂存的修改.未暂存的删除 2 直接删除文件 + 记录删除操作 先在工作目录中删除文件,再使用git rm命令记录此次移除文件的操作(删除暂存区中该文件的修改快 ...
- Git(1):版本库+工作区+暂存区
参考博客:https://blog.csdn.net/qq_27825451/article/details/69396866
- git 撤回放到暂存区的文件
git reset HEAD filename 如:git reset HEAD test.txt 或者使用 git reset . 撤回所有文件(注意后面还有个.)
- Git-03-工作区和暂存区
工作区和暂存区的概念 工作区 工作区:就是电脑里能看到的目录,如现在学习的目录github 暂存区 版本库:工作区内有一个隐藏目录 .git,这个叫做版本库 git版本库中有一个重要的区叫做暂存区(i ...
- Git使用指南(2)——工作区,暂存区,版本库
1 工作区修改添加到暂存区 git add 2 暂存区提交到版本库 git commit 3 版本库更新到暂存区 git reset HEAD 4 删除暂存区文件 git rm --cached< ...
- 【Git】(1)---工作区、暂存区、版本库、远程仓库
工作区.暂存区.版本库.远程仓库 一.概念 1.四个工作区域 Git本地有四个工作区域:工作目录(Working Directory).暂存区(Stage/Index).资源库(Repository或 ...
随机推荐
- [MySQL] timestamp和datetime的区别
建表语句如下: create table strong_passwd_whitelist( id int unsigned not null auto_increment, email_id int ...
- web 页面间传值 js 封装方法
用法 var id = getParam("id"); function getParam(strKey) { var url=document.URL; //var url=&q ...
- jsp 遍历集合——关于获取集合的长度
一,关于获取集合长度问题 在jsp页面中不能通过${list.size}取列表长度,而是 EL表达式不能获取集合的长度 如:${list.size} <%@ taglib uri="h ...
- static属性和方法
static属性作为公共属性,可以通过类名称直接调用. static属性可以在没有实例化对象时使用. 非static属性必须在实例化对象产生后才可以使用. static方法也可以在没有实例化对象时由类 ...
- 融云(API)
先记录下融云API地址:真是难找 IMKit: https://www.rongcloud.cn/docs/api/android/imkit/index.html IMLib: https://ww ...
- c#泛型约束 (where T:class)
.NET支持的类型参数约束有以下五种:where T : struct | T必须是一个结构类型where T : class ...
- [C#]将数据写入已存在的excel文件
测试如下(xls/xlsx): //将数据写入已存在Excel public static void writeExcel(string result, string filepath) { //1. ...
- @RequestMapping的Ant风格URL
Ant风格资源地址支持3中匹配符 ? 匹配文件名中一个字符. * 匹配 文件名中任意字符 ** 匹配多层路径 例如 /hello/*/myspring 匹配 /hello/abc/mysprin ...
- WARING
每一道题都先手玩样例! 认真读一下每一档数据,仔细计算每一档可以拿的分数! 读完题目后,把所有能想到的思路写在纸上. 最优化题目考虑dp和贪心两种方法 字符串题目前缀考虑trie树,后缀考虑fail树 ...
- POST调用WCF方法-项目实践
做即时通信项目时,需要与OA系统对接接口,主要目标是实现在OA里进行一项事项,通过调用我们的接口,即时通知过来,并弹出消息框提示一下.我们的即时通信使用的WCF服务进行通信,在客户端调用通信时,用的就 ...