Git的基本使用(2) | 青训营笔记

121 阅读4分钟

Git的基本使用(2)

Object

commit / tree / blob 在 git 里面都统一称为 Object, 除此之外还有个 tag 的 object

  • Blob :存储文件内容
  • Tree:存储文件的目录信息
  • Commit:存储提交信息,一个Commit 可以对应唯一版本的代码

如何将这三个信息串联在一起呢?

  1. 通过Commit 寻找到Tree信息,每个Commit 都会存储对应的Tree ID。
  2. 通过Tree存储的信息,获取到对应的目录树信息。
  3. 从Tree中获得 blob 的 ID ,通过Blob ID 获取对应文件的内容。

Refs

创建新分支:

 git checkout -b test

refs的对应内容就是对应的 Commit ID

因此可以把 refs 当作指针,指向对应的 Commit 来表示当前refs对应的版本

不同种类的ref

ref/heads 前缀表示的就是分支,除此之外还有其他种类的ref , 比如 refs/tags 前缀表示的是标签。

Branch

 git checkout -b 可以创建一个新的分支

分支一般用于开发阶段,是可以不断添加Commit进行迭代的

Tag

标签一般表示的是一个稳定的版本,指向的Commit一般是不会变更

通过 git tag 命令生成tag

Annotation Tag

什么是附注标签?

一种特殊的Tag,可以给Tag 提供一些额外的信息。

如何创建附注标签?

通过 git tag -a 命令来完成附注标签的创建。

image-20230607093130908.png

查看该 tag object 的内容

image-20230607093143799.png

追溯历史版本

获取当前版本的代码

通过Rfs 指向的Commit 可以获取唯一的代码版本。

获取历史版本代码

Commit 里面会存有 parent commit 字段,通过 commit 的串联获取历史版本代码

之前的git目录

image-20230607093835666.png

更新readme 文件内容(这里是因为同时修改了其他文件的内容,所以产生的变化较大) image-20230607094040818.png

修改历史版本

  1. commit --amend : 通过这个命令可以修改最近一次的commit 信息,修改后 commit id 会变
  2. rebase

通过 git rebase -i HEAD~3 可以实现对最近三个 commit 的修改:

(1)合并commit

(2)修改具体的 commit message

(3)删除某个 commit

  1. filter --branch

该命令可以指定删除所有提交中的某个文件或者全局修改邮箱地址等操作。

image-20230607094717133.png

Objects

新增Object

修改 Commit 后我们可以发现 git object 又出现了变化,

新增一个 commit object ,但是之前的老的commit object并没有被删除

悬空Object

顾名思义 就是没有 ref 指向的object

查找悬空的object

 git fsck --lost-found

image-20230607095126506.png

Git GC

GC

通过 git gc 命令,可以删除一些不需要的 object,

以及会对 object 进行一些打包压缩来减少仓库的体积。

 git gc --prune=now

Reflog

reflog 是用于记录操作日志,防止误操作后数据丢失,

通过 reflog 来找到丢失的数据,手动将日志设置为过期。

命令:

 git reflog expire --expire=now --all

指定时间

git gc prune=now 指定的是修剪多久之前的对象

默认是两周前

执行命令:

 git reflog expire --expire=now --all
 git gc --prune=now

image-20230607095851028.png

Git Clone & Pull & Fetch

Clone

拉取完整的仓库到本地目录,可以指定分支、深度

Fetch

将远端某些分支最新代码拉取到本地,不会执行merge操作,

会修改 Refs / remote 内的分支信息,如果需要和本地代码合并需要手动操作。

Pull

拉取远端分支,并和本地代码进行合并,操作等同于 git fetch +git merge

也可以通过 git pull --rebase 完成 git fetch + git rebase 操作

可能存在冲突,需要解决冲突。

Git Push

常用命令

一般使用git push origin master 命令即可完成

冲突问题

  1. 如果本地的 commit 记录和远端的 commit 历史不一致,则会产生冲突,比如 git commit --amend or git rebase 都有可能导致这个问题。
  2. 如果该分支就自己一个人使用,或者团队内确认过可以修改历史则可以通过git push origin master -f 来完成强制推送,一般不推荐主干分支进行该操作,正常都应该解决冲突后再进行推送。

推送规则限制

可以通过保护分支,来配置一些保护规则,防止误操作,或者一些不合规的操作出现,导致代码丢失。

image-20230607093130908.png