|
@ -1,10 +1,21 @@
|
||||||
# Git 使用说明
|
# Git 使用说明
|
||||||
|
|
||||||
- [Git 使用说明](#git-使用说明)
|
- [Git 使用说明](#git-使用说明)
|
||||||
- [1. 初始配置](#1-初始配置)
|
- [1. 认识 Git](#1-认识-git)
|
||||||
- [1.1. Git 初始配置](#11-git-初始配置)
|
- [1.1. Git 及版本管理工具所要解决的问题](#11-git-及版本管理工具所要解决的问题)
|
||||||
- [1.2. Git 与 SSH](#12-git-与-ssh)
|
- [1.1.1. 软件版本跟踪](#111-软件版本跟踪)
|
||||||
- [1.3. Git 代理设置](#13-git-代理设置)
|
- [1.1.2. 项目资源备份及集中管理](#112-项目资源备份及集中管理)
|
||||||
|
- [1.1.3. 多人协作](#113-多人协作)
|
||||||
|
- [1.1.4. 质量管理](#114-质量管理)
|
||||||
|
- [1.2. Git 及 GitHub 类服务器系统](#12-git-及-github-类服务器系统)
|
||||||
|
- [2. Git 的安装及配置](#2-git-的安装及配置)
|
||||||
|
- [2.1. Git 的安装和配置](#21-git-的安装和配置)
|
||||||
|
- [2.1.1. Git 的安装](#211-git-的安装)
|
||||||
|
- [2.1.2. Git 初始配置](#212-git-初始配置)
|
||||||
|
- [2.1.3. Git 与 SSH](#213-git-与-ssh)
|
||||||
|
- [2.1.4. Git 代理设置](#214-git-代理设置)
|
||||||
|
- [2.2. TortoiseGit 的安装和配置](#22-tortoisegit-的安装和配置)
|
||||||
|
- [3. Git 的使用](#3-git-的使用)
|
||||||
- [2. 创建仓库](#2-创建仓库)
|
- [2. 创建仓库](#2-创建仓库)
|
||||||
- [3. 添加跟踪文件](#3-添加跟踪文件)
|
- [3. 添加跟踪文件](#3-添加跟踪文件)
|
||||||
- [4. 取消跟踪文件](#4-取消跟踪文件)
|
- [4. 取消跟踪文件](#4-取消跟踪文件)
|
||||||
|
@ -34,13 +45,120 @@
|
||||||
- [16.6. 删除 Submodule](#166-删除-submodule)
|
- [16.6. 删除 Submodule](#166-删除-submodule)
|
||||||
- [16.7. 修改 Submodule](#167-修改-submodule)
|
- [16.7. 修改 Submodule](#167-修改-submodule)
|
||||||
- [17. 环境变量](#17-环境变量)
|
- [17. 环境变量](#17-环境变量)
|
||||||
- [17.1. GIT_TERMINAL_PROMPT](#171-git_terminal_prompt)
|
- [17.1. GIT\_TERMINAL\_PROMPT](#171-git_terminal_prompt)
|
||||||
- [18. 清理本地仓库](#18-清理本地仓库)
|
- [18. 清理本地仓库](#18-清理本地仓库)
|
||||||
|
- [19. Git 服务器](#19-git-服务器)
|
||||||
|
- [Gitea 的下载和安装](#gitea-的下载和安装)
|
||||||
|
- [管理界面概览](#管理界面概览)
|
||||||
|
- [用户界面概览](#用户界面概览)
|
||||||
|
- [创建组织](#创建组织)
|
||||||
|
- [创建仓库](#创建仓库)
|
||||||
|
- [克隆仓库到本地](#克隆仓库到本地)
|
||||||
|
- [推送变更](#推送变更)
|
||||||
|
- [推送审批](#推送审批)
|
||||||
|
- [版本发布](#版本发布)
|
||||||
|
- [创建 Issue](#创建-issue)
|
||||||
|
- [分支管理](#分支管理)
|
||||||
- [19. 外部参考资料](#19-外部参考资料)
|
- [19. 外部参考资料](#19-外部参考资料)
|
||||||
|
|
||||||
## 1. 初始配置
|
## 1. 认识 Git
|
||||||
|
|
||||||
### 1.1. Git 初始配置
|
## 1.1. Git 及版本管理工具所要解决的问题
|
||||||
|
|
||||||
|
黑格尔曾经说过:“凡是现实的东西都是合乎理性的”,即人们常说的“存在即合理”。
|
||||||
|
|
||||||
|
但对于很多开发人员而言,即便是不使用版本管理工具也能完成项目的开发工作。那么版本管理工具合理存在的意义是什么,使用版本管理工具又能够带来哪些好处呢?
|
||||||
|
|
||||||
|
结合本人使用版本管理工具的经验,将使用版本工具所带来的好处归纳为以下四点:
|
||||||
|
|
||||||
|
1. 软件版本跟踪
|
||||||
|
2. 项目资源备份及集中管理
|
||||||
|
3. 多人协作
|
||||||
|
4. 质量管理
|
||||||
|
|
||||||
|
## 1.1.1. 软件版本跟踪
|
||||||
|
|
||||||
|
任何一个开发项目,都必然是一个逐步成熟的过程。从第一行代码到第一个能跑通的程序,是一个渐进的流程。当系统成熟后,依然可以继续可以得到优化和扩展,功能及性能上的改进。这就导致软件、硬件或嵌入式等项目的过程中可以建立多个版本,甚至是在第一个正式版本建立以前就需要对开发过程进行跟踪。
|
||||||
|
|
||||||
|
在没有版本管理工具的情况下,人们最常使用的方法就是当到达一个开发节点后就建立一个文件夹或者压缩包,用以保存当前的开发进度。当我们之前某个开发并验证过的功能在后续开发过程中发现功能异常后,就可以使用之前备份的版本进行对比验证,甚至是比较源码以便快速定位问题。
|
||||||
|
|
||||||
|
这样做的缺陷很明显,首先每次都要备份完整的开发进度,会导致硬盘资源的极大浪费。其次多个压缩包或者文件夹容易导致混乱,随着项目版本的增加很难判断哪个压缩包对应了哪个版本。我们不得不为每个压缩包写下一个注释来表明该阶段实现了哪些功能。
|
||||||
|
|
||||||
|
当一个项目成熟后,人们很可能需要在其基础上实现不同的功能改进。比如我们造了一架陆基飞机,然后要在其基础上改进出一架能够在航母上起飞的飞机。这时候最好的办法是生成两个项目分支,然后在每个分支上分别进行改进,并将共通的改进平移到另一个分支里,以保证相同的项目质量。使用传统的“备份式”版本管理,将会带来一个糟糕的体验。
|
||||||
|
|
||||||
|
当项目发布后,并且有多个版本进入到市场后,一旦发现了某些问题,就需要回溯到对应的版本上进行问题排查。此时需要在众多压缩包中找到对应的版本进行解压,这是一个枯燥且繁琐的过程。如果想让这个过程容易些,就需要建立一张表格,来明确不同的版本对应哪个压缩包。不是之前累一些,就是之后累一些。
|
||||||
|
|
||||||
|
因此,人们不是没有使用版本管理,只是一致以一种比较简单粗暴的方式在潜移默化的进行管理。
|
||||||
|
|
||||||
|
使用版本管理工具会优化这个过程,只需要建立一个文件夹就可以对该文件下面的工程文件进行管理和跟踪,并且每次生成的“跟踪备份”都是基于与上次备份的差异,这就极大减小硬盘空间的占用。
|
||||||
|
|
||||||
|
版本管理工具能够提供历史查看、版本比较,分支比较,以及检出功能,这样就可以快速了解每次提交版本的状态,每个项目分支的差异。当每次提交版本时,是一个自动化的过程,可以减少开发人员的工作量。
|
||||||
|
|
||||||
|
## 1.1.2. 项目资源备份及集中管理
|
||||||
|
|
||||||
|
传统的“压缩备份”式版本管理的另一个缺陷是它极大的依赖于某台计算机,一旦计算机出现问题就意味着重要资产的损毁。因此开发人员需要定期的将众多“备份”拷贝到某台服务器中,这依然是一个人工过程。
|
||||||
|
|
||||||
|
并且,服务器管理的好坏依赖于管理人员自身的能力,想要管理得好,也需要占用管理人员的大量精力。
|
||||||
|
|
||||||
|
版本管理工具提供了服务器工具,并且基于 Git 系统的服务器有很好的 Web 管理界面和开发模型可以遵照,在本文的 Git 服务器部分将会看到目前最常用的 Git 管理模型和用法,以及它的优势。
|
||||||
|
|
||||||
|
## 1.1.3. 多人协作
|
||||||
|
|
||||||
|
一个小的项目通常可以一个人独立完成。一个大的可以被拆分成多个独立小项目的工程也可以分配给不同的人独立完成,但另外一些项目则往往需要两个以上的人协同工作。
|
||||||
|
|
||||||
|
以较为人知的 Linux 内核项目为例,在 2002 年以前,世界各地的志愿者把源代码文件通过 Diff 的方式发给 Linus,然后由 Linus 本人通过手工方式合并代码!Linux 内核项目当时使用此方式有一些特定的历史原因,但从其过程中不难发现这个过程依然是一个人工过程,且容易在合并过程中出现问题。
|
||||||
|
|
||||||
|
TODO: 提供一个 Diff 截图。
|
||||||
|
|
||||||
|
Git 类版本管理工具的另一个好处就是支持多个人向同一项目提交版本,如果版本不存在差异则自动合并,如果版本存在差异才需要人工介入选择需要正式合并的代码。
|
||||||
|
|
||||||
|
## 1.1.4. 质量管理
|
||||||
|
|
||||||
|
前面提到,一个项目、产品的开发过程是逐步成熟的。事实上,不仅在其开发过程中,即便在产品上市后,也有可能存在改进和升级。甚至在量变引起质变后演变成新一代产品。
|
||||||
|
|
||||||
|
甚至是对产品不同的改进产生不同的子代产品,比如陆基飞机和航母飞机的例子。
|
||||||
|
|
||||||
|
这就需要在研发以及整个产品生命周期,及其子系中进行版本管理。使得产品更加稳定和成熟,具备不同的功能和优化,从而获得更高的产品质量。
|
||||||
|
|
||||||
|
在这个过程中,如果不进行版本管理,就如同每次重新造轮子,那么,此次造新轮子的过程中都有可能出现不同的问题,使得产品质量不容易稳定下来。
|
||||||
|
|
||||||
|
在一个开发团队中,有产品经理,项目主管、以及开发人员,每个角色对项目的质量都会有不同的需求,以软件开发为例在开发人员进行版本代码提交时,有可能经历一个代码评审的流程。版本管理工具能够方便的实现这个过程,使其在评审过程中及时发现问题,并更好的满足多个角度的开发需求,进而提升开发质量。
|
||||||
|
|
||||||
|
TODO: 提供 Gitea 代码评审截图。
|
||||||
|
|
||||||
|
## 1.2. Git 及 GitHub 类服务器系统
|
||||||
|
|
||||||
|
实际上,Git 正是 Linux 内核项目的一个派生项目,就是为了解决 Linux 内核开发管理所诞生的工具。它非常好用且开源,因此被广泛使用且变得越来越流行。
|
||||||
|
|
||||||
|
2008 年 2 月,一个名为 GitHub 的网站开始上线,4 月其发布了正式版本。这个网站迅速的火了起来,之后更扩大为“全球最大的男性交友平台”,因为有数据统计,其 95% 的使用者均为男性。很快在国内就有了模仿其模式的网站,如 Gitee 和 Coding 等。之后更是诞生了很多类似 GitHub 的服务器软件,比如 Gitlab 和 Gitea。目前许多公司都在使用这类服务,或者使用 Gitlab 构建自己的服务器。
|
||||||
|
|
||||||
|
GitHub 实际上就是一个 Git 服务器。Git 使一个分布式版本管理工具,这意味着即便不使用服务器也可以进行本地化的版本管理。但是当人们需要进行多人协作开发,工程文件备份和管理以及其他一些便利实用的扩展功能时就必然用到 Git 服务器了。
|
||||||
|
|
||||||
|
在 GitHub 诞生之前已经有很多 Git 服务器软件了,实际上使用 Git 自身的命令行工具就可以实现 Git 服务器的搭建。另外还有 Gerrit 基于 Web 的 Git 服务器系统。GitHub 具备很好的操作界面,简单易用,并且提供了有 Issue 系统来讨论需求和问题,最后,它提供了 Wiki 和版本发布系统。
|
||||||
|
|
||||||
|
接下来我们看看如何安装和使用 Git 及 Git 服务器。
|
||||||
|
|
||||||
|
## 2. Git 的安装及配置
|
||||||
|
|
||||||
|
我们可以到 [Git 官方网站](https://git-scm.com/) 下载最新版本的 Git 版本管理工具,它支持 Windows/Linux/Mac 等多个系统平台。
|
||||||
|
|
||||||
|
![Git 官网](./img/Git_使用说明/git-official.png)
|
||||||
|
|
||||||
|
官网下载的 Git 实际上只是一组命令行工具,但许多开发工具中已经将其进行了集成,比如 QtCreator 和 VSCode,VScode 下除自身的 Git 功能外,还具有很多优秀的插件。
|
||||||
|
|
||||||
|
另外,官网也推荐了许多优秀的 Git GUI 前端程序:
|
||||||
|
|
||||||
|
![Git GUI 前端](./img/Git_使用说明/git-gui-client.png)
|
||||||
|
|
||||||
|
推荐在 Windows 平台上通过 VSCode 来使用 Git 或者使用 [TortoiseGit](https://tortoisegit.org/download/) 工具。
|
||||||
|
|
||||||
|
### 2.1. Git 的安装和配置
|
||||||
|
|
||||||
|
#### 2.1.1. Git 的安装
|
||||||
|
|
||||||
|
![Git 的安装](./img/Git_使用说明/install-git.gif)
|
||||||
|
|
||||||
|
#### 2.1.2. Git 初始配置
|
||||||
|
|
||||||
在使用 Git 前需要配置好用户名和电子邮件信息,Git 需要使用这些配置信息用于提交代码。在 Git 命令行下,可以使用如下命令设置用户名和电子邮件信息:
|
在使用 Git 前需要配置好用户名和电子邮件信息,Git 需要使用这些配置信息用于提交代码。在 Git 命令行下,可以使用如下命令设置用户名和电子邮件信息:
|
||||||
|
|
||||||
|
@ -68,7 +186,9 @@ git config --global http.sslVerify "false"
|
||||||
git config --global http.postBuffer 524288000
|
git config --global http.postBuffer 524288000
|
||||||
```
|
```
|
||||||
|
|
||||||
### 1.2. Git 与 SSH
|
![Git 的配置](./img/Git_使用说明/config-git.gif)
|
||||||
|
|
||||||
|
#### 2.1.3. Git 与 SSH
|
||||||
|
|
||||||
如果想访问远程 Git 服务器,则最好通过 SSH 方式。这需要先生成 RSA 密钥,然后将公钥部署到远程服务器上即可。生成 RSA 密钥可使用 OpenSSH,命令如下(Windows 下该命令位于 /\<git 安装目录\>/usr/bin/ 下,可使用 Git Bash 直接访问):
|
如果想访问远程 Git 服务器,则最好通过 SSH 方式。这需要先生成 RSA 密钥,然后将公钥部署到远程服务器上即可。生成 RSA 密钥可使用 OpenSSH,命令如下(Windows 下该命令位于 /\<git 安装目录\>/usr/bin/ 下,可使用 Git Bash 直接访问):
|
||||||
|
|
||||||
|
@ -78,17 +198,14 @@ ssh-keygen -t ecdsa
|
||||||
|
|
||||||
**注意:新版本 Windows10 及以上系统不再支持 RSA 算法,必须通过 ssh-keygen 的 -t 参数指定另外的算法,否则无法正常克隆/提交代码等。**
|
**注意:新版本 Windows10 及以上系统不再支持 RSA 算法,必须通过 ssh-keygen 的 -t 参数指定另外的算法,否则无法正常克隆/提交代码等。**
|
||||||
|
|
||||||
之后一路回车,生成文件为:
|
该命令将在用户目录下的 .ssh 目录下(Windows 用户目录为:C:\Users\\<UserName\>\, Linux 在 /home/\<User\>)生成两个密钥文件:id_ecdsa 和 id_ecdsa.pub,其中 id_ecdsa 为私钥文件,存储在本地计算机中以便使用,id_ecdsa.pub 为公钥文件,需要将其内容拷贝到 Git 服务器上使用。
|
||||||
|
|
||||||
```bash
|
![生成 SSH 密钥](./img/Git_使用说明/make-ecdsa.gif)
|
||||||
<Usr>/.ssh/id_rsa
|
|
||||||
<Usr>/.ssh/id_rsa.pub
|
|
||||||
```
|
|
||||||
|
|
||||||
其中 id_rsa 为私钥,id_rsa.pub 为公钥,将公钥中的内容拷贝到远程服务器中对应的设置项中即可。
|
|
||||||
|
|
||||||
TortoiseGit 需要额外修改 Settings->Network->SSH 为 C:\Windows\System32\OpenSSH\ssh.exe 才可以通过 OpenSSH 密钥来访问服务器。否则默认使用 PuTTY 格式密钥。
|
TortoiseGit 需要额外修改 Settings->Network->SSH 为 C:\Windows\System32\OpenSSH\ssh.exe 才可以通过 OpenSSH 密钥来访问服务器。否则默认使用 PuTTY 格式密钥。
|
||||||
|
|
||||||
|
![配置 TortoiseGit 的 SSH 工具](./img/Git_使用说明/config-tortoisegit-ssh-tool.gif)
|
||||||
|
|
||||||
当出现类似以下错误时:
|
当出现类似以下错误时:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
@ -101,7 +218,7 @@ Clone: exit status 128 - fatal: unable to access 'xxxxxxxxx.git/': SSL certifica
|
||||||
git config --global http.sslVerify false
|
git config --global http.sslVerify false
|
||||||
```
|
```
|
||||||
|
|
||||||
### 1.3. Git 代理设置
|
#### 2.1.4. Git 代理设置
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 设置 Git 全局代理
|
# 设置 Git 全局代理
|
||||||
|
@ -130,6 +247,20 @@ git config --global --unset http.https://github.com.proxy
|
||||||
proxy = socks5://<proxy addr>:<port>
|
proxy = socks5://<proxy addr>:<port>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 2.2. TortoiseGit 的安装和配置
|
||||||
|
|
||||||
|
![TortoiseGit 的安装](./img/Git_使用说明/install-tortoisegit.gif)
|
||||||
|
|
||||||
|
![TortoiseGit 的配置](./img/Git_使用说明/config-tortoisegit.gif)
|
||||||
|
|
||||||
|
## 3. Git 的使用
|
||||||
|
|
||||||
|
本节基于 VSCode 对 Git 的使用进行讲解。TortoiseGit 的使用方法与之类似。
|
||||||
|
|
||||||
|
虽然 VSCode 本身已经支持了 Git,但依然推荐安装两个插件:Git History 和 GitLens。这两个插件使得 Git 功能更加易用,且使用频率很高。
|
||||||
|
|
||||||
|
![VSCode 的 Git 插件](./img/Git_使用说明/git-plugin-for-vscode.png)
|
||||||
|
|
||||||
## 2. 创建仓库
|
## 2. 创建仓库
|
||||||
|
|
||||||
软件版本管理依赖于软件仓库的概念,一个软件仓库包容了要进行版本管理的源码和 Release 发布等内容。
|
软件版本管理依赖于软件仓库的概念,一个软件仓库包容了要进行版本管理的源码和 Release 发布等内容。
|
||||||
|
@ -142,6 +273,12 @@ git init
|
||||||
|
|
||||||
命令,可完成软件版本仓库的创建操作,在创建完软件仓库后,该目录下会生成一个名为“.git”的隐藏文件夹,该文件夹下保存了软件的历史和分支等版本信息,通常不需要直接操作该目录。
|
命令,可完成软件版本仓库的创建操作,在创建完软件仓库后,该目录下会生成一个名为“.git”的隐藏文件夹,该文件夹下保存了软件的历史和分支等版本信息,通常不需要直接操作该目录。
|
||||||
|
|
||||||
|
![创建 Git 仓库](./img/Git_使用说明/init-git-repo.gif)
|
||||||
|
|
||||||
|
在创建完 Git 仓库后,使用 Git History 插件提供的 Git History 命令,可以查看 Git 仓库的版本历史,此时内容为控,因为我们还没有提交过任何代码。
|
||||||
|
|
||||||
|
更多的情况下,我们使用 Git 服务器来创建 Git 仓库,然后克隆到本地计算机中,此时不再需要手动初始化。
|
||||||
|
|
||||||
## 3. 添加跟踪文件
|
## 3. 添加跟踪文件
|
||||||
|
|
||||||
版本仓库所在文件夹下的文件并不是全部都会被 git 跟踪和管理。如果需要将该文件夹下将某个文件纳入到版本管理中,则需要通过 add 命令添加到 git 仓库中进行跟踪:
|
版本仓库所在文件夹下的文件并不是全部都会被 git 跟踪和管理。如果需要将该文件夹下将某个文件纳入到版本管理中,则需要通过 add 命令添加到 git 仓库中进行跟踪:
|
||||||
|
@ -626,6 +763,40 @@ GIT_TERMINAL_PROMPT=1
|
||||||
git clean -ifdx
|
git clean -ifdx
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 19. Git 服务器
|
||||||
|
|
||||||
|
本文推荐使用 Gitea 来搭建私有 Git 服务器,这是一个基于 Web 的开源 Git 服务器程序,比 Gerrit 更加易用,且比 GitLab 更新更快,具有更丰富的功能。
|
||||||
|
|
||||||
|
### Gitea 的下载和安装
|
||||||
|
|
||||||
|
可以到 [Gitea 官网](https://about.gitea.com/products/gitea) 下载 Gitea 的最新版本,Gitea 支持 Windows、Linux 和 Mac 系统以及 x86 和 ARM 架构。
|
||||||
|
|
||||||
|
![Gitea 的下载](img/Git_使用说明/gitea-official.png)
|
||||||
|
|
||||||
|
在 Windows 系统下运行 Gitea 非常容易,只需要双击运行即可,Gitea 也支持以服务的形式运行。初次运行时需要对 Gitea 服务器进行简单的配置,包括数据库系统和管理员账户。推荐使用 MySQL 类数据库系统,本文以 SQLite 为例进行讲解,因为 SQLite 的配置比较简单。
|
||||||
|
|
||||||
|
![Gitea 的安装和初始化](img/Git_使用说明/install-init-gitea.gif)
|
||||||
|
|
||||||
|
### 管理界面概览
|
||||||
|
|
||||||
|
### 用户界面概览
|
||||||
|
|
||||||
|
### 创建组织
|
||||||
|
|
||||||
|
### 创建仓库
|
||||||
|
|
||||||
|
### 克隆仓库到本地
|
||||||
|
|
||||||
|
### 推送变更
|
||||||
|
|
||||||
|
### 推送审批
|
||||||
|
|
||||||
|
### 版本发布
|
||||||
|
|
||||||
|
### 创建 Issue
|
||||||
|
|
||||||
|
### 分支管理
|
||||||
|
|
||||||
## 19. 外部参考资料
|
## 19. 外部参考资料
|
||||||
|
|
||||||
1. [Pro Git](https://git-scm.com/book/zh/v2)
|
1. [Pro Git](https://git-scm.com/book/zh/v2)
|
||||||
|
|
After Width: | Height: | Size: 1.6 MiB |
After Width: | Height: | Size: 909 KiB |
After Width: | Height: | Size: 1.5 MiB |
After Width: | Height: | Size: 695 KiB |
After Width: | Height: | Size: 421 KiB |
After Width: | Height: | Size: 163 KiB |
After Width: | Height: | Size: 192 KiB |
After Width: | Height: | Size: 404 KiB |
After Width: | Height: | Size: 552 KiB |
After Width: | Height: | Size: 5.5 MiB |
After Width: | Height: | Size: 924 KiB |
After Width: | Height: | Size: 498 KiB |