---
title: Git版本控制工具的使用
date: 2020-12-12 14:03:13
tags:
- Git
- 版本控制
categories:
- 工具使用
---

## 版本控制概述

版本控制是实现开发团队**并行开发、提高开发效率**的基础。其目的在于对软件开发进程中文件或目录的发展过程提供有效的追踪手段，保证在需要时可回到旧的版本，避免文件的丢失、修改的丢失和相互覆盖，通过对版本库的访问控制避免未经授权的访问和修改，达到有效保护企业软件资产和知识产权的目的。

<!--more-->

版本控制的功能在于跟踪记录整个软件的开发过程，包括软件本身和相关文档，以便对不同阶段的软件及相关文档进行表示并进行差别分析，对软件代码进行可撤消的修改，便于汇总不同开发人员所做的修改，辅助协调和管理软件开发团队。

## 常用版本控制工具

### Visual Source Safe(VSS）

VSS是美国微软公司的产品，目前常用的版本为6.0版。VSS是配置管理的一种很好的入门级的工具。

易学易用是VSS的强项，VSS采用标准的windows操作界面，只要对微软的产品熟悉，就能很快上手。

VSS的配置管理的功能比较基本，提供文件的版本跟踪功能，对于build和基线的管理，VSS的打标签的功能可以提供支持。VSS提供share（共享)、branch(分支）和合并（merge)的功能，对于团队的开发进行支持。VSS不提供对流程的管理功能，如对变更的流程进行控制。

VSS不能提供对异地团队开发的支持。此外VSS只能在windows平台上运行，不能运行在其他操作系统上。

VSS的安全性不高，对于VSS的用户，可以在文件夹上设置不可读，可读，可读/写,可完全控制四级权限。但由于VSS的文件夹是要完全共享给用户后，用户才能进入，所以用户对VSS的文件夹都可以删除。这一点也是VSS的一个比较大的缺点。

**微软已不再对VSS提供技术支持。**

### Concurrent Version System(CVS）

CVS是开发源代码的配置管理工具，其源代码和安装文件都可以免费下载。

CVS是源于unix的版本控制工具，CVS的服务器管理需要进行各种命令行操作。目前，CVS的客户端有winCVS的图形化界面，服务器端也有CVSNT的版本，易用性正在提高。

CVS的功能除具备VSS的功能外，还具有：

它的客户机/服务器存取方法使得开发者可以从任何因特网的接入点存取最新的代码；它的无限制的版本管理检出(checkout)的模式避免了通常的 因为排它检出模式而引起的人工冲突；它的客户端工具可以在绝大多数的平台上使用。同样，CVS不提供对变更流程的自动管理功能。

一般来说，CVS的权限设置单一，通常只能通过CVSROOT/passwd，CVSROOT/readers，CVSROOT/writers文件同时还要设置CVS REPOS的物理目录权限来完成权限设置，无法完成复杂的权限控制；但是CVS通过CVS ROOT目录下的脚本，提供了相应功能扩充的接口，不但可以完成精细的权限控制，还能完成更加个性化的功能。

CVS是开发源码软件，没有生产厂家为其提供技术的支持。如发现问题，通常只能靠自己查找网上的资料进行解决。

### SVN

SVN全名Subversion，即版本控制系统。

SVN与CVS一样，是一个跨平台的软件，支持大多数常见的操作系统。作为一个开源的版本控制系统，Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。Subversion 是一个通用的系统, 可用来管理任何类型的文件, 其中包括了程序源码。

### Git

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

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

Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper，后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得 BitKeeper 的许可证并不适合开放源码社区的工作，因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程，但是我们已经发现在很多其他自由软件项目中也使用了 Git。

### Git和SVN的区别

*   Git 是分布式的，SVN 不是：

    这是 Git 和其它非分布式的版本控制系统，例如 SVN，CVS 等，最核心的区别。

*   Git 把内容按元数据方式存储，而 SVN 是按文件：

    所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.git 等的文件夹里。

*   Git 分支和 SVN 的分支不同：

    分支在 SVN 中一点都不特别，其实它就是版本库中的另外一个目录。**Git 分支是指针指向某次提交，而 SVN 分支是拷贝的目录**。这个特性使 Git 的分支切换非常迅速，且创建成本非常低。

    **Git 有本地分支，SVN 无本地分支**。在实际开发过程中，经常会遇到有些代码没写完，但是需紧急处理其他问题，若我们使用 Git，便可以创建本地分支存储没写完的代码，待问题处理完后，再回到本地分支继续完成代码。

*   Git 没有一个全局的版本号，而 SVN 有：

    目前为止这是跟 SVN相比，Git 缺少的最大的一个特征。

*   Git 的内容完整性要优于 SVN：

    Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性，确保在遇到磁盘故障和网
    络问题时降低对版本库的破坏。

![](https://i.loli.net/2020/11/27/7rwU4cupNyPqlbo.png)

## Git的使用

### 安装

可以进入官网[https://git-scm.com/](https://git-scm.com/)，选择适合自己电脑的版本下载并安装。

![](https://i.loli.net/2020/11/27/pRV15kXo3ydm8Wa.png)

安装时一路next即可。需要注意的点有：

![选择Bash和GUI](https://i.loli.net/2020/11/27/M3mkjfQh1l8KICc.png)

仅供参考。

安装完成后在桌面或任意文件夹单击鼠标右键，出现*Git Bash Here*/ *Git GUI Here*则说明安装成功

![](https://i.loli.net/2020/11/27/LYXTGHfc9DWu2gd.png)

或者在cmd终端输入：`git --version`，出现版本说明安装成功

![image-20201127135807275](https://i.loli.net/2020/11/27/8vGaIdZS5rLNeCT.png)

### Git工作区域

git的工作区域分为3个区域：工作区、暂存区和仓库区。3个区的功能分别为：

1.  工作区：用来对代码进行修改（也就是我们的工作文件夹内部的文件本身,或者说是我们本地的文件夹）
2.  暂存区：暂时存放准备放入仓库区的代码
3.  仓库区：存放各个版本的代码

三个区之间的联系和文件操作如下图所示

![](https://i.loli.net/2020/11/27/sqL4HgNiS3FDbBz.png)

### Git初始化仓库和常用指令

初始化仓库的步骤如下：

1.  在我们想要进行版本控制的文件夹中，右键打开git bash
2.  在文件夹内初始化git(创建git仓库)
    `git init` (会生成一个.git的隐藏文件）

常用指令：

*   **add 添加文件**

    格式：`git add 文件名`

    作用：将工作区的文件提交（此时文件**提交至暂存区**）

    >   注：如果文件名参数为`*`，表示提交当前目录下的所有文件。目录路径可以用`/`分隔开。

*   **rm 删除文件**

    格式：`git rm 文件名`

    作用：删除文件（工作区/库一起删除）

    >   注：如果想要删除文件夹，则添加参数`-r`： `git rm -r 文件夹`
    >
    >   当我们需要删除暂存区或分支上的文件， 但本地又需要使用，只是不希望这个文件被版本控制， 可以使用下面迷命令只删除暂存区和版本库中的文件，保留工作区文件：
    >
    >   `git rm -r --cached 文件夹名称`

*   **status 查看当前状态**

    格式：`git status`

    作用：查看暂存区状态（有多少条指令待执行）

*   **commit 提交**

    格式：`git commit -m "提交描述"`

    作用：执行暂存区的指令。提交描述表示这次提交的描述信息。

## Git远程服务器

git常见的远程服务器有：

*   [GitHub](https://github.com/)

*   [GitLab](https://gitlab.com/users/sign_in)

*   [Gitee（码云）](https://gitee.com/)

其中，GitHub和GitLab都是国外服务商，在国内访问速度可能会受到限制。Gitee是国内的代码托管与开发协作平台，在国内的访问速度相比GitHub和GitLab要快很多。

>   **==GitHub==**
>
>   通过git管理github托管项目代码。
>
>   >   GitHub是一个面向开源及私有软件项目的托管平台，因为只支持git 作为唯一的版本库格式进行托管，故名GitHub。
>   >
>   >   GitHub于2008年4月10日正式上线，除了git代码仓库托管及基本的Web管理界面以外，还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前，其注册
>   >   用户已经超过350万，托管版本数量也是非常之多，其中不乏知名开源项目 Ruby，on Rails、jQuery、python等。
>
>   **==GitLab==**
>
>   >   GitHub 和 GitLab 都是基于 web 的 Git 仓库，使用起来二者差不多，它们都提供了分享开源项目的平台，为开发团队提供了存储、分享、发布和合作开发项目的中心化云存储的场所。
>   >
>   >   GitHub 作为开源代码库，拥有超过 900万的开发者用户，目前仍然是最火的开源项目托管平台，GitHub 同时提供公共仓库和私有仓库，但如果使用私有仓库，是需要付费的。
>   >
>   >   GitLab 解决了这个问题，你可以在上面创建**私人的免费仓库**。 GitLab 让开发团队对他们的代码仓库拥有更多的控制，相比较GitHub , 它有不少特色：
>   >
>   >   (1) 允许免费设置仓库权限；
>   >
>   >   (2) 允许用户选择分享一个 project 的部分代码；
>   >
>   >   (3) 允许用户设置 project 的获取权限，进一步提升安全性；
>   >
>   >   (4) 可以设置获取到团队整体的改进进度；
>   >
>   >   (5) 通过innersourcing 让不在权限范围内的人访问不到该资源；
>   >
>   >   所以，从代码的私有性上来看，GitLab是一个更好的选择。但是对于开源项目而言，GitHub 依然是代码托管的首选。
>
>   **==Gitee(码云)==**
>
>   >   码云（Gitee）是 OSCHINA 推出的代码托管协作开发平台，支持 Git 和 SVN,提供免费的私有仓库托
>   >   管。2016 年推出企业版，提供企业级代码托管服务，成为开发领域领先的 SaaS 服务提供商。
>   >
>   >   Gitee除了访问速度更快以外，Gitee 还提供了**免费的私有仓库**供个人开发者使用。同时，Gitee 也有着国内数一数二的开源生态，这里有非常多的优秀开源项目和开发者，你可以在这里和他们无障碍地沟通交流，不管是找开源项目还是分享自己的开源项目，Gitee 都是极佳的选择。
>   >
>   >   作为国内代码托管平台的佼佼者，目前已经有超过 500 万名开发者在 Gitee 上托管了 1000 余万个代码仓库，而其提供了研发管理、代码托管、文档管理服务的企业版的服务客户也超过了 10 万家。

下面针对Gitee说一下，Git远程服务器的使用

### Gitee的使用

#### Gitee的一些基本概念

1.  仓库（**Repository**）
    仓库即你的项目，你想在github上开源一个项目，那就必须要新建一个repository,如果你开源的项目
    多，那你拥有的仓库也就很多
2.  收藏（**star**）
    仓库主页的star按钮，意思是收藏项目的人数。
3.  复制克隆项目（**fork**）
    在原项目的基础上新增代码和结构，也可以理解成拿别人的代码进行二次加工。Fork后，会在自己账号下，生成自己的相同仓库
4.  发起请求（**pull request**，简称**PR**）
    这个是基于fork的，当其他人改进完代码后，想将这个项目合并到原项目，则这个时候会给你发起一个pull request。如果接受了请求，这个时候就可以拥有改进的项目了。
5.  关注（**watch**）
    即观察，可以随时看到被关注项目的更新
6.  事务卡片（**Issue**）
    发现代码有bug,但是目前还没成型，需要讨论时使用。当别人发现你的问题时，会提个lssue。
7.  Gitee主页
    账号创建完后，点击导航栏gitee图标即可进入主页。左侧显示功能列表，右侧显示仓库动态。
8.  仓库主页
    仓库主页主要显示项目的信息，如:代码，版本，收藏，关注，fork等

#### 创建仓库

注册登录后，就可以创建仓库了，一个本地git库对应一个远程开源项目。

![](https://i.loli.net/2020/11/27/PRDvlxUNTSz5oeK.png)

![](https://i.loli.net/2020/11/27/9vxr7ZfkeudGJtS.png)

#### 本地Git操作远程仓库

本地配置gitee的一些配置教程可以参考[https://gitee.com/help/articles/4107](https://gitee.com/help/articles/4107)。

设置登录的账户信息: 用户名和邮箱地址是本地git客户端的一个变量，每次commit都会用用户名和邮箱纪录。
一些配置的方法如下：

```bash
# 设置用户名: 
git config --global user.name '用户名'
#设置邮箱: 
git config --global user.email '邮箱'
```

>   查看git的配置: 
>
>   ```bash
>   git config --list
>   ```

git管理远程仓库的常用指令：

*   `git clone 仓库地址`：将远程仓库的项目复制到本地
*   `git push`：将本地仓库提交到远程（注意先提交到缓存区，再提交到仓库，最后提交远程，也就是在给commit 之后再 push）
*   `git pull`：更新本地仓库至最新改动

#### IDEA配置Git+Gitee

1.  IDEA配置Git客户端:

    File - Settings - Version Control - Git

    配置Path to Git Executable，就是git的所在路径
    ![image-20201127151002861](https://i.loli.net/2020/11/27/9y3dg8eNqY7moTj.png)

2.  下载gitee插件（GitHub等同理）

    File - Settings - Plugins

    搜索Gitee，然后点击Install。安装完毕后重启IDEA。
    ![](https://i.loli.net/2020/11/27/DnQpXw5NEAZL4M9.png)

3.  添加信息

    File - Setting - Version Control - Gitee![](https://i.loli.net/2020/11/27/OCtmyaiE2xg4Qs8.png)

    填写login和password，login填写邮箱。

4.  上传和下载

    上传：VCS - Import Into Version Control - Share Project To Gitee

    下载：新建项目时：Get from Version Control

    ![](https://i.loli.net/2020/11/27/M91ldHjWUvSN2nk.png)