Git的正确使用姿势与最佳实践其二|青训营笔记

73 阅读5分钟

2.Git的基本使用方式|青训营笔记

2.1Git基本命令

2.2Git目录介绍

项目初始化

mkdir study

cd study

git init

其他参数

--initial-branch初始化的分支

--bare创建一个裸仓库(纯Git目录,没有工作目录)

--template可以通过模板来创建预先构建好的自定义git目录

2.3Git目录介绍

2.3.1Git Config

▲不同级别的Git配置

▲每个级别的配置可能重复,但是低级别的配置会覆盖高级别的配置

2.3.2常见Git配置

1.用户名配置

2.Instead of配置

3.Git命令别名配置

2.3.3 Git Remote

▲查看Remote

git remote -v

▲添加Remote

git remote add origin_ssh git@github.com:git/git.gitgit remote add origin_http github.com/git/git.git

2.3.4 HTTP Remote

URL:github.com/git/git.git
▲免密配置

内存: git config --global credential.helper 'cache --timeout=3600'

硬盘: git config --global credential.helper "store --file/path/to/credential-file”不指定目录的情况默认是~l.git-credentials

将密钥信息存在指定文件中

具体格式:[scheme}://{user}:$fpassword}@github.com

2.3.5 SSH Remote

URL:git@github.com:git.git
免密配置

SSH可以通过公私钥的机制,将生成公钥存放在服务端,从而实现免密访问目前的Key的类型四种,分别是dsa、rsa、ecdsa、ed25519

默认使用的是 rsa,由于一些安全问题,现在已经不推荐使用dsa和rsa 了,优先推荐使用ed25519

ssh-keygen -t ed25519 -C“your_email@example.com"密钥默认存在~/.ssh/id_ed25519.pub

2.3.6 Git Add

2.3.7 Git Commit

2.3.8 Objects

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

▲Blob

存储文件的内容

▲Tree

存储文件的目录信息

▲Commit

存储提交信息,一个Commit可以对应唯一版本的代码

2.新增的Object

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

新增commit object 7f

但是之前的commit object 63并没有被删除

3.悬空的Object

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

2.如何以上三个信息串联在一起呢?

①通过 Commit寻找到Tree信息,每个Commit都会存储对应的 Tree ID.

②通过Tree存储的信息,获取到对应的目录树信息。

③从 tree中获得blob的 ID,通过Blob ID 获取对应的文件内容。

2.3.9Refs

1.Refs文件存储的内容

refs的内容就是对应的Commit ID

因此把ref当作指针,指向对应的Commit来表示当前Ref对应的版本。

2.不同种类的ref

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

3.Branch

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

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

4.Tag

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

通过git tag命令生成tag

2.3.10 Annotation Tag

1.什么是附注标签

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

2.如何创建附注标签

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

2.3.11追溯历史版本

1.获取当前版本代码

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

2.获取历史版本代码

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

2.3.12修改历史版本

1.commit --amend

通过这个命令可以修改最近的一次commit信息,修改之后commit id会变

2.rebase

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

1.合并commit

2.修改具体的commit message

3.删除某个commit

3. filter --branch

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

2.3.13 Git GC

GC

通过git gc命令,可以删除一些不需要的object,以及会对object进行一些打包压缩来减少仓库的体积。

Reflog

reflog是用于记录操作日志,防止误操作后数据丢失,通过reflog 来找到丢失的数据,手动将日志设置为过期

指定时间

git gc prune=now指定的是修剪多久之前的对象,默认是两周前

2..3.14 Git Clone & Pull & Fetch

Clone

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

Fetch

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

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

Pull

拉取远端某分支,并和本地代码进行合并,操作等同于git fetch + git merge,也可以通过git pull --rebase完成git fetch + git rebase操作。

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

2.3.15 Git Push

Push是将本地代码同步至远端的方式。
常用命令

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

冲突问题

1.如果本地的 commit 记录和远端的commit 历史不一致,则会产生冲突,比如git commit--amend or g

rebase都有可能导致这个问题。

2.如果该分支就自己一个人使用,或者团队内确认过可以修改历史则可以通过git push origin master—f来完成强制推送,一般不推荐主干分支进行该操作,正常都应该解决冲突后再进行推送。

推送规则限制

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