从 Git 配置、代码提交与远端同步三部分展开,重点讲解 Git 命令使用方式及基本原理。
了解这些并不是为了让我们掌握,会自己写版本控制器,更多的是方便大家查找BUG,解决BUG ,这就和八股文一样,大多数都用不着,但用着了,就会知道他的妙处。
项目初始化:
代码: git init
其他的一些参数
git初始化之后的一些文件的作用:
-
HEAD:
-
指向当前分支的最新提交(commit)。它是一个符号引用,通常指向
refs/heads/master
或其他当前分支。
-
-
config:
-
存储仓库的配置信息,如用户信息、远程仓库地址、合并策略等。这些配置可以是全局的、系统的或仓库特定的。
-
-
hooks:
-
包含客户端或服务器端的钩子脚本。这些脚本在特定的 Git 操作(如提交、推送等)之前或之后自动执行。常见的钩子包括:
-
pre-commit
:在提交之前运行,用于检查代码风格或测试。 -
post-commit
:在提交之后运行,用于通知或其他操作。 -
pre-push
:在推送之前运行,用于检查推送的安全性。 -
commit-msg
:在提交消息编辑完成后运行,用于验证提交消息的格式。
-
-
-
objects:
-
存储所有的数据对象,包括:
-
blobs:文件内容。
-
trees:目录结构。
-
commits:提交对象,包含指向父提交、树对象和作者信息的指针。
-
tags:标签对象,指向特定的提交。
-
-
-
info:
-
包含一些元数据,如
exclude
文件,用于定义不在.gitignore
中列出的排除规则。
-
-
pack:
-
存储打包的对象,以节省磁盘空间。这些打包文件是一系列压缩的对象,可以通过索引文件快速访问。
-
-
refs:
-
存储引用,包括:
-
heads:本地分支的引用。
-
tags:标签的引用。
-
remotes:远程分支的引用(如果存在)。
-
-
不同级别的Git配置:
系统--全局--本地 配置依次降低,低级别会覆盖高级别
用户名的配置:
Instead of配置:(修改url)
git 命令配置:
git Remote 配置:
查看 Remote :
代码: git Remote -v
添加 Remote:
代码:
结果
git Remote -v会发现多出
git 的config文件中多出(cat .git/config):
区分HTTP和SSH Remote的区别:
主要是身份验证的协议不同,一个是HTTP验证密码,一个是SSH验证密码:
HTTP:
SSH:
如果你发现ssh配置了,还是连不上,可以切换秘钥的协议,把rsa换成其他的就行
ssh-keygen -t rsa -C "这里换上你的邮箱"
Git add:
假如我们先 touch readme.md添加文件,在tree .git文件会发现创建了,却无法找到,这就是因为创建的文件放在了工作区,你需要git add readme.md才会将这份文件上传到暂存区,tree .git可以查看
然后。如图添加进去后,我们可以通过git cat-file -p 你的文件加密后的名称,查看你文件的信息
Git commit:
我们先git commit -m "readme.md"将文件commit后查看,会发现比原来会多了两个文件:
然后我们查看这些提交的东西都是些什么:
我们可以看到他的类型,作者,上传者等等信息。
Object:
git cat-file -p XXX 查询到的文件类型有:
我们如何把这些文件串联到一起呢?它底层是如何做到的呢?
新建分支:
git checkout -b "test"
创建完成新的分支后,我们在从master和test两个分支查看readme.md,就会发现其实二者查询到的文件是同一个,这时,就要映引出我们的Ref文件了
Ref文件:
创建Tag:
代码:git tag v0.0.1
Annotation Tag:(附属标签)
写发布版本信息等描述信息
代码: git tag -a v0.0.2 -m "这里写你的描述“
多了红框内的两份文件,而且查询也查询的文件不同。
这里有第四种object类型commit,有这个文件指向另外一个文件。
追溯历史版本:
修改历史版本:
修改之后,我们通过git log查看会发现两者的名称已经变了,再tree git查看也可以看到Object文件里多了一个commit文件,意味着就会有两份文件,一个修改前,一个修改后,儿修改前的文件的ref会转移到修改后的全新文件上,没有ref的old文件,就被成为悬空文件。查看悬空文件的代码:
由此,我就可以引出一个新的概念,叫做Git GC,他和我们的Java中的GC回收器,垃圾回收算法这些的相似。都是垃圾回收的效果。
git reflog expire --expire=now -- allgit gc --prune=now
本质上是多加了打包和package-ref这个关联文件
Git是如何多人合作以及远端同步的呢?
git push (是将本地同步到远端的方式)