git的仓储(repository)分为远程repository和本地repository。个人通过本地的repository进行开发和版本管理,本地包括working directory, staging area, local repo;多人开发的工程可通过远程repository进行协作(如github网页可以查看的远端git,或者本地服务器搭建的gitlab),整体的关系如下图所示:
我们先讲解如何创建local repository以及进行代码管理,随后,讲解本地repo和远端repo如何进行互动操作(如何下载remote repository到local repository,以及如何将本地repository贡献到远程repository)。
查看帮助格式如下:
git clone --help
git commit --help
一、本地repsitory管理
1. 概述
熟练进行git代码管理需要了解git的一些一本概念:
首先,了解git的data model, 包括blob object (文件), tree object(结构)和commit object(时间)。
- blob object表示具体的文件的对象,在每次通过git add将working directory的文件添加到staging area时生成,实际就是对应着文件的实体 ;
- tree object记录着每个文件夹里包含的blob object,即目录的层级关系,每个目录对应着一个tree object;
- commit object为每次提交产生的对象,记录着提交指向的tree object以及commit的parent节点(即上次提交生成的commit object)。
备注:当一个文件或目录结构发生更新时,不仅会被更新的blob object和tree object会新建,commit后其祖先节点上的所有tree object都会生成新的tree object(因为tree object记录了包含的对象的checksum,一个object的改变会导致其checksum改变,进而改变其父节点的tree object记录的object的checksum的改变,而tree object记录的信息的改变也就改变了tree object本身的checksum,以此类推)。
object文件统一存储在.git/objects中。
详见:https://medium.com/hackernoon/https-medium-com-zspajich-understanding-git-data-model-95eb16cc99f5
为了查看时间维度的commit object的checksum值,可以使用如下命令:
git log
通过如下命令可以查看commit object中记录的内容(包含指向的tree object的checksum值):
git cat-file commit [commit id in git log]
通过commit object记录的tree object id可以进一步查看tree object记录的内容:
git ls-tree [tree object id]
结合tree object指向的blob id,可以通过如下命令查看blob object的内容。
git cat-file blob [blob id]
随后,掌握git的三个区域:working directory, staging area, and the repository。注意:这个三个区域并不对应着三个不同的实体区域来存储不同版本的blob object\tree object实体。真实的情况是:所有不同版本的blob object\tree object都存储在.git/objects中,同时,使用使用.git/index文件来记录working directory, staging area, and the repository中对应的blob object\tree object的版本(checksum值),基于index文件记录的object版本的信息到.git/objects中找对应版本的object来快速构建不同的版本工程。
详见:
https://konrad126.medium.com/understanding-git-index-4821a0765cf
为了显示working directory <=> staging area <=> 本地repository之间的差异,可以使用如下命令:
git status
2. 配置本地git
全局配置:
git config --global user.name "YLY"
git config --global user.email "yly@163.com"
生成本地repository:
cd your_folder_to_upload
git init //本地仓储初始化,在文件夹中生成了 “.git”隐藏文件,用于接下来存储git的信息。其中,.git/object/里面包含了blob object, tree object, commit object;.git/refs/包含branch的信息;./git/index存储working directory, staging area, and the repository的文件版本信息
3. working directory/staging area/local repo之间的操作
将working directory文件同步到staging area:
git add . //同步working directory的文件到staging area, “.”表示添加文件夹下的所有文件
另一方面,若开发过程中发现工作区本版出现问题了,想撤销工作区文件的修改,可以把文件恢复到staging area的状态,方法是:
git checkout -- <file>
staging area文件更新到本地repository:
git commit -m "Initial commit" // 文件存储到版本库区 (Commit History), -m表示输入提交的信息
备注:修改最新的commit message:
git commit --amend
参考: