这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记。
| 方向 | 具体能力 |
|---|---|
| 代码托管 | 负责管理公司内数十万的代码仓库,并在这之上对代码管理的相关功能进行迭代,提升研发活动的效率及质量 |
| 代码智能 | 提供更准确高效的代码搜索能力和代码导航能力,支持多种场景下的代码跳转,帮助用户更高效的去阅读代码 |
| 代码分析 | 提供一种代码检查能力,目的是在整个研发流程中自动的发现并反馈代码中存在的代码结构、代码漏洞、代码风格等问题 |
| 持续集成 | 一种软件开发实践,团队成员频繁将他们的工作成果集成在一起。每次提交后,自动触发运行一次包含自动化验证集的构建任务,以便能尽早发现集成问题 |
| Cloud IDE | 一个开箱即用的云端开发环境,支持 node/python/go/java/c++等多种编程语言。你可以在云端开发环境中编写、编译、运行和调试你的项目 |
常见的问题
1.入职后按照文档进行Git配置,但是配置后依然拉取代码有问题,缺少自己排查配置问题的能力 2研发流程中进行一些异常操作,不符合研发规范,不清楚保护分支,MR/PR等概念
git是什么
定义:
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
版本控制
定义: 一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统
为什么需要版本控制
更好的关注变更,了解到每个版本的改动是什么,方便对改动的代码进行检查,预防事故发生;也能够随时切换到不同的版本,回滚误删误改的问题代码
本地版本控制
最初的方式
通过本地复制文件夹,来完成版本控制,一般可以通过不同的文件名来区分版本
解决方案
开发了一些本地的版本控制软件,其中最流行的是RCS
基本原理
本地保存所有变更的补丁集,可以理解成就是所有的 Diff,通过这些补丁,我们可以计算出每个版本的实际的文件内容
缺点
RCS这种本地版本控制存在最致命的缺陷就是只能在本地使用,无法进行团队协作,因此.此衍生出了集中式版本控制
集中版本控制
基本原理:
1提供一个远端服务来保存文件,所有用户的提交都提交到该服务器中
2增量保存每次提交的Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突
优点:
1.学习简单,更容易操作 2.支持二进制文件,对大文件支持更友好
缺点:
1.本地不存储版本管理的概念,所有提交都只能联上服务器后才可以提交
2.分支上的支持不够好,对于大型项目团队合作比较困难
3.用户本地不保存所有版本的代码,如果服务端故障容易导致历史版本的丢失。
分布式控制
基本原理:
1.每个库都存有完整的提交历史,可以直接在本地进行代码提交2.每次提交记录的都是完整的文件快照,而不是记录增量 3.通过Push 等操作来完成和远端代码的同步
优点:
1.分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体2.分支管理功能强大,方便团队合作,多人协同开发 3.校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失
缺点:
1.相对SVN更复杂,学习成本更高 2.对于大文件的支持不是特别好(git-lfs 工具可以弥补这个功能)
Git基本命令
git add. 提交到了暂存区
git commit -m""之后出现三个文件夹
一个存储目录树
一个存储作者信息,commit信息
Object
commit / tree / blob在 git里面都统一称为 Object,除此之外还有个tag的 object.
Blob 存储文件的内容 Tree 存储文件的目录信息 Commit 存储提交信息,一个Commit可以对应唯一版本的代码
三个信息串联到一起
1.通过Commit寻找到Tree信息,每个Commit都会存储对应的Tree lD.
2.通过Tree存储的信息,获取到对应的目录树信息。
3.从tree中获得 blob 的ID,通过 Blob ID获取对应的文件内容。
Refs
refs的内容就是对应的Commit lD 因此把 ref当做指针,指向对应的Commit来表示当前Ref对应的版本。
不同种类的ref refs/heads前缀表示的是分支,除此之外还有其他种类的ref,比如refs/tags前缀表示的是标签。
Git GC
GC
通过git gc命令,可以删除一些不需要的object,以及会对object进行一些打包压缩来减少仓库的体积。
Reflog
reflog 是用于记录操作日志,防止误操作后数据丢失,通过reflog来找到丢失的数据,手动将日志设置为过期。
指定时间
git gc prune=now指定的是修剪多久之前的对象,默认是两周前
实际操作:
完整的Git试图
远程协作
Clone
拉取完整的仓库到本地目录,可以指定分支,深度。
Fetch
将远端某些分支最新代码拉取到本地,不会执行merge操作, 会修改refs/remote内的分支信息,如果需要和本地代码合并需要手动操作。
Pull
拉取远端某分支,并和本地代码进行合并,操作等同于git fetch + git merge,也可以通过git pull --rebase完成git fetch + git rebase 操作。
可能存在冲突,需要解决冲突。
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 会把代码拉取到本地的远端分支,但是并不会合并到当前分支,所以当前分支历史没有变化。