一. Git目录介绍
1.1项目初始化
mkdir study
cd study
git init
1.2其他参数
-- initial- branch初始化的分支 -- bare 创建- F个裸仓库(纯Git目录,没有工作目录) -- template 可以通过模板来创建预先构建好的自定义git目录
1.3常见Git配置
1.3.1用户名配置
git config --global user.name "liaoxingju" git config --global user.email liaoxingju@bytedance.com
1.3.2Instead of配置
git config --global urlgit@github.com.insteadOf github.com/
1.3.3Git命令别名配置
git config --global alias.cin "commit --amend -- no- edit"
1.3.4 Git Remote
1.3.4.1查看Remote
git remote -V
1.3.4.2添加Remote
git remote add origin_ ssh git@github.com:git/ git.git
git remote add origin_ http https:/ /github.com/git/git.git
同一个Origin设置不同的Push和Fetch URL
1.4HTTP Remote
1.4.1免密配置
- 内存: 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
1.5 SSH Remote
URL: git@github.com:git/git.git
1.5.1免密配置
SSH可以通过公私钥的机制,将生成公钥存放在服务端,从而实现免密访问
目前的Key的类型四种,分别是dsa、rsa、ecdsa、 ed25519 默认使用的是rsa,由于一 些安全问题,现在已经不推荐使用dsa和rsa了,优先推荐使用ed25519
ssh- keygen -t ed25519 - -C“you, email@example.com”密钥默认存在~/ .ssh/id. ed25519.pub
1.6 Objects
commit / tree / blob在git里面都统一称为Object,除此之外还有个tag的object.
- Blob
存储文件的内容
- Tree
存储文件的目录信息
- Commit
存储提交信息,一个Commit可以对应唯一版本的代码
1.6.1如何把这三个信息串联在一起呢?
- 通过Commit寻找到Tree信息,每个Commit都会存储对应的Tree ID.
- 通过Tree存储的信息,获取到对应的目录树信息。
- 从tree中获得blob的ID,通过Blob ID获取对应的文件内容。
1.7 Refs
1.7.1Refs文件存储的内容
refs的内容就是对应的Commit ID
因此把ref当做指针,指向对应的Commit来表示当前Ref对应的版本。
1.7.2不同种类的ref
refs/heads前缀表示的是分支,除此之外还有其他种类的ref, 比如refs/tags前缀表示的是标签。
1.8 Annotation Tag
1.8.1什么是附注标签?
一种特殊的Tag,可以给Tag提供一些额外的信息。
1.8.2如何创建附注标签?
- 通过git tag -a命令来完成附注标签的创建
- 查看该tag object的内容。
1.9追溯历史版本
- 获取当前版本代码
通过Ref指向的Commit可以获取唯一的代码版本 。
- 获取历史版本代码
Commit里面会存有parent commit字段,通过commit的串联获取历史版本代码。
- 修改文件,并提交,创建新的commit.
- 查看最新的commit,新增了parent 信息。
1.10修改历史版本
- commit -- amend 通过这个命令可以修改最近的一次commit信息,修改之后commit id会变
- rebase 通过git rebase -i HEAD~3可以实现对最近三个commit的修改: 1.合并 commit 2.修改具体的commit message 3.删除某个commit
- filter --branch 该命令可以指定删除所有提交中的某个文件或者全局修改邮箱地址等操作
1.11 Objects
- 新增的Object
修改Commit后我们可以发现git object又出现了变化
新增commit object 7f
但是之前的commit object 63并没有被删除
- 悬空的Object
顾名思义就是没有ref指向的object
1.12 Git GC
- GC
通过git gc命令,可以删除一些不需要的 object,以及会对object进行一些打 包压缩来减少仓库的体积。
- Reflog
reflog是用于记录操作日志,防止误操作后数据丢失,通过reflog来找到丢失的数据,手动将日志设置为过期。
- 指定时间
git gc prune=now指定的是修剪多久之前的对象,默认是两周前
1.13 Git Clone & Pull & Fetch
- Clone
拉取完整的仓库到本地目录,可以指定分支,深度。
- Fetch
将远端某些分支最新代码拉取到本地,不会执行merge操作,会修改refs/remote内的分支信息,如果需要和本地代码合并需要手动操作。
- Pull
拉取远端某分支,并和本地代码进行合并,操作等同于git fetch + git merge,也可以通过git pull --rebase完成git fetch + git rebase操作。
可能存在冲突,需要解决冲突。
1.14 Git Push
Push是将本地代码同步至远端的方式。
- 常用命令
一般使用git push origin master命令即可完成
- 冲突问题
-
如果本 地的commit记录和远端的commit历史不一致,则会产生冲突,比如git commit - -amend or git rebase都有可能导致这个问题。
-
如果该分支就自己-个人使用,或者团队内确认过可以修改历史则可以通过git push origin master -f 来完成强制推送,一般不推荐主干分支进行该操作,正常都应该解决冲突后再进行推送。
- 推送规则限制 可以通过保护分支,来配置-些保护规则,防止误操作,或者一些不合规的操作出现, 导致代码丢失。
二. 个人感悟
- 多敲代码
- 抓紧时间,还有很多需要学习的