录屏:技术分享会-git版本控制(密码0IWaQ2zq)
欢迎大家在评论区留言
前言
在项目代码调试的过程中发现,许多同学还在使用下载zip压缩包的方式使用远程git仓库,同时也暴露出了许多问题……
- “git不是个网站吗?”
- 把gitee当云盘用
多个仓库共存,无版本控制概念
不会切换版本
- 不会提交代码
- ……
可见大家对版本控制的概念还比较模糊,git的入门操作也还不清楚。而git工具可以说是当代程序猿的一项必备技能,能够大大提高项目开发、团队沟通效率,这里就把项目中可能会用到git的部分场景跟大家讲一下。
建议学习路线
- 本次讲解仅针对项目需要,进行概念扫盲并列举几个常见的使用场景,不涉及具体的git教学
- 建议首先跟着 廖雪峰的Git教程 一步一步边敲代码边学习
- 然后浏览一下《Git官方参考文档》、《Pro Git Book》、B站-Git基本命令行用法讲解并加入收藏夹,遇到问题随时参考
- 除此之外,Learn Git Branching,Gitee的Git大全也可以参考一下
What is git?
Git是一个免费开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
Git最初是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开源的版本控制软件。
特点
- Free and Open Source——免费、开放源代码(Git遵循GPL协议)
-
注意
Git ≠ Github
Git是版本控制系统,Github是在线的基于Git的代码托管服务。 Gitee相当于国内版的Github。
-
SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版本控制器! 这是两者之间最核心的区别。 Git用户有自己的本地的版本控制,SVN只有服务器上的版本控制。 Git每一个终端都是一个仓库,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。
常见使用场景
获取远程仓库的代码
使用clone(克隆)而不是 download(下载)
Download:直接下载zip包就相当于你切断了与gitee上的代码的联系,单纯的就是获得了一个工程文件,如果你想直接pull或者push的话都是不行的 Clone:git会先在你的当前文件夹建立一个本地仓库,然后再去复制这个工程,这个时候在这个文件夹下面就是可以直接pull或者push的
Step1 获取远程仓库URL
HTTPS和SSH在使用上的区别在于鉴权方式不同,HTTPS使用用户名+密码的方式,而SSH则使用SSH Key密钥对的方式,这里建议使用SSH方式,设置方法见gitee的帮助页面。
Step2 git clone
以大家常用的windows环境举例,没有安装git的同学在这里下载并安装git
进入命令行环境,用git自带的 Git Bash 或者 VS Code 都可以
输入命令
git clone git@gitee.com:personnel-positioning/LR_NODE_EVAL.git
不出意外的话代码仓库就会出现在工作目录下了
出意外的情况一般有
- 没有访问权限:需要在gitee上添加自己的ssh key,如果还不行的话请联系仓库管理员
- 没有设置本地的user name和e-mail:按照命令行提示设置即可
- 没有ssh key,需要添加,或生成一个新的key
查看历史版本
Step1 git log
输入命令
git log
然后就会出现历史版本的提交 (commit) 记录
试试看,执行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指针并修改暂存区,不修改工作目录(当前所有文件将保留)
关于工作目录、暂存区、等概念不作赘述,请参考这篇文章
下面的操作假设所有修改已经提交到版本库,版本切换仅用于浏览历史版本,因此均使用了--hard
参数。
1. 利用commit id
commit id只需要写前几位就可以了,只要能够唯一确定一个版本就行。
git reset --hard 8d45
2. 利用tag
不输入commit id,按下TAB
键将会列出所有的tag和分支节点,输入tag名字即可快速切换到指定版本。
git reset --hard EVAL_Firmware_v0.1
个人分支管理
在同一个项目中,同时要开发UWB的代码,还要开发气压计的代码,或许大家会有疑问:
如果都在同一个仓库上提交代码,那不是乱了套吗? 也许UWB的代码只写了一半,提交上去以后却导致气压计的代码无法编译了,这可咋办?
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
删除分支
Step2 切换分支 git checkout
git checkout
指令主要用于分支的切换,不过通常也利用它代替git branch
来创建分支
git checkout [name]
切换分支
git checkout -b [name]
创建并切换分支
Step3 提交三部曲
创建了分支以后,就可以在自己的分支进行代码提交而不会影响到他人了。那么在自己的分支里如何提交呢?通常就是3个步骤:
- 产生改动,比如添加或修改一些文件
git add
将改动添加到暂存区git commit
提交改动
这是最基础的git操作了,这里只简单贴一张图看看流程,具体可以参考这篇文章
多人协作
Step1 推送改动到远程仓库 git push
git push [[repository] [branch]]
指令可以将当前分支的改动推送到远程仓库指定的分支,这样大家就都可以看到你提交的代码了。
如果远程仓库没有该分支则会创建一个新分支,所以一定要确定好自己的分支名称不要推错了。
Step2 从远程仓库获取更新 git fetch/pull
如果有人在远程仓库上更新了代码(无论在哪一个分支上),而你想看看他做了那些修改,那这时候就要使用 git fetch
或者 git pull
将远程改动拉取到本地。
在顺利的情况下,我们使用git pull
就可以将远程的改动拉回来了,并且会自动切换到最新的版本
使用git fetch
的话,则会将远程改动拉回来,但本地的版本不会变,需要手动git reset
/git merge
到最新的版本
可以看出来,git pull
其实就等价于git fetch
+git merge
当然,有时不可避免的也会出现不顺利的情况:远程仓库产生了新的提交但没有及时被你拉回本地,这时你也产生了一个新的提交,于是就出现了冲突。
关于冲突的解决一般使用
git merge
,这里就不展开了,详情可以参考这篇文章。
我不想敲命令(╯‵□′)╯︵┻━┻
市面上也有许多非常好用的 GUI Git 工具,比如我个人经常使用的客户端工具SourceTree、ungit,git windows客户端自身也有可选安装的GUI工具。
常用的编辑器、IDE、甚至画原理图的Altium Designer,也都支持git版本控制,可以自行研究一下。
但是用了这么久我发现,实际上GUI工具基本也只是套了个壳,把键盘输入命令变成了鼠标点击命令,如果你不去深入理解每一个命令的作用的话,使用GUI只会令你更加地一头雾水(甚至有的中文翻译你都不知道原文是啥……)(STM32CubeMX偷懒工具也是一样的道理)。
所以,强烈建议大家还是从命令行入手,把上面常见使用场景的操作都弄明白,然后再使用GUI工具提高效率和视觉体验。再说了,以后真的打算从事软件开发的话,纯命令行操作迟早是要习惯的。
实战演练
- 将远程仓库克隆到自己的桌面上
- 进入仓库,看看有哪些历史提交
- 切换到tag为
EVAL_Firmware_v0.1
的历史版本,并查看源代码是否真的有变化 - 查看本地仓库有哪些分支
- 切换回当前分支的最新版本
在本地用自己的名字创建新分支
注意,实际项目中通常使用具有一定功能特点的分支名(如develop、feat、debug等),这里使用自己的名字只是为了方便区分
切换到新分支
- 查看并记录下暂存区和分支的状态,放心地对仓库的文件进行修改
- 查看暂存区和分支的状态,并和修改前的进行对比
- 提交你的改动(注意添加简洁明了的备注信息),再次对比仓库状态,并对比提交记录
- 将你的改动推送到远程仓库
完成了上面的练习别忘了在评论区打个卡哟