Git基本使用方式

104 阅读5分钟

2 Git基本使用方式

2.1Git基本命令

2.1.1不同级别的Git配置

全局配置(global)
系统配置(system)
本地配置(local)

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

2.1.2 常见Git配置

用户名配置git config --global user.name "liaoxingju"git config --global user.email liaoxingju@bytedance.com
Instead of 配置git config --global url.git@github.com:.insteadOf github.com/![](p3-juejin.byteimg.com/tos-cn-i-k3…)
Git 命令别名配置git config --global alias.cin "commit --amend --no-edit"

2.2 Git Remote

查看Remotegit remote -v
添加Remotegit remote add origin_ssh git@github.com:git/git.gitgit remote add origin_http github.com:git/git.git
帮助git remote -h

同一个Origin设置不同的Push和Fetch URL

2.2.1 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"

不指定目录的情况默认是 ~/.git-credentials

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

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

2.2.2 SSH Remote

URL:git@github.com:git/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 Git Add

2.4 Git Commit

2.5 Objects

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 获取对应的文件内容

2.6 Refs

Refs文件存储的内容

refs的内容就是对应的 Commit ID

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

不同种类的ref

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

Branch

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

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

Tag

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

通过 git tag 命令生成 tag.

2.7 Annotation Tag

什么是附注标签

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

如何创建附注标签

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

查看该 tag object 的内容

2.8 追溯历史版本

获取当前版本代码

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

获取历史版本代码

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

1.修改文件,并提交,创建新的 commit

2.查看最新的 commit ,新增了 parent 信息

两者Diff

1.新增 tree object 3a

2.新增 blob object 55

3.新增 commit object 64

test ref 指向新的 commit

2.9 修改历史版本

commit - amend通过这个命令可以修改最近的一次commit信息,修改之后 commit id 会变
rebase通过rebase -i HEAD~3 可以实现对最近三个 commit 的修改:1.合并commit2.修改具体的 commit message3.删除某个 commit
filter - branch该命令可以指定删除所有提交文件中的某个文件或者全局修改邮箱地址等操作

2.10 Objects

新增的 Object

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

新增 commit object 7f

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

悬空的 Object

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

2.11 Git GC

GC通过 git gc 命令,可以删除一些不需要的 object,以及会对 object 进行的一些打包压缩来减少仓库的体积
Reflogreflog 是用于记录操作日志,防止误操作后数据丢失,通过 reflog 来找到丢失的数据,手动将日志设置为过期
指定时间git gc prune=now 指定的是修剪多久之前的对象,默认是两周前

2.12 完整的 Git 视图

2.13 Git Clone & Pull & Fetch

Clone拉取完整的仓库到本地目录,可以指定分支,深度。
Fetch将远端某些分支最新代码拉取到本地,不会执行 merge 操作,会修改 refs/remote 内的分支信息,如果需要和本地代码合并需要手动操作。
Pull拉取远端某分支,并和本地代码进行合并,操作等同于 git fetch + git merge,也可以通过 git pull --rebase 完成 git fetch + git rebase 操作

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

2.14 Git Push

Push是将本地代码同步至远端的方式

常用命令

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

冲突问题

1.如果本地的 commit 记录和远端的 commit 历史不一致,则会产生冲突,比如 git commit --amend or git rebase 都有可能导致这个问题

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

推送规则限制

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

常见问题

1.为什么我明明配置了Git配置,但依然没有办法拉取代码

免密认证没有配

Instead Of 配置没有配,配的是 SSH 免密配置,但是使用的还是 HTTP 协议访问

2.为什么我 Fetch了远端分支,但是我看本地当前的分支历史还是没有变化

Fetch 会把代码拉取到本地的远端分支,但是并不会合并到当前分支,所以当前分支历史没有变化