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/ | |
| Git 命令别名配置 | git config --global alias.cin "commit --amend --no-edit" |
2.2 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 |
| 帮助 | git remote -h |
同一个Origin设置不同的Push和Fetch URL
2.2.1 HTTP Remote
免密配置
内存:git config --global credential.helper 'cache --timeout=3600'
硬盘:git config --global credential.helper "store --file /path/to/credential-file"
不指定目录的情况默认是 ~/.git-credentials
将密钥信息存在指定文件中
具体格式:{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 进行的一些打包压缩来减少仓库的体积 |
|---|---|
| Reflog | reflog 是用于记录操作日志,防止误操作后数据丢失,通过 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 会把代码拉取到本地的远端分支,但是并不会合并到当前分支,所以当前分支历史没有变化