git之工作原理简介 - Go语言中文社区

git之工作原理简介


个人感觉,看完git的设计原理之后,对我使用git有挺大的帮助,至少也知道自己一个命令敲下去是有什么后果。

  • 先借个图:
    在这里插入图片描述

简单来说:

  • 在git中分为工作区、版本库;
  • 版本库中有个暂存区(stage,亦称index) 和 分支 (标记为master的是master分支所代表的目录树);
  • 工作区就是你初始化git仓库的这个目录和目录下的子目录及文件;
  • 暂存区和版本库都在前面提到的初始化git仓库时候看到的 .git 的目录下;

有了工作区、暂存区、分支这三个概念之后,再来看下git的几个命令:

  • git add file: 将file从工作区提交到暂存区;
  • git rm file:从工作区和暂存区删除file;
  • git checkout file: 将暂存区的file中还原到工作区;
  • git checkout HEAD file :将版本库中的file还原到工作区和暂存区;

以下是《git权威指南》对git暂存区的介绍:

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为index的区域是暂存区(stage,亦称index),标记为master的是master分支所代表的目录树。
  • 图中可以看出此时HEAD实际是指向master分支的一个“游标”。所以图示的命令中出现HEAD的地方可以用master来替换。
  • 图中的objects标识的区域为Git的对象库,实际位于:file:.git/objects目录下。
  • 当对工作区修改(或新增)的文件执行:command:git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
  • 当执行提交操作(:command:git commit)时,暂存区的目录树写到版本库(对象库)中,master分支会做相应的更新。即master最新指向的目录树就是提交时原暂存区的目录树。
  • 当执行:command:git reset HEAD命令时,暂存区的目录树会被重写,被master分支指向的目录树所替换,但是工作区不受影响。
  • 当执行:command:git rm --cached <file>命令时,会直接从暂存区删除文件,工作区则不做出改变。
  • 当执行:command:git checkout .或者:command:git checkout -- <file>命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
  • 当执行:command:git checkout HEAD .或者:command:git checkout HEAD <file>命令时,会用HEAD指向的master分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

个人的一点看法:

git的工作区就是用来随便改的,就是一不小心误删了损失的也只是本次修改且没有提交的内容;
git的暂存区就是一个缓存(名字也很贴切),修改起来比较随意,git不会记录每次修改;
git的分支就比较正式一点,每次修改之后都会被记录下来,而且你可以写下修改的说明;

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Power_No1/article/details/83998195
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 23:14:50
  • 阅读 ( 1266 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢