git浅析

git对象

  • blob 文本文件、二进制文件、链接文件
  • tree 树形结构,可以理解为目录
  • commit 一次历史提交
  • tag 一次commit的id或者是版本号

他们间的关系,一般的,一个tag指向一次commit,一个commit指向一个tree对象,一个tree包括多个tree和多个blob,这实际上反映了一次提交。

git仓库

亦即repository,获取的方式有两种

  • git init
  • git clone

而git仓库有两种,bare & non-bare ,前者不包含工作区,一般指的是服务器上的。

举个栗子

分别用以下两条命令获取两个仓库

git init non_bare_repo
git init --bare bare_repo

我们会发现,前者比后者多了一个.git的文件夹,接下来,

cd进入non_bare_repo的.git目录,使用ls
cd进入bare_repo的目录,使用ls
发现两者是拥有相同的文件的,他们都拥有git工作所需要的文件,只不过不在同一个目录下,这就是有无工作区的差别

git clone如何获取仓库呢?

git clone 远程bare_repo 的地址`

显然git clone获取的是裸仓库

git仓库的三个区域

working directory(工作区),staging area(缓存区),history repository(历史仓库)

  • 工作区,源码存放区,维护着一个树形结构
  • 历史仓库,是一个commit指向的树形结构
  • 缓存区,工作区与历史提交的中间区,代表的是需要提交的工作状态,维护的是一个虚拟的树形结构(可以理解为add的存放区域)

可以从历史区checkout the project 到工作区,工作区添加的文件是存放在暂存区的,暂存区commit到历史区

相关命令

git add`
git commit
git status   查看工作区与暂存区的区别,确保提交是需要的
git rm       删除工作区和暂存区的文件
git mv a c   移动或者重命名文件 == mv a c + git add a c
gitignore    存放不需要提交的文件列表的文件
git checkout a       从历史区还原删除的a 文件到工作区
git rm --cached a  只删除缓存区的a 文件

gitignore如何书写

使用正则表达式去匹配目标文件

*.[ac]    *匹配0个或者多个字符,匹配后缀名为a或c的文件  如:123.a  
*~        匹配最后一个字符为~的文件    如vim~
*.pyc
!test.pyc    告诉git不忽略test.pyc文件
\!test.py    忽略!test.py文件
bin/        /结尾表示匹配目录
foo/        foo文件匹配不到了(不忽略foo文件)
**/res    匹配0个或多个目录下的res文件夹(一个表示0或者多个,两个则表示多级目录)
.DS_Store    看个人情况,可能有隐藏文件

热评文章