理解Git的设计思想,详解git文件夹,以及详解add、commit、push,fetch、pull、merge指令

在项目目录执行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,看看图就很容易理解了。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值