录屏:技术分享会-git版本控制(密码0IWaQ2zq)
欢迎大家在评论区留言

前言

在项目代码调试的过程中发现,许多同学还在使用下载zip压缩包的方式使用远程git仓库,同时也暴露出了许多问题……

  • “git不是个网站吗?”
  • 把gitee当云盘用
  • 多个仓库共存,无版本控制概念

    image.png

  • 不会切换版本

  • 不会提交代码
  • ……

可见大家对版本控制的概念还比较模糊,git的入门操作也还不清楚。而git工具可以说是当代程序猿的一项必备技能,能够大大提高项目开发、团队沟通效率,这里就把项目中可能会用到git的部分场景跟大家讲一下。

建议学习路线

  1. 本次讲解仅针对项目需要,进行概念扫盲并列举几个常见的使用场景,不涉及具体的git教学
  2. 建议首先跟着 廖雪峰的Git教程 一步一步边敲代码边学习
  3. 然后浏览一下《Git官方参考文档》《Pro Git Book》B站-Git基本命令行用法讲解并加入收藏夹,遇到问题随时参考
  4. 除此之外,Learn Git BranchingGitee的Git大全也可以参考一下

What is git?

Git是一个免费开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

Git最初是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开源的版本控制软件。

特点

  • Free and Open Source——免费、开放源代码(Git遵循GPL协议)
  • Distribute —— 分布式,多备份

    注意

  • Git ≠ Github

    Git是版本控制系统,Github是在线的基于Git的代码托管服务。 Gitee相当于国内版的Github。

  • Git和SVN的区别

    SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版本控制器! 这是两者之间最核心的区别。 Git用户有自己的本地的版本控制,SVN只有服务器上的版本控制。 Git每一个终端都是一个仓库,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。


常见使用场景

获取远程仓库的代码

使用clone(克隆)而不是 download(下载)

Download:直接下载zip包就相当于你切断了与gitee上的代码的联系,单纯的就是获得了一个工程文件,如果你想直接pull或者push的话都是不行的 Clone:git会先在你的当前文件夹建立一个本地仓库,然后再去复制这个工程,这个时候在这个文件夹下面就是可以直接pull或者push的

Step1 获取远程仓库URL

image.png
HTTPS和SSH在使用上的区别在于鉴权方式不同,HTTPS使用用户名+密码的方式,而SSH则使用SSH Key密钥对的方式,这里建议使用SSH方式,设置方法见gitee的帮助页面

Step2 git clone

以大家常用的windows环境举例,没有安装git的同学在这里下载并安装git
进入命令行环境,用git自带的 Git Bash 或者 VS Code 都可以
image.png
输入命令

  1. git clone git@gitee.com:personnel-positioning/LR_NODE_EVAL.git

image.png
不出意外的话代码仓库就会出现在工作目录下了

出意外的情况一般有

  1. 没有访问权限:需要在gitee上添加自己的ssh key,如果还不行的话请联系仓库管理员
  2. 没有设置本地的user name和e-mail:按照命令行提示设置即可
  3. 没有ssh key,需要添加,或生成一个新的key

image.png


查看历史版本

Step1 git log

输入命令

  1. git log

然后就会出现历史版本的提交 (commit) 记录
image.png
试试看,执行git log --oneline会发生什么?

Step2 看懂commit信息

  • Commit ID

commit后面会接一大串神秘代码,这就是版本号commit id,对于每一次提交的版本都会有一个唯一的commit id,我们后面可以根据这个id定位到特定的版本状态。

  • Tag

Commit ID太长了,而且不好记,Tag就是一个代替方案。一些重要的版本记录(比如各个Release版)可以添加一个tag,可以根据tag方便地定位到特定版本。

  • Author

本次提交的作者,包含user name和email

  • Date

本次提交的时间

  • Comment

本次提交的备注信息,由作者在提交时手动输入。
简介明了、规范化的备注也是使用git关键点之一,可以参考阿里的提交规范。另外,半成品的提交建议使用[WIP]作为备注开头。


在版本间切换自如

切换版本主要使用reset指令,这个指令有一些参数需要注意

  • --hard 移动HEAD指针、修改暂存区和工作目录(当前未提交的文件将丢失,完全切换到指定版本)
  • --soft 只移动HEAD指针,不修改暂存区和工作目录(当前所有文件将保留)
  • --mix 默认操作,移动HEAD指针并修改暂存区,不修改工作目录(当前所有文件将保留)

关于工作目录、暂存区、等概念不作赘述,请参考这篇文章
[技术分享]在项目中使用git - 图7
下面的操作假设所有修改已经提交到版本库,版本切换仅用于浏览历史版本,因此均使用了--hard参数。

1. 利用commit id

commit id只需要写前几位就可以了,只要能够唯一确定一个版本就行。

  1. git reset --hard 8d45

image.png

2. 利用tag

不输入commit id,按下TAB键将会列出所有的tag和分支节点,输入tag名字即可快速切换到指定版本。

  1. git reset --hard EVAL_Firmware_v0.1

image.png


个人分支管理

在同一个项目中,同时要开发UWB的代码,还要开发气压计的代码,或许大家会有疑问:

如果都在同一个仓库上提交代码,那不是乱了套吗? 也许UWB的代码只写了一半,提交上去以后却导致气压计的代码无法编译了,这可咋办?

  1. git以及是一款成熟的软件了,自然有它的解决方法,也就是——**分支(Branch)**<br />大家可以看看[这篇文章](https://www.liaoxuefeng.com/wiki/896043488029600/896954848507552)来简单了解一下分支,下面介绍创建自己的分支并进行提交的具体步骤

Step1 创建分支 git branch

git branch指令用于分支管理,常见的操作有:

  • git branch -v git branch查看分支
  • git branch [name] 创建分支
  • git branch -d 删除分支

image.png

Step2 切换分支 git checkout

git checkout指令主要用于分支的切换,不过通常也利用它代替git branch来创建分支

  • git checkout [name]切换分支

image.png

  • git checkout -b [name]创建并切换分支

image.png

Step3 提交三部曲

创建了分支以后,就可以在自己的分支进行代码提交而不会影响到他人了。那么在自己的分支里如何提交呢?通常就是3个步骤:

  1. 产生改动,比如添加或修改一些文件
  2. git add 将改动添加到暂存区
  3. git commit 提交改动

image.png
这是最基础的git操作了,这里只简单贴一张图看看流程,具体可以参考这篇文章

多人协作

Step1 推送改动到远程仓库 git push

git push [[repository] [branch]] 指令可以将当前分支的改动推送到远程仓库指定的分支,这样大家就都可以看到你提交的代码了。
如果远程仓库没有该分支则会创建一个新分支,所以一定要确定好自己的分支名称不要推错了。
image.png

Step2 从远程仓库获取更新 git fetch/pull

如果有人在远程仓库上更新了代码(无论在哪一个分支上),而你想看看他做了那些修改,那这时候就要使用 git fetch 或者 git pull 将远程改动拉取到本地。
在顺利的情况下,我们使用git pull就可以将远程的改动拉回来了,并且会自动切换到最新的版本
image.png
使用git fetch的话,则会将远程改动拉回来,但本地的版本不会变,需要手动git reset/git merge到最新的版本
image.png
image.png
可以看出来,git pull其实就等价于git fetch+git merge
当然,有时不可避免的也会出现不顺利的情况:远程仓库产生了新的提交但没有及时被你拉回本地,这时你也产生了一个新的提交,于是就出现了冲突。 [技术分享]在项目中使用git - 图18关于冲突的解决一般使用git merge,这里就不展开了,详情可以参考这篇文章

我不想敲命令(╯‵□′)╯︵┻━┻

市面上也有许多非常好用的 GUI Git 工具,比如我个人经常使用的客户端工具SourceTreeungit,git windows客户端自身也有可选安装的GUI工具。
image.png
常用的编辑器、IDE、甚至画原理图的Altium Designer,也都支持git版本控制,可以自行研究一下。
image.pngimage.png
但是用了这么久我发现,实际上GUI工具基本也只是套了个壳,把键盘输入命令变成了鼠标点击命令,如果你不去深入理解每一个命令的作用的话,使用GUI只会令你更加地一头雾水(甚至有的中文翻译你都不知道原文是啥……)(STM32CubeMX偷懒工具也是一样的道理)
所以,强烈建议大家还是从命令行入手,把上面常见使用场景的操作都弄明白,然后再使用GUI工具提高效率和视觉体验。再说了,以后真的打算从事软件开发的话,纯命令行操作迟早是要习惯的。

实战演练

  1. 远程仓库克隆到自己的桌面上
  2. 进入仓库,看看有哪些历史提交
  3. 切换到tag为EVAL_Firmware_v0.1的历史版本,并查看源代码是否真的有变化
  4. 查看本地仓库有哪些分支
  5. 切换回当前分支的最新版本
  6. 在本地用自己的名字创建新分支

    注意,实际项目中通常使用具有一定功能特点的分支名(如develop、feat、debug等),这里使用自己的名字只是为了方便区分

  7. 切换到新分支

  8. 查看并记录下暂存区和分支的状态,放心地对仓库的文件进行修改
  9. 查看暂存区和分支的状态,并和修改前的进行对比
  10. 提交你的改动(注意添加简洁明了的备注信息),再次对比仓库状态,并对比提交记录
  11. 将你的改动推送到远程仓库

完成了上面的练习别忘了在评论区打个卡哟