# Git使用教程
**Repository Path**: harbin-university-electronics/warehouse-1
## Basic Information
- **Project Name**: Git使用教程
- **Description**: 本项目为我校学生建立一个Git使用的教程。
- **Primary Language**: C
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2022-03-20
- **Last Updated**: 2023-09-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# **在 VSCode 中使用码云进行代码管理**
## **一、前言**
### **1、本教程核心内容**
本文主要是整合了网上教程,从 Git 安装开始,配置关联本地仓库到码云,最终用 VScode 完成 Git 文件同步和推送。
基本过程:安装 Git;关联码云;打开 VSCode 管理代码。
### 2、Git 的基本概念和适用范围
大型的软、硬件工程需要团队合作、多人共同完成,其设计过程是一个不断更新、迭代的过程。这个过程中我们可能需要完成这样一些操作:备份、暂存、滚回(撤销某些操作)、协同(共同完成任务)、合并(把多个设计路径的结果合并)、审核、测试。因此在软、硬件迭代过程中,会产生多个版本的设计文件。
由于多人协作,使得处理代码的编写权限、审核权限,代码分支、更新、滚回、追溯变得十分复杂,没有可靠的版本控制机致,就会导致软件版本混乱,不稳定可靠。因此现代大型软件编写都需要复杂的软件版本控制。
最原始的版本控制方式就是每个文件修改过后,都要保留一个备份文档,同时需要在软件中标记版本迭代时间、修改人、修改目的和修改内容,以便回溯。这个过程都是手工操作完成的,其完善程度往往取决于编程体系和编程人员的规范程度。这也是嵌入式初学者常用的版本迭代控制手段。
但是这种方式有显著缺点:
1. 多个文件,保留所有版本时,需要为每个版本保存一个文件;
2. 没有自动日志,因此需要手工记录每个版本做的改动,工作量巨大;
3. 当版本改动涉及多个文件,或者包含文件目录结构变动以及编译控制文件时,版本滚回非常复杂;
4. 多人协同操作时,需要将文件打包发来发去,这个过程并不安全可靠;
5. 项目分支合并困难,设计协同繁琐;
6. 容易丢失,被删除或损坏的文件往往无法恢复。
针对上述问题,管理大型软件项目有两种思路:
一种是集中权限处理,典型的就是开放源代码版本控制系统 SVN。SVN 也就是 Subversion ,主要采用了 Copy-Modify-Merge 工作模式,软件工程需要追踪项目从开始到结束的整个过程。当某一用户想修改文件时,可以先将服务器文件 update 到本地端(Copy),然后在本地端对副本进行修改(Modify),修改操作完成后,再将副本提交(commit)到服务器,由服务器端的审核机致完成代码合并(Merge)。如果在此用户 commit 之前,原文件已经被其他用户修改并提交过,那么服务器上的版本号与本地端上的版本号不同,二者将产生冲突,服务器将中止提交。
SVN 需要一个中央资料档案库(Repository)存储软件项目,由于采用集中管理的方法,因此需要的存储资源少,速度快,安全性较高。SVN 版本库管理数据集中放在中央服务器,所以客户端首先要从中央服务器得到最新的版本,编程完成后,把自己的代码 commit 提交、推送到中央服务器。也正是这种集中式版本控制,所以必须联网才能完成代码的提交、合并等工作,由于 SVN 无法脱离网络完成软件协同,离线状态下 SVN 不能看到完整的 log 日志文件,因此脱离了服务器,单一用户无法完成完整的版本控制。这样的好处就是统一管理,权限分明,比较严谨。但是不够灵活。
版本管理的另一种思路就是分布式代码版本控制。分布式版本控制没有中央服务器,当编程人员拉取一个代码时,就下载了这个代码的完整版本库,由于每个工作人员都有完整的版本库,所以在自己电脑上可以离线独立完成软件的版本控制。 Git 就是这样一个分布式的版本控制系统,用于敏捷高效地处理项目。
例如本教程就是采用 Git 版本控制机制进行管理的,在 VSCode 本地端看到本教程的版本控制过程,也可以在本地端随时完成代码的修改、暂存、提交、滚回等操作。

通过 Git 的图形化管理界面,我们可以看到工程项目的 master 和分支,及其修订情况。

例如上图中左侧“REPOSITORIES”仓库以列表形式显示“warehouse-1”项目的操作过程、提交情况,以及文件历史等信息。右侧以图形化方式显示历次提交和推送到远程仓库的内容。我们点开“添加 PICO 串行显示例子”节点,可以看到提交数据的信息和提交人的信息以及时间。最右侧显示树状文件结构,显示提交的文件名和对已有文件的修改情况。例如 settings.json 文件(+41|-19)表明文件的增/删情况,点击右侧的按钮可以复制、打开该文件,或查看当前版本下文件信息。这样我们就可以轻易观察该节点时文件的改动,并可以滚回。
这种去中心化的项目管理机制给用户带来了相当大的权限和灵活性,非常适合多人协作和多分支项目管理,因此在开源项目蓬勃发展的时代,分布式版本管理得到广泛应用。Git 就是主流方案之一。不掌握 Git 的使用,就无法运用海量的开源设计资源,因此各高校相关专业,均开始逐步推进通过 Git 进行设计项目管理的课程实践活动。
### 3、Git 学习、本开源教程内容与本专业课程的相互关系
由于 Git 带来的便利,Github 和 Gitee 等云端托管平台孵化了大量开源代码,这些开源代码形成了庞大软硬件设计资源库。充分利用海量的 Git 开源设计资源,可以大幅度缩短嵌入式学习的过程,同时借鉴先进的编程理念和思路可以快速提高设计水平、能力。
学习 Git 项目管理,可以提高嵌入式的自学能力,掌握先进的软件项目管理方法,快速学习并搭建嵌入式学习平台。
我专业部分嵌入式相关课程,在教学大纲的教学目标和能力要求中设定了 Git 云端软件项目管理的任务和要求。例如《嵌入式操作系统》课程“毕业目标 5”:了解通过 GitHub 或 Gitee 等云端软件开发协作平台进行软件项目管理、软件协同、代码质量分析的方法。“毕业要求 11”:11-1 理解并掌握工程管理基本原理,能够在个人或多学科团队任务中,应用工程管理知识对工程项目进行组织与管理,并具有一定的领导能力。
由于嵌入式学习和 Git 项目管理本身的复杂性,所以本开源嵌入式教学平台采取循序渐进的学习方法。建议的学习路径如下:
1. 学习项目管理平台的建立。主要学习 Git 基本管理常识和 VSCode 编程环境的搭建。通过该阶段学习,大家可以掌握如何从本校内开源教程中 Fork 项目,建立项目分支。clone 克隆项目到本地电脑。VSCode 编程环境建立,插件安装;
2. MicroPython 实验教程。由于 MicroPython 入门较为简单,同时适合快速建立模块化功能原型,快速验证硬件平台的正确性,所以适合初学上手。通过 MicroPython 实验,我们可以了解 STM32 硬件的基本结构和功能配置,并学习运用模块电路快速建立电子系统的方法。主要学习内容包括:STM32CubeProgrammer 编程软件的使用(Readme);开发板固件的烧写(firmware);STM32 引脚基本功能和分配(读图);STM32 的 GPIO 使用(Blink);函数编写和调用(ws2812 跑马灯、HC_SR04 超声波测距);SPI 接口和 LCD 显示(ST7735-LCD);综合设计-舵机+超声波测距的扫描雷达。
3. Arduino 实验教程。Arduino 平台具有极其丰富的外围模块库,配合 STM32 的丰富外设资源以及较高的运算能力,可以快速实现功能性电路。虽然 Arduino 平台搭建较为复杂,但是与采用标准库设计 STM32 功能系统相比,其实现的难度要低很多。这样可以通过几个简单的实验,迅速让学习者掌握嵌入式功能实现的方法,掌握从 Github 或 Gitee 上获取资源的能力。Arduino 实验教程的主要学习内容包括:ArduinoIDE 开发环境的建立(Readme,Arduino-NanoV3 实验);ArduinoIDE 中 STM32 开发环境的建立(STM32F411_Arduino_Blink);ArduinoIDE 外部库的导入(STM32-ws2812 跑马灯,超声波测距);ArduinoIDE 平台 STM32 软 SPI 接口编程(ST7735-LCD);ArduinoIDE 综合设计-舵机+超声波雷达;PlatformIO 平台硬 SPI 接口(TFT 液晶显示时钟);PlatformIO 运行 FreeRTOS 操作系统。
4. STM32HAL 库。这部分实验采用开发板原厂测试代码,在 MiniSTM32F4x1 项目下,Fork 自 Weact 开源库。
5. STM32 标准库。这部分实验采用开发板原厂测试代码,在 MiniSTM32F4x1 项目下,Fork 自 Weact 开源库。
MicroPython 和 Arduino 实验由于不需要非常深入的嵌入式底层知识,可以酌情在 C 语言课程之后、嵌入式课程之前开展。
\*HAL 库说明。采用 HAL 库开发可以使用 STM32 原厂提供的 STM32CubeMX 完成硬件的初始化,通过图形化界面对硬件初始化过程可以有较为直观的感受,同时不需要对底层寄存器的工作原理有较深的了解,因此上手比标准库快。但是采用 HAL 库仍需要自己编写一部分底层驱动程序的接口代码,以及中间件,需要硬件和软件协议底层知识,所以难度高于 Arduino 平台,建议与嵌入式硬件接口课程和嵌入式操作系统课程同步学习。另外,HAL 库极度依赖于意法公司提供的 STM32CubeMX 平台,所以不利于学习其他单片机,在掌握一定的 HAL 库使用方法后,仍建议适当接触和学习标准库的使用。由于两者存在很多相似性,所以从 HAL 库过渡到标准库并不困难。
\*\*标准库说明。STM32 标准库是意法公司早期提供的 BSP 板级驱动库,用于让用户摆脱直接访问寄存器带来的巨大工作量。传统编程大多是从标准库开始的,但是由于标准库的使用仍需要对底层硬件的工作原理和结构的了解,因此使用上手难度远高于 HAL 库。例如引脚分配、时钟链设置等工作,需要编程者熟悉硬件参考手册,这带来了大量的阅读工作量,对初学者十分不友好,这也是 STM32 学习难度大于 MCS51 单片机的一个重要原因。正因为标准库的难度较高,导致学习曲线陡峭,因此建议初学者不要从标准库开始学习,而是从 Arduino、HAL 库等相对简单的方式入手,逐渐熟悉系统。
这也是本教程采用 STM32 开发板在这个统一平台上,学习 MicroPython、Arduino、PlatformIO 等多种平台构建形式,可以打开大家的视野,加深大家对嵌入式的理解,与世界先进设计和管理方式接轨。配合 ESP8266 和 ESP32 模块,还可以完成相当多的 IOT 物联网项目。
本嵌入式开源项目教程是课内教学的课外补充和扩展,需要结合学校开设的嵌入式相关课程和实践环节,完成整体教学目标和毕业要求。建议课内理论学时与课外学时配比为 1:1.5。课外总学时预计分配为:Git 和 VSCode 平台搭建(6-10 时);MicroPython(20 时);Arduino 平台模块实验(20 时);PlatformIO 安装和综合实验(20 时);HAL 库实验和标准库在嵌入式操作系统等课程中完成,本开源平台将在以后逐步完善此部分内容。
### **4、Git 和 Github 的关系**
Git 管理需要安装**软件**来实现 git 功能。
Github、BitBucket、Gitee 是基于 git 的项目托管平台,用于存储开源分享的代码,或你自己的项目代码。通过 Git,你可以从 Github、BitBucket、Gitee 这些项目托管平台上克隆、拉取、更新代码,也可以推送你自己的代码来参与到开源项目中。
Github、BitBucket 服务器在国外,连接速度较慢,但是开源代码丰富。Gitee(码云) (gitee.com ) 是国内的平台,连接速度快,但是优质的开源代码数量少。在 Gitee 上,可以通过 Fork 的方法,将你感兴趣的 Github 开源代码克隆到你的项目仓库中,提升访问速度并可方便的对其更改。
## **二、程序安装等准备工作**
1. [注册码云(Gitee)](https://https://gitee.com/signup)。如果加入哈尔滨学院电子系,需要管理员的邀请链接。
2. [下载 VSCode](https://code.visualstudio.com)安装。安装可参考[VSCode 安装教程详细简单版](https://blog.csdn.net/weixin_43928112/article/details/125813377)。在 VSCode 中安装插件,推荐几种:
1. Chinese(Simplified) (简体中文)Language Pack for Visual Studio Code(中文包)
2. C/C++Extension Pack(c 语言工具包,包含:C/C++;C/C++ Themes(主题,主要是暗黑主题保护眼睛);CMake(Linux 系统 C 语言编译工具);Doxygen 文档生成(通过 C 语言注释生成程序的描述文档,例如程序详细说明书);Remote Development 扩展包。(Remote Development 远程开发包,主要用于兼容 Linux 工具链和使用 SSH 打开远程机器/VM 上的文件夹。如果在 Windows 上安装乌班图操作系统,或需要通过 Windows 主机控制访问树莓派、Jetson 等基于 Linux 的嵌入式平台[]())。
3. Git Extension Pack(Git 扩展包,工程管理和历史回溯)
4. vscode all markdown(Markdown 是一种文本格式编辑语法,由于使用简单,便于通用互换,许多网站都广泛使用 Markdown 来撰写帮助文档或是用于论坛上发表消息)
5. Office Viewer(Markdown Editor)
6. Python Extension Pack(Python 助手,Python 环境变量管理、调试。不包含 Python)
7. 驼峰翻译助手(可以用中文输入变量名,win 系统按"Alt+shift+t"可以选择翻译英文的格式。例如输入:温度传感器,可自动翻译为“TemperatureSensor”大写驼峰格式或“TEMPERATURE_SENSOR”下划线常量格式)
8. PlatformIO IDE 嵌入式开发的协作平台,支持 Arduino 平台开发。
3. [下载 git](https://git-scm.com/downloads)(windows 64bit 应下载**[64-bit Git for Windows Setup](https://github.com/git-for-windows/git/releases/download/v2.35.1.windows.2/Git-2.35.1.2-64-bit.exe).**)安装。
安装默认编辑器选择 VSCode。

默认控制台选 windows 的 cmd

激活实验特性

其他全都选择下一步即可。
## 三、在 Gitee 安装 SSH 公匙
#### 1、什么是 SSH 公匙
简单说就是为你的电脑与 Git 服务器通信建立的密码钥匙。
在本地电脑访问远程仓库时,为了保证远程传输数据的安全,需要对数据加密。SSH(Secure Shell)安全外壳协议是一种经常采用的加密传输安全协议。SSH 协议为数据的加密与解密提供了非对称加密方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。
公钥和私钥:
```
1、一个公钥对应一个私钥。
2、密钥对中,让大家都知道的是公钥,不告诉大家,只有自己知道的,是私钥。
3、如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。
4、如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。
```
用途 1:加密,主要用于将数据资料加密不被其他人非法获取,保证数据安全性。使用公钥将数据资料加密,只有私钥可以解密。即使密文在网络上呗第三方获取,由于没有私钥无法被解密,从而保证数据安全性。
具体流程:
```
1. A在自己电脑上生成RSA钥匙文件,一个私钥文件一个公钥文件,并将他的公钥传送给B。
2. 此时B要传送信息给A,于是B用A的公钥加密他的消息,然后传送给A。【网络上传输的密文,没有A的私钥无法解密,其他人获取之后也没用】
3. A用他的私钥解密B的消息。
```
用途 2:认证,主要用于身份验证,判断某个身份的真实性。使用私钥加密以后,用对应的公钥解密从而验证身份的真实性。
验证的具体流程:
```
这里以SSH公钥登录为例介绍:
1、A发送自己的公钥(id_rsa.pub)到B主机的/root/.ssh/目录下,并将其重命名为authorized_ keys
2、A使用自己的私钥(id_rsa)来登录。
使用命令:ssh -i id_rsa root@xx.xx.xx.xx
```
#### **2、如何生成 ssh 公钥**
[本段内容大部分引用自码云平台帮助文档](http://git.mydoc.io/?t=154712)
##### 1)在你的电脑打开 **_Git Bash_**(安装完 git 就有这个)。
##### 2)在 Git Bash 中输入命令来生成 sshkey:
```
ssh-keygen -t rsa -C "youremail@xxx.com"
```
- Git Bash 提示#Generating public/private rsa key pair...
- 三次回车即可生成 ssh key
##### 3)在 Git Bash 中输入命令,查看你的 public key
```
cat ~/.ssh/id_rsa.pub
```
会显示:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc....
复制 ssh-rsa 及后面所有的文字。
##### 4)在码云 Gitee 添加公匙
登陆码云,在右上角个人头像上点击,选择设置。在左侧安全设置中选择 SSH 公匙,打开码云 SSH 公钥管理页面 [https://gitee.com/profile/sshkey](https://gitee.com/profile/sshkeys)
填写公匙标题(用于区分多个公匙):
- yourname's SSH key
粘贴公钥:
将你电脑的公匙粘贴进公匙中:

添加 SSH 公匙后按确定。
回到 本机 Git Bash 中输入:
```
ssh -T git@gitee.com
```
如果有弹出询问,输入 yes
若返回:Welcome to Gitee.com, YourGiteeName!
则证明 SSH 公匙添加成功。
码云中可以添加多个公匙,这样就可以在多个个人终端访问码云
## **四、初始化 Git**
本地 git 客户端需要配置用户名和邮箱地址。用户每次用 git 提交代码时都会记录用户名和邮箱。需要执行下面两条命令:
```
git config --global user.name "yourname"
git config --global user.email youremail@xxx.com
```
- yourname 是你的名字或昵称
- youremail@xxx.com 是你注册 Gitee 的邮箱
查看用户名和密码
```
git config user.name
git config user.email
```
## **五、在 VSCode 实现代码管理**
### 1、Git 工作流
Git 最核心的一个概念就是**工作流** 。在工作流中有三个区域:
- **仓库区(Repository)** ,分为本地仓库和远程仓库。**_本地仓库_**就是用来管理版本库的一些文件组成,里面记录了配置信息,当前状态数据,以及版本记录等数据。**_远程仓库_**一般是第三方机构提供的 Git 仓库托管服务平台,例如 Github、Gitee,相当于我们使用别人的 Git 服务器(当然我们也可以自己搭建服务器充当版本库的载体,但是这样成本高,管理复杂)。
- **工作区(Workspace)** 是本地电脑中实际的项目文件目录。开辟本地仓库后,在当前目录中一系列操作都可以看作是对工作区的操作,Git 的管理并记录操作引起的变动。
- **暂存区(Index)** 类似于缓存区域,临时保存你的改动。暂存区对工作空间的修改还没提交到本地仓库时的数据进行一个暂存,可以随时的回退到未修改前的状态。

由上面的定义可知,本地电脑上的项目包含"本地仓库"和"工作区"两个部分,本地仓库中记录了工作区的版本信息和变更信息,以及系统配置信息。
而远程仓库是本地仓库的副本,或者反之,两者可以通过提交、克隆、拉取等方式同步,也可以建立不同的分支。
如果我们假设一种最简单的应用场景,也就是远程仓库是本地仓库的副本,并且没有项目分支,那么根据本地工作区建立的方式不同,有 3 种工作流程。
### 2、原始项目的仓库和工作区在本地电脑创建,然后提交推送到远程仓库。
这种工作流的一般步骤如下:
在本地电脑创建目录(全英文路径),如 GitTaskA,目录内为空。

在目录中文件夹空白处,单击右键选择 Git Bash Here(如果是 win11,需要在右键菜单选择显示更多选项才能看到 Git Bash Here 菜单项)

在 git bash 中使用 git init 命令初始化本地仓库,初始化成功后会提示:Initialized empty Git repository in G:/Gitee_Warehouse/GitTaskA/.git/
```
#在当前本地电脑目录中新建一个Git代码库
git init
```

这时文件夹中出现了.git 隐藏只读文件夹,也就是本地仓库。但是作为工作区的 GitTaskA 仍为空的。
这时我们有两种选择,一种是在本地工作区建立并编辑文档,然后再与远程仓库关联;另一种是直接再远程仓库初始化仓库结构,然后在本地关联远程仓库,并从远程仓库拉取仓库内容。
以在本地工作区建立并编辑文档为例,我们首先在 git bash 中输入 touch 命令建立文件:
```
touch README.md
```
在 Window 工作区目录中,出现新建的文件 README.md

然后在 Git Bash 中输入命令,将本地新建的 README.md 文件加入仓库的 index 索引中,也就是将该文件添加到暂存区。
```
git add README.md
```
文件暂存没有提示。下一步我们可以将暂存的文件提交到本地仓:
```
git commit -m "first commit"
```
(双引号中的"first commit"是提交文件时保留的"消息",保存为日志,用于了解操作的目的和内容)。
提交完成后提示信息如下:

需要注意,我们当前的所有操作均只在本地工作区和本地仓库完成,因此当我们需要建立远程备份时,需要跟远程仓库关联。
首先,我们在 Gitee 自己的账户下建立一个新的空白远程关联仓库。在右上角选择新建仓库:

输入仓库名称

复制新建仓库的地址

在本地仓库的 Git Bash 输入命令,将本地仓库关联到新建立的远程仓库
```
git remote add origin https://gitee.com/harbin-university-electronics/gittaska.git
```
这步操作由于只是关联,所以没有现象

下面将本地暂存的 README.md 推送到远程仓库:
```
git push -u origin master
```

此时我们打开 Gitee 中新建的 GitTaskA 仓库,其中增加了 README.md 文件,完成了对本地仓库的镜像。

打开 Gitee 网站中的远程仓库后,我们发现仓库中显示有 1 次提交。提交的文件就是 README.md。当然此时文件是空的,我们可以选择在网站在线编辑,或者在本地电脑编辑后推送的远程仓库。
推送的过程可以使用 Git Bash,也可以使用具有 Git 管理功能的文档编辑器,例如 VSCode。由于 VSCode 可以将编程的大部分工作流汇集在一起,在统一的环境下完成:程序编辑、编译、运行、调试、Git 项目管理等大部分工作,因此我们推荐使用 VSCode 来进行 Git 管理。下面的文件版本管理均采用 VSCode 演示完成。
首先我们用 VSCode 打开 GitTaskA 文件夹。可以在 VSCode 的文件菜单中选择打开文件夹,也可以在 Windows 的文件资源管理器中,在 GitTaskA 文件夹上单击右键,选择"通过 Code 打开"。

打开 GitTaskA 文件夹后,VSCode 的左侧文件列表框中显示当前目录下的所有文件,双击 READMD.md 可以编辑文件。

编辑空白的 README 文件如下:

文件名称标签上出现圆点,说明文件被修饰过。同时注意文档按钮和 Git 按钮同时出现数字 1,表示 1 个文档被修改,Git 需要暂存和提交一个文件。此时我们单击 Git 按钮,进入 Git 管理。

点击 1,进入 Git 管理,然后在 2 位置单击右键,选择暂存所有更改,这个操作等同于"git add ."命令。

在源代码管理的消息栏中输入本次操作的“消息”作为日志,然后在提交按钮右侧选择下拉按钮,单击其中的"提交和推送"。

当提交完毕后,文档按钮和 Git 源代码管理按钮上的数字 1 消失,表明没有文件更新。

回到 Gitee 网站,打开 GitTaskA 仓库,可以看到远程的 README.md 文件得到同步更新。

现在我们在网站中完成在线编辑,点击仓库中的 READMD.md 文档,将其打开。然后单击文档右上角的编辑:

该文件是 MarkDown 格式文件,大家可以按照 MarkDown 标准来进行编辑操作。
这里在文本中添加”在线编辑“。

然后点击左侧提交,然后点击"更改"旁边的+,暂存所有更改。

然后输入提交信息后,点击下方的提交按钮

提交完毕后,单击右上角的“在仓库中打开”,即可看到效果。

当远程仓库发生变更后,本地仓库需要拉取“git pull”来实现与远程仓库的同步。

点击同步更改,可以从远程端拉取 2 个提交(数字 2 表示远程端得到 2 次提交)。
拉取操作后,本地工作区和本地仓库与远程端保持一致。

在本节中涉及到 Git Bash 的操作,其实都可以在 VSCode 中完成。一种方式是在 VSCode 终端中打开 Git Bash,就可以直接使用 git 命令行。另一种是通过 VSCode 的 Git 扩展,通过文档窗格操作,大家在熟悉 VSCode 工作环境和 Git 的基本操作后会慢慢熟悉。
### 3、克隆他人的仓库到本地
用户可以从云服务器上托管的远程仓库 clone 克隆代码,在自己电脑建立本地副本,也可以将远程仓库的项目代码 Fork 到自己的云服务器远程托管仓库中,建立项目分支,然后再将自己 fork 的分支代码 clone 克隆到本地编辑。(fork 操作一般由远程仓库的托管平台完成,平台只是将原始仓库代码在你的仓库建立了副本,fork 的代码仍在托管平台上,本地计算机并没有对分支做修改操作)
```
# 从远程仓库下载一个项目和它的整个代码历史到本地电脑中
$ git clone [远程仓库链接]
```
当我们在 clone 克隆到本地的项目中完成设计工作后,需要将本地仓库 repository 的代码 push 到 Remote 远程仓库。
克隆工作流如下:
- 在你的电脑中建立项目文件夹,作为工作区。例如:Embedded_operating_system_course_FreeRTOS
- 克隆工程
在资源管理器的 Embedded_operating_system_course_FreeRTOS 文件夹空白处中单击右键选择 Git Bash Here(如果是 win11,需要在右键菜单选择显示更多选项才能看到 Git Bash Here 菜单项)


弹出 Git Bash 控制台

在 Git 托管网站找到你要克隆的工程,选择克隆,然后点击复制

在 本地电脑的 Git Bash 中输入你要克隆的工程链接(输入 git clone,然后右键粘贴刚才从码云上复制的链接)

- VSCode 编辑工程文档
用 VSCode 打开 Embedded_operating_system_course_FreeRTOS 文件夹(文件->打开文件夹;或者在资源管理器中的文件夹上单击右键,选择使用 VSCode 打开),在左侧文件夹中的文件列表中选择文件打开编辑。

- 拉取最新代码
在 VSCode 中,选择边条工具中的源代码管理图标
然后在源代码管理右侧,单击…,选择拉取

- 推送更新到 master 分支
- \*\*\*(下面的推送操作只能用于自己管理的仓库,克隆仓库只有通过代码评审后,才能合并到目标分支中)
需要上传自己的代码时,先要将更改保存到硬盘。
然后选择源代码管理图标打开源代码管理面板。
在更改菜单选择下方需要更改的文件,单击+号,加入暂存;

在消息框中输入对修改内容的说明,然后按 Ctrl+Enter 提交,提交到主分支

在源代码管理右侧点击…,然后选推送。

### 4、 Fork 分支一个项目
如果是参加学校的学习,可以找到对应的项目在右上角选择 Fork,将其克隆到自己的账户内,建立分支,然后 clone 到你的电脑中修改和编辑,并在完成后推送回码云上。除了 Fork 动作,其他操作参考 Clone 工作流。
## **附录:Git 操作(初学者可以跳过此段)**
##### **初始化 Git**
首先,你需要执行下面两条命令,作为 git 的基础配置,作用是告诉 git 你是谁,你输入的信息将出现在你创建的提交中。
- git config --global user.name yourname # "你的名字或昵称"
- git config --global user.email youremail@xxx.com # "你的邮箱"
##### **创建版本库**
[本段内容大部分引用自廖雪峰的官方网站 创建版本库](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256916071d599b3aed534aaab22a0db6c4e07fd0000)
什么是版本库呢?版本库又名仓库,英文名 repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录 YourProjName(名字任意):
- cd /e/
- mkdir YourProjName
- cd YourProjName
如果你使用 Windows 系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。
第二步,通过 git init/span>`命令把这个目录变成 Git 可以管理的仓库:
- git init
git 操作完成后会提示:Initialized empty Git repository in x:/YourProjName/.git/
瞬间 Git 就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个 `.git`的目录,这个目录是 Git 来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把 Git 仓库给破坏了。
##### **关联**
[本段内容大部分引用自码云平台帮助文档 V1.2 Git 常用命令与名词解释](http://git.mydoc.io/?t=180691)
把一个本地仓库与一个云端 Gitee 仓库关联。
项目地址形式为:https://gitee.com/YourGiteeName/YourProjName.git或者git@gitee.com:YourGiteeName/YourProjName.git
- git remote add origin https://gitee.com/YourGiteeName/YourProjName.git
如果只是需要使用 vscode 管理,到这里就可以直接跳到本文最后一段【**在\*\***VSCode\***\*实现代码管理**】去看了
---
下面接着讲 git 命令行其他操作
其中代表的是你远程的仓库,习惯如此命名,可以通过命令 git remote -v 查看
- git remote -v
- #origin https://gitee.com/YourGiteeName/YourProjName.git (fetch)
- #origin https://gitee.com/YourGiteeName/YourProjName.git (push)
如果你想克隆一个项目,只需要执行:
- git clone <项目地址>
##### **同步(拉取)**
同步,也可以称之为拉取,在 Git 中是非常频繁的操作,和 SVN 不同,Git 的所有仓库之间是平等的,所以,为了保证代码一致性,尽可能的在每次操作前进行一次同步操作,具体的为在工作目录下执行如下命令:
- git pull origin master
master 是分支名,如果你本地是其他分支,请换成其他分支的名字,另,因为远程仓库与你本地仓库可能存在冲突,故当存在冲突时,请参考进阶篇的如何处理冲突
查看文件夹,会发现 Gitee 仓库上 README.md 文件被下载回来了。
##### **提交**
git 作为支持分布式版本管理的工具,它管理的库(repository)分为本地库、远程库。
这里我们把 add(暂存)、提交(commit)、推送(push),放到一起说,因为每次上传代码都需要执行这三步(关于冲突处理、分支合并等以后用到了再研究,本文只说基础部分)。
- git add # 加入到暂存区
- git commit # 提交到本地库
- git push # 发送给远程库
首先,我们打开 **README.md** ,在里面稍稍加上几个字,保存。这样文件就做了修改。
再来查看 git 状态
git status
- #On branch master
- #Changes not staged for commit:
- #(use "git add ``..." to update what will be committed)
- #use "git checkout --``..." to discard changes in working directory)
- #modified: README.md
- #no changes added to commit (use "git add" and/or "git commit -a")
会提示你 modified: README.md,意思是这个文件被修改了。no changes added to commit 是说目前暂时没有文件放到暂存区。
所以我们将文件加入暂存区。
git add -A
-A 表示将所有文件的修改,文件的删除,文件的新建,都添加到暂存区。
然后提交到本地库,并附加注释。
- git commit -m "第一次提交"
- #[master 1cc3dd5] 第一次提交
- #1 file changed, 1 insertion(+), 1 deletion(-)
-m 后面的是本次提交的说明,通常可以备注你改了什么,便于以后翻看历史记录时,能直观知道这是哪个版本,这个版本改了些什么东西。
最后推送到远程库,也就是 Gitee 上的项目里。
- git push origin master
- #Counting objects: 3, done.
- Writing objects: 100% (3/3), 297 bytes | 297.00 KiB/s, done.
- #Total 3 (delta 0), reused 0 (delta 0)
- #To https://gitee.comYourGiteeName/YourProjName.git
- #5464c11..1cc3dd5 master -> master
##### **Git Gui**
上面说的都是代码上的操作,实际上安装完 Git 之后,也有 GUI 界面可以直接使用。
打开 Git Gui,选择 Open Existing Repository,找到刚刚创建的本地库打开。
界面比简单,只有几个按钮:
Rescan 检查仓库中文件状态; Stage Changed 就是 add 暂存; Commit、Push 就是提交、推送。
注:如果发现中文乱码,我们修改一下配置文件编码,改为 utf-8 就好了
git config --global gui.encoding utf-8