Git的基本使用(2)
Object
commit / tree / blob 在 git 里面都统一称为 Object, 除此之外还有个 tag 的 object
- Blob :存储文件内容
- Tree:存储文件的目录信息
- Commit:存储提交信息,一个Commit 可以对应唯一版本的代码
如何将这三个信息串联在一起呢?
- 通过Commit 寻找到Tree信息,每个Commit 都会存储对应的Tree ID。
- 通过Tree存储的信息,获取到对应的目录树信息。
- 从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 命令来完成附注标签的创建。
查看该 tag object 的内容
追溯历史版本
获取当前版本的代码
通过Rfs 指向的Commit 可以获取唯一的代码版本。
获取历史版本代码
Commit 里面会存有 parent commit 字段,通过 commit 的串联获取历史版本代码
之前的git目录
更新readme 文件内容(这里是因为同时修改了其他文件的内容,所以产生的变化较大)
修改历史版本
- commit --amend : 通过这个命令可以修改最近一次的commit 信息,修改后 commit id 会变
- rebase
通过 git rebase -i HEAD~3 可以实现对最近三个 commit 的修改:
(1)合并commit
(2)修改具体的 commit message
(3)删除某个 commit
- filter --branch
该命令可以指定删除所有提交中的某个文件或者全局修改邮箱地址等操作。
Objects
新增Object
修改 Commit 后我们可以发现 git object 又出现了变化,
新增一个 commit object ,但是之前的老的commit object并没有被删除
悬空Object
顾名思义 就是没有 ref 指向的object
查找悬空的object
git fsck --lost-found
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
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 命令即可完成
冲突问题
- 如果本地的 commit 记录和远端的 commit 历史不一致,则会产生冲突,比如 git commit --amend or git rebase 都有可能导致这个问题。
- 如果该分支就自己一个人使用,或者团队内确认过可以修改历史则可以通过git push origin master -f 来完成强制推送,一般不推荐主干分支进行该操作,正常都应该解决冲突后再进行推送。
推送规则限制
可以通过保护分支,来配置一些保护规则,防止误操作,或者一些不合规的操作出现,导致代码丢失。