这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
准备工作及资源
Git 安装 : Git使用文档
Git 基本命令学习 :学习 Git 命令,需要用 Shell 的方式执行,不要直接用图形化页面 Git菜鸟教程
Github 账号创建 :
- 完成 Github 账号创建
- 配置公私钥认证( SSH 公私钥配置)
- 创建一个个人仓库,并在该仓库上进行基本的 clone / push 操作
代码服务有哪些
- 代码托管: 负责管理公司内数十万的代码仓库,并在这之上对代码管理的相关功能进行迭代,提升研发活动的效率及质量
- 代码智能: 提供更准确高效的代码搜索能力和代码导航能力,支持多种场景下的代码跳转,帮助用户更高效的去阅读代码
- 代码分析: 提供一种代码检查能力,目的是在整个研发流程中自动的发现并反馈代码中存在的代码结构、代码漏洞、代码风格等问题
- 持续集成: 一种软件开发实践,团队成员频繁将他们的工作成果集成在一起。每次提交后,自动触发运行一次包含自动化验证集的构建任务,以便能尽早发现集成问题
- Cloud IDE: 一个开箱即用的云端开发环境,支持 node/python/go/java/c++等多种编程语言。,你可以在云端开发环境中编写、编译、运行和调试你的项目
为什么要学习Git
- 协同工作: 业界绝大多数公司都是基于Git进行代码管理,因此 Git是一个程序员的必备技能
- 开源社区: 目前绝大多数的开源项目都是基于Git维护的,参与这些项目的开发都需要使用Git。
Git 是什么
- Git是什么?
Git is a free and open source atstwith tea ver saodn efficien sy.ten esighou tu riaruo oveyogfrom small to very large projects with speed and efficiency
-
版本控制是什么? 一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统
-
为什么需要版本控制? 更好的关注变更,了解到每个版本的改动是什么,方便对改动的代码进行检查,预防事故发生;也能够随时切换到不同的版本,回滚误删误改的问题代码;
-
已有的版本控制系统
| 版本控制类型 | 代表性工具 | 解决的问题 |
|---|---|---|
| 本地版本控制 | RCS | 本地代码的版本控制 |
| 集中式版本控制 | SVN | 解决多人协作问题,提供一个远端服务器来维护代码版本,本地不保存代码 |
| 分布式版本控制 | Git | 每个仓库都能记录版本历史,解决只有一个服务器保存版本的 |
- 部分代码托管平台
Github:全球最大的代码托管平台,大部分的开源项目都放在这个平台
Gitlab:全球最大的开源代码托管平台,项目的所有代码都是开源的,便于在自己的服务器上完成Gitlab的搭建
Gerrit:由Google 开发的一个代码托管平台,Android这个开源项目就托管在 Gerrit 之上
除此之外,还有 bitbucket, Coding, 码云 等一系列平台
Git基本使用方式
项目初始化 因为git是Linux的作者写的,所以基本命令和Linux大致相同
在当前想要创建目录路径下mkdir demo(demo 为项目名) 然后进入demo这个目录cd demo,初始化git init
如下为Windows端截图:
GIt 目录结构 & Tree安装 可以打开本地文件资源管理器也可以使用tree 查看目录结构:需要注意的是,windows端需要安装tree
官网下载:Tree for Windows 下载Binaries版即可
tree-1.5.2.2-bin.zip解压之后,在bin目录下有一个tree.exe的可执行文件,把这个可执行文件复制粘贴到你git的安装目录:F:\GIT\Git\usr\bin下即可(参考我的git安装目录)
在windows下的git bash中可以通过tree --help查看有哪些常用的命令
Git Config
Git 配置,分成本地,用户,系统基本的配置 用户名配置
$ git config --global user.name "Houjunhui"
$ git config --global user.email cse.jhhou19@gzu.edu.cn
使用命令查看已有的配置信息
git config --list
其他配置可以参考前面的菜鸟教程文档
Git Remote(命令用于在远程仓库的操作) 查看remote
git remote -v没有的话 添加remote:
$ git remote add origin_ssh git@github.com:git/git.git
$ git remote add origin_http https://github.com/git/git.git
Git Remote 配置,分成 SSH 和 HTTP 两种协议实现,不同协议有不同的免密配置方式
SSH 公私钥配置
Git add
touch readme.md新建一个文件,vim 写个hello world,查看一下提交状态
git add . 再查看一下
Git commit commit / tree / blob在git里面都统一称为Object,除此之外还有个 tag的 object.
Blob: 存储文件的内容
Tree: 存储文件的目录信息
Commite: 存储提交信息,一个Commit可以对应唯一版本的代码
如何把这三个信息串联在一起呢
1.通过Commit寻找到Tree信息,每个Commit都会存储对应的Tree ID.
2.通过Tree存储的信息,获得对应目录树信息
3.从 tree中获得 blob 的ID,通过 Blob ID获取对应的文件内容。
Refs Refs文件存储的内容:
refs 的内容就是对应的Commit lD
因此把 ref当做指针,指向对应的 Commit来表示当前 Ref对应的版本。
不同种类的ref:
refs/heads前缀表示的是分支,除此之外还有其他种类的ref,比如 refs/tags 前缀表示的是标签。
Branch
git checkout 一b 可以创建一个新分支
分支一般用于开发阶段,是可以不断添加Commit进行迭代的
Tag
标签一般表示的是一个稳定版本,指向的Commit一般不会变更
Annotation Tag 什么是附注标签? 一种特殊的Tag,可以给Tag提供一些额外的信息。
如何创建附注标签?
通过git tag -a命令来完成附注标签的创建。
查看该tag object的内容。
Git GC GC 通过git gc命令,可以删除一些不需要的object,以及会对object进行一些打包压缩来减少仓库的体积
Reflog reflog是用于记录操作日志,防止误操作后数据丢失,通过reflog来找到丢失的数据,手动将日志设置为过期
指定时间
git gc prune=now指定的是修剪多久之前的对象,默认是两周前 Git Clone & Pull & Fetch 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 会把代码拉取到本地的远端分支,但是并不会合并到当前分支,所以当前分支历史没有变化。
Git研发流程
依托代码管理平台Gitlab / Github / Gerrit 介绍我们如何进行代码的开发及团队合作
集中式工作流 什么是集中式工作流?
只依托于master分支进行研发活动
工作方式
1.获取远端master代码
2.直接在master 分支完成修改
3.提交前拉取最新的master代码和本地代码进行合 并(使用rebase),如果有冲突需要解决冲突
4.提交本地代码到 master
分布管理工作流 | 分支管理工作流| 特点 | | --- | --- | |Git Flow|分支类型丰富,规范严格| |Github Flow|只有主干分支和开发分支,规则简单| |Gitlab Flow|在主干分支和开发分支之上构建环境分支,版本分支,满足不同发布or环境的需要
下面主要实现Github Flow:
Github的工作流,只有一个主千分支,基于Pull Request往主干分支中提交代码。
选择团队合作的方式
1 owner创建好仓库后,其他用户通过 Fork的方式来创建自己的仓库,并在 fork的仓库上进行开发
2. owner 创建好仓库后,统一给团队内成员分配权限,直接在同一个仓库内进行开发
创建一个 Pull Request
1.创建一个main主分支\
在Github上建立一个仓库
复制ssh
回到git bash
若有连接测试提示,输入yes回车
接下来提交push readme
如果报错
估计是由于仓库名称不一样,导致远程和本地的仓库不能关联上
统一远程和本地的仓库名称即可,把本地的 master 仓库名称修改为远端的 main
2.创建一个 feature分支\
3.创建一个 feature 到 main的Pull Request
进入到该网页 建立即可
代码合并