在项目目录执行git init,此目录将纳入git管理,git将会自动生成.git文件夹,用以记录git配置(.git/config)和版本信息(commit-id)和文件集合。下面是.git文件夹的目录说明:
|--.git目录:
|--branches目录:为空。
|--hooks目录:为空。
|--logs目录:记录所有commit记录。
|--HEAD:记录本地仓库当前分支的全部commit记录。
|--refs目录:
|--heads目录:记录checkout或new到本地仓库的分支的全部commit记录。
|--remotes目录:记录远端仓库的所有分支的全部commit记录。
|--objects目录:记录所有commit记录的提交内容。
|--refs目录:记录所有commit记录的commit-id引用。
|--heads目录:记录checkout或new到本地仓库的分支的最新commit-id引用。
|--remotes/origin目录:记录远端仓库的所有分支的最新commit-id引用。
|--tags目录:记录所提交的tag。
|--config:配置信息文件。记录当前项目的git远端仓库链接、checkout到本地的远端分支的信息(如fetch到哪些目录文件、merge哪个分支)等。
|--FETCH_HEAD:记录文件。记录了远端仓库remote repo所有分支的最新commit-id。
|--HEAD:映射文件。记录了当前分支的Local Head是映射到哪个commit-id。
|--ORIG_HEAD:映射文件。当前分支从远端仓库所fetch或pull下来的最新commit-id。
|--index:临时暂存文件。执行git add指令的内容将记录在此文件。
git最重要的动作是commit!!!几乎git的所有操作都是以commit作为基准。
文件有改动但未commit,没有操作权(push、fetch、pull、merge)!
凡事记得先commit!!!
有无改动:是以上次commit的内容(文件集合和commit-id)为基础,本地当前工作空间working tree有没文件改动。
commit前后:commit了的内容(文件集合和commit-id),才有版本信息(commit-id),才进入本地仓库local repo,才真正被git拿来作对比,才能被merge和被push,才能fetch和pull。因为git进行文件对比的逻辑是,以上次commit的内容(文件集合和commit-id)为基础。
push前后:push了的内容(文件集合和commit-id),才进入远端仓库remote repo,才能被fetch和被pull。
以下操作是基于当前分支:
git add:以上次commit的内容(文件集合和commit-id)为基础,本地当前工作区working tree有所改动的文件,添加一个或多个到index;
git commit:以上次commit的内容(文件集合和commit-id)为基础,叠加最新添加到index的改动文件到文件集合;并生成一个用以映射叠加后的文件集合的commit-id,写入到.git/HEAD(实际是.git/refs/heads/当前分支名);然后将文件集合和commit-id一并提交到本地仓库local repo;
git push:将本地仓库local repo最新commit的内容(文件集合和commit-id),推送到远端仓库remote repo;
以下操作是基于其他分支或远端仓库:
git fetch:获取远端仓库remote repo所有分支最新push的内容(文件集合和commit-id),将commit-id写入到.git/FETCH_HEAD和.git/refs/remotes/origin/各个分支名,但不拉取文件集合中的改动部分到本地当前工作区working tree;
git pull:获取远端仓库remote repo所有分支最新push的内容(文件集合和commit-id),将commit-id写入到.git/FETCH_HEAD和.git/refs/heads/各个分支名,并拉取当前分支文件集合中的改动部分到本地当前工作区working tree;等于git fetch+git merge;
git merge:可以合并本地仓库local repo的其他分支已commit的内容(文件集合和commit-id),也可以合并远端仓库remote repo的其他分支已push的内容(文件集合和commit-id),将文件集合中的改动部分整合到本地当前工作区working tree;merge完后commit并push,将推送到所merge的那个分支。
下载安装个TortoiseGit,新建个gitDemo的文件夹,执行git init将其纳入git管理,每一次commit、push、pull、fetch、merge操作前后,都右击gitDemo文件夹->TortoiseGit->Revision graph,看看图就很容易理解了。
如果觉得《理解Git的设计思想 详解git文件夹 以及详解add commit push fetch pull merge指令》对你有帮助,请点赞、收藏,并留下你的观点哦!