这是我参与「第三届青训营 -后端场」笔记创作活动的的第11篇笔记
GO-学习笔记
Git
- 协同工作,分布式版本控制
- 每个库都有完整的提交历史,每次提交都是完整的文件快照
git init
初始化
- --initial-branch 指定初始化分支
- --bare 创建裸仓库
- --template 通过模版创建构建好的自定义git目录
git cat-file -p 9a71f81a4b4754b686fd37cbb3c72d0250d344aa
查看暂存区文件git log
查看提交记录
配置
git config
,用户信息配置;别名配置
- --global
- --system
- --local
- 低级别覆盖高级别
git remote
,与远端的仓库连接
git remote add origin_ssh git@github.com:git/git.git
添加远程仓库git remote set-url --add --push origin git@github.com:my_repo/git.git
设置push源
- 生成
ssh-ed25519
的密钥ssh-keygen -t ed25519 -C "978653881@qq.com"
上传操作
git add .
上传到本地缓存区git commit -m "add remote"
提交到git目录,多出目录树文件和commit记录
- Blob存储文件内容
- Tree存储文件目录信息
- Commit存储提交信息,对应唯一版本代码
- 通过Commit寻找Tree信息,每个Commit对应唯一的TreeID;通过Tree找到对应的BlobId,找到对应的文件内容
git push origin master
同步到远端origin源master分支
- 需要解决冲突
git push origin master -f
强制推送
分支
- refs/heads,保存分支信息,和对应的CommitId
git checkout -b test
创建test分支- 分支提交后,存在一个提交合并的请求,提交请求后,会被合并入主分支
git merge test --ff-only
Fast-forward形式合并,没有merge节点git merge test --no-ff
,Three-Way Merge 分支合并
标签
refs/tags
稳定版本,指向commitIdgit tag v0.0.1
生成标签git tag -a v0.0.2 -m "v0.0.2"
生成附注标签,其中指向了commitId
拉取
- 当上传新版本时,通过
parent
与前一个版本进行关联 git clone
git fetch
,不会执行merge操作git pull
,会执行merge,需要解决冲突
git pull --rebase
git pull origin main
拉取最新的代码,与本地合并
修改历史版本信息
git commit --amend
,生成一个新的commitId,旧的commitId是没有指向的,是悬空的git rebase -i HEAD~3
修改最近三个commit的修改filter --branch
指定删除所有提交中的某个文件或者全局修改邮箱地址
gc
git fsck --lost-found
查看悬空的commitgit reflog expire --expire=now --all
设置为过期,否则无法删除悬空的commitgit gc --prune=now
,指定过期时间,删除不需要的object,打包压缩减少仓库体积
保护主分支
排序算法
- go <=1.18,混合排序,主体是快速排序
三大排序算法
- 排序算法
- 插入排序,不断插入已经排序好的array,找到一个比其小的数,放在后面,不需要准备时间
- 最好情况下,有序时 o(n)
- 平均 o(n^2)
- 最坏情况 o(n^2)
- 平均时间复杂度比较高,最好的情况时间复杂度较好
- 短序列或元素有序时,性能最好
- 快速排序,分治思想,直到整体有序
- 最好情况下,选择的轴点是中位数,o(n*logn)
- 平均 o(n*logn)
- 最坏情况 o(n^2)
- 大部分情况,性能较好
- 堆排序,大顶堆,将根节点交换到最后一个位置
- 最好情况,o(n*logn)
- 平均 o(n*logn)
- 最坏情况 o(n*logn)
- 性能稳定
qdqsort
- pattern-defeating-quicksort
- 最好情况,o(n)
- 平均 o(n*logn)
- 最坏情况 o(n*logn)
- 第一个版本,分情况决策,取长补短
- 短序列使用插入排序,长度为12~32,泛型时<=24
- 其他情况用快排
- 快排表现不佳,用堆排保证;当快排轴点离两端很接近时,当这种情况发生的次数达到了limit后,就使用堆排序
- limit,为bits.Len(len),数组长度的需要的比特位的个数
- 第二个版本,优化快排的轴点选择
- 首个元素作为pivot,容易出现极端情况
- 遍历数组,找真正的中位数,代价很高
- 寻找近似中位数,短序列,选择固定元素;中序列,采样三个元素;长序列,采样九个元素
- 探知序列的能力,采样元素的特点,如果逆序,翻转整个序列;如果顺序,使用插入排序,限制次数,防止达到最坏情况
- 第三个版本,优化重复度较高的情况
- 快排中,两次partition生成的pivot相同,判定进行了无效分割,使用
partitionEqual
将重复元素排列在一起- pivot选择策略不佳,随机交换元素