青训营笔记:Git 基本原理与使用
基本介绍
原理:
- 每个库都有完整的提交历史,可以在本地进行代码提交;
- 每次提交记录都是完整的文件快照,而不是记录增量;
- 通过 Push Pull 等操作完成和远端代码的同步。
优点: - 分布式开发,每个库都有完整的提交历史,支持本地提交,强调个体;
- 分支管理功能强大,方便团队合作,多人协作开发;
- 校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失。
缺点: - 相对 SVN 更复杂,学习成本更高;
- 对于大文件支持一般(可使用 git-lfs 弥补)
init
初始化一个 Git 仓库
1 | git init |
参数:
–initial-branch 初始化的分支
–bare 创建一个裸仓库(纯 Git 目录,没有工作目录)
–template 通过模板创建预先构建好的自定义 Git 目录
config
基本命令
1 | git config --system 配置项 参数 |
配置命令别称
1 | git config --global alias.cin "commit --amend --no-edit" |
remote
远程仓库管理
基本使用
查看所有远程服务器
1 | git remote -v |
输出示例
1 | origin_http https://github.com/git/git.git (fetch) |
查看配置文件,可以直接修改 .git/config
配置文件以修改 remote。
1 | cat .git/config |
同一个 Origin 设置不同的 Push 和 Fetch 路径:
1 | git remote set-url --add --push origin [push url] |
免密配置
1 | # 将密码保存在内存中 |
SSH Remote
通过 SSH 公私钥的机制实现免密访问,密钥类型有:
- DSA (不推荐)
- RSA(不推荐)
- ECDSA
- ED25519
add & commit
1 | git add . |
将工作区的修改加入暂存区,存储于 .git/objects/
文件夹中。
1 | git commit -m "readme" |
通过 Commit 的 TreeID 寻找 Tree,寻找
Objects
Blob:存储文件内容
Tree:存储文件的目录信息
Commit:存储提交信息
- 通过 Commit 寻找 TreeID
- 通过 TreeID 获取目录树
- 从目录树中获取 BlobID
- 通过 BlobID 获取文件文件内容
Tag:存储版本信息以及版本说明
Tag
1 | git tag v0.0.1 |
1 | git tag -a v0.0.2 -m "Add feature 1" |
1 | cat .git/refs//tags/v0.0.1 |
1 | cat .git/refs/tags/v0.0.2 |
追溯历史版本
进行第二次提交,ref 指向了新的版本,查看 Object 内容:
1 | git cat-file -p 31db32cf6c374bd21e1ddcb740da705fc41cf6e6 |
修改历史版本
1 | # 修改最近的一次 commit |
修改 Commit:新增 Commit Object,不删除旧的 Commit Object
查看悬空的 Commit
1 | git fsck --lost-found |
1 | Checking object directories: 100% (256/256), done. |
删除多余的 Object(Git GC)
Reflog 记录操作日志,防止误操作后数据丢失
1 | git reflog expire --expire=now --all |
1 | git gc |
会将 Object 打包为 Pack
Clone & Pull & Fetch
Clone:拉取完整仓库,可以指定分治
Fetch:将某些分支拉到本地
Pull:git fetch + git merge
Push
1 | git push origin master |
代码合并
Fast-forward:不产生 Merge 节点
1 | git merge test --ff-only |
Tree-way-merge:产生新的 Merge 节点
1 | git merge test --no-ff |