这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记
0. 概要
本文为「Git 的正确使用姿势与最佳实践」课程的部分笔记,记录了课程中讲述的一些知识点,以便于后续回顾。
1.Git基本命令
-
配置git
- git config
- git remote
-
提交代码
- git add
- git commit
-
远端同步
-
拉取代码
- clone
- pull
- fetch
-
推送代码
- push
-
-
2.常见问题
-
-
为何配置了Git但还是无法拉取代码
- 免密认证没有配。
- Instead Of配置没有配,配的SSH免密配置,但是使用的还是HTTP协议访问。
-
为何Fetch了远端分支,但在本地当前的分支历史无变化
- 仅会更新orgin分支
- fetch 会把代码拉取到本地的远端分支,但是并不会合并到当前分支,所以当前分支历史没有变化。
-
3.Git目录介绍
项目初始化(在移动至项目目录后执行)
- git init
其他参数
-
--initial-branch
- 初始化分支
- 自定义主分支名称
-
--bare
- 创建一个裸仓库(纯Git目录,没有工作目录)
- 一般在服务器创建的仓库使用此方式
-
--template
- 可以通过模板创建预先构建好的自定义git目录
git目录内容
- HEAD:表示当前指向的分支
- config:存储相关配置
- hooks:配置一些hook
- objects:一些文件信息
- refs:分支信息
其他内容:
- 工作区:改代码和新建文件
- 暂存区:修改后的代码通过add添加至暂存区
不同级别的Git配置
每个级别的配置可能重复,但低级别配置会覆盖高级别配置
- --global
- --system
- --local
4.常见Git配置
-
用户名配置
- git config --global user.name "xxx"
- git config --global user.email "xxx"
-
Instead of 配置
- git config --global url.git@github.cm:.insteadOf github.com/
-
Git 命令别名配置
-
git config --global alias.cin "commit --amend --no-edit"
- 输入cin后即等同于输入commit --amend --no-edit
-
5.Git Remote
- 本地与远端仓库的关联信息
-
-
查看Remote(查看源)- git remote -v
-
添加Remote(添加源)- git remote add origin_ssh git@github.com:git/git.git- git remote add origin_http github.com/git/git.git
-
Http Remote(相关免密配置)
-
内存- git config --global credential.helper 'cache --timeout=3600'
-
硬盘- git config --global credential.helper "strore --file /path/to/credential-file"
- 不指定目录的情况下默认是 ~/.git-credenetials -
将秘钥信息存在指定文件中,具体格式: {user}:${password}@github.com
-
SSH Remote(相关免密配置) 通过公私钥的机制,将生成公钥存放在服务端,从而实现免密访问
-
Key的类型- dsa:现在已不安全- rsa:默认,现在已不安全- ecdsa- ed25519:现在优先推荐使用
-
生成公私钥- 例子:ssh-keygen -t ed25519 -C "${MyEmail}"- 钥默认存在 ~/.ssh/id_ed25519.pub- 公钥放在Git仓库(Github)
-
6.Git Add
- 将当前新文件添加至版本更新中
-
-
git cat-file -p ${objects文件夹内的目录+目录内文件名称}
- 显示此次add的内容
-
git commit -m "add readme"
- 将add的文件进行commit,并配上文字说明
-
-
7.Objects
-
-
commit/tree/blob 在git里都统一称为Object
-
Blob:存储文件内容
-
Tree:存储文件的目录信息
-
Commit:存储提交信息,一个Commit可以对应唯一版本的代码
-
三者如何串联至一起?
- 1.通过Commit寻找到Tree信息,每个Commit都会存储对应的Tree ID
- 2.通过Tree存储的信息,获取到对应的目录树信息
- 3.从Tree中获得Blob的ID,通过Blob ID 获取对应的文件内容
-
git checkout -b test
- 切换到分支"test"上
-
8.Refs
refs的内容就是对应的Commit ID,因此把ref当作指针,指向对应的Commit来表示当前Ref对应的版本。
-
9.追溯历史版本
-
- 获取当前版本代码:通过Ref指向的Commit可以获取唯一的代码版本
- 获取历史版本代码:Commit里会存有parent commit字段,通过commit 的串联获取历史版本代
-
10.修改历史版本
-
-
commit --amend
- 修改最近一次commit信息,修改后的commit id会变
-
rebase
-
通过 git rebase -i HEAD~3 可以实现对最近三个commit的修改
- 1. 合并commit
- 2. 修改具体的commit message
- 3. 删除某个commit
-
-
filter --branch
- 可以指定删除所有提交中的某个文件或全局修改邮箱地址等操作
-
修改commit 后 新增了commit object,但旧的commit object并未被删除,而是悬空,即变成了没有ref指向的object
-
git fsck --lost-found
- 可以查找悬空的commit
-
-
11.Git GC:垃圾回收
-
-
GC
- 通过git gc可以删除一些不需要的object,并对object进行一些打包压缩来减少仓库体积
-
Reflog
- reflog用于记录操作日志,防止误操作后数据丢失,通过reflog来找到丢失的数据,手动将日志设置为过期
-
指定时间
- git gc prune=now 指定的是修剪多久之前的对象,默认为两周前
-
12.完整的Git视图
-
13.Git Clone & Pull & Fetch
-
-
Clone
- 拉取完成的仓库到本地,可以指定分支与深度
-
Fetch
- 将远端某些分支最新代码拉取到本地,不会执行merge操作
- 会修改refs/remote内的分支信息,如果需要和本地代码合并需要手动操作。
-
Pull
- 拉取远端某分支,并和本地代码进行合并,操作等同于git fetch+git merge,适合于对远端代码情况不清楚,很可能会产生冲突时;当对代码非常清楚与了解时,也可以通过git pull-rebase完成git fetch+git rebase操作。
-
可能存在冲突,需要解决冲突。
-
-
14.Git Push
-
-
常用命令
- 一般使用git push origin master命令即可完成
-
冲突问题
- 1. 如果本地的commit记录和远端的commit历史不一致,则会产生冲突,比如git commit--amend or git rebase都有可能导致这个问题。
- 2.如果该分支就自己一个人使用,或者团队内确认过可以修改历史则可以通过git push origin master 一f 来完成强制推送,一般不推荐主干分支进行该操作,正常都应该解决冲突后再进行推送。
-
推送规则限制
- 可以通过保护分支,来配置一些保护规则,防止误操作,或者一些不合规的操作出现,导致代码丢失。
-
15.总结
git的操作方式非常丰富,熟练掌握git的操作方法对于提高团队开发效率非常重要。
思维导图: