Git 的正确使用与最佳实践 | 青训营

180 阅读9分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记

准备工作及资源

Git 安装Git使用文档

Git 基本命令学习 :学习 Git 命令,需要用 Shell 的方式执行,不要直接用图形化页面 Git菜鸟教程

Github 账号创建 :

  1. 完成 Github 账号创建
  1. 配置公私钥认证( SSH 公私钥配置)
  1. 创建一个个人仓库,并在该仓库上进行基本的 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基本使用方式

image.png

项目初始化 因为git是Linux的作者写的,所以基本命令和Linux大致相同

在当前想要创建目录路径下mkdir demo(demo 为项目名) 然后进入demo这个目录cd demo,初始化git init

如下为Windows端截图:

image.png

GIt 目录结构 & Tree安装 可以打开本地文件资源管理器也可以使用tree 查看目录结构:需要注意的是,windows端需要安装tree
官网下载Tree for Windows 下载Binaries版即可

image.png

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

image.png Git Remote 配置,分成 SSH 和 HTTP 两种协议实现,不同协议有不同的免密配置方式 SSH 公私钥配置

Git add touch readme.md新建一个文件,vim 写个hello world,查看一下提交状态

image.png git add . 再查看一下

image.png

Git commit commit / tree / blob在git里面都统一称为Object,除此之外还有个 tag的 object.
Blob: 存储文件的内容
Tree: 存储文件的目录信息
Commite: 存储提交信息,一个Commit可以对应唯一版本的代码

image.png

image.png 如何把这三个信息串联在一起呢
1.通过Commit寻找到Tree信息,每个Commit都会存储对应的Tree ID.
2.通过Tree存储的信息,获得对应目录树信息
3.从 tree中获得 blob 的ID,通过 Blob ID获取对应的文件内容。

Refs Refs文件存储的内容

image.png 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的内容。

image.png

image.png

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 image.png 回到git bash

image.png 若有连接测试提示,输入yes回车
接下来提交push readme image.png 如果报错

image.png 估计是由于仓库名称不一样,导致远程和本地的仓库不能关联上
统一远程和本地的仓库名称即可,把本地的 master 仓库名称修改为远端的 main

image.png 2.创建一个 feature分支\

image.png

image.png 3.创建一个 feature 到 main的Pull Request
进入到该网页 建立即可

代码合并