# Git安装

# 版本控制

# 什么是版本控制

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 除了项目源代码,你可以对任何类型的文件进行版本控制。

# 为什么要版本控制

有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。

# 本地版本控制系统

许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单,但是特别容易犯错。 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。

为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。

本地版本控制系统

# 集中化的版本控制系统

接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作? 于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。

集中化的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

集中化的版本控制系统

这么做虽然解决了本地版本控制系统无法让在不同系统上的开发者协同工作的诟病,但也还是存在下面的问题:

  • 单点故障: 中央服务器宕机,则其他人无法使用;如果中心数据库磁盘损坏有没有进行备份,你将丢失所有数据。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
  • 必须联网才能工作: 受网络状况、带宽影响。

# 分布式版本控制系统

于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 Git 就是一个典型的分布式版本控制系统。

这类系统,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

分布式版本控制系统

分布式版本控制系统可以不用联网就可以工作,因为每个人的电脑上都是完整的版本库,当你修改了某个文件后,你只需要将自己的修改推送给别人就可以了。但是,在实际使用分布式版本控制系统的时候,很少会直接进行推送修改,而是使用一台充当“中央服务器”的东西。这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

分布式版本控制系统的优势不单是不必联网这么简单,后面我们还会看到 Git 极其强大的分支管理等功能。

# 认识 Git

# Git 简史

Linux 内核项目组当时使用分布式版本控制系统 BitKeeper 来管理和维护代码。但是,后来开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统,而且对新的版本控制系统做了很多改进。

# Git 与其他版本管理系统的主要区别

Git 在保存和对待各种信息的时候与其它版本控制系统有很大差异,尽管操作起来的命令形式非常相近,理解这些差异将有助于防止你使用中的困惑。

下面我们主要说一个关于 Git 其他版本管理系统的主要差别:对待数据的方式

Git采用的是直接记录快照的方式,而非差异比较。我后面会详细介绍这两种方式的差别。

大部分版本控制系统(CVS、Subversion、Perforce、Bazaar 等等)都是以文件变更列表的方式存储信息,这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。

理解起来其实很简单,每个我们对提交更新一个文件之后,系统记录都会记录这个文件做了哪些更新,以增量符号Δ(Delta)表示。

我们怎样才能得到一个文件的最终版本呢?

很简单,高中数学的基本知识,我们只需要将这些原文件和这些增加进行相加就行了。

这种方式有什么问题呢?

比如我们的增量特别特别多的话,如果我们要得到最终的文件是不是会耗费时间和性能。

Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流

# Git 的三种状态

Git 有三种状态,你的文件可能处于其中之一:

  1. 已提交(committed):数据已经安全的保存在本地数据库中。
  2. 已修改(modified):已修改表示修改了文件,但还没保存到数据库中。
  3. 已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

由此引入 Git 项目的三个工作区域的概念:**Git 仓库(.git directoty) **、工作目录(Working Directory) 以及 暂存区域(Staging Area)

基本的 Git 工作流程如下:

  1. 在工作目录中修改文件。
  2. 暂存文件,将文件的快照放入暂存区域。
  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

# 安装Git

打开终端使用git version命令查看版本. 如遇网络问题无法下载可以访问华为镜像站 (opens new window)下载

# Centos中安装Git

一、安装git

yum install git
1

1、查看yum源仓库Git信息

yum info git
1

2、安装依赖库

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel 
yum install gcc-c++ perl-ExtUtils-MakeMaker
1
2

3、如果原有的git版本过低,移除默认安装的旧版git

git --version
yum remove git ## 移除原来的版本
1
2

4、下载安装

cd /usr/src
wget https://www.kernel.org/pub/software/scm/git/git-2.18.0.tar.gz
1
2

5、解压文件

tar xf git-2.18.0.tar.gz
1

6、配置编译安装

[root@wugenqiang ~]# cd /usr/src
[root@wugenqiang src]# ls
debug  git-2.18.0  kernels
[root@wugenqiang src]# cd git-2.18.0/
[root@wugenqiang git-2.18.0]# 
[root@wugenqiang git-2.18.0]# make configure
[root@wugenqiang git-2.18.0]# ./configure --prefix=/usr/git ##配置目录
[root@wugenqiang git-2.18.0]# make profix=/usr/git
[root@wugenqiang git-2.18.0]# make install
1
2
3
4
5
6
7
8
9

7、加入环境变量

echo "export PATH=$PATH:/usr/git/bin" >> /etc/profile
1

8、刷新环境变量

source /etc/profile
1

9、检查版本

git --version
1

image-20220531183004087

当出现以上图片样式就说明安装成功!

# git的初始化

# git配置

使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名,每次提交记录里都会包含这些信息。使用git config命令进行配置:

$ git config --global user.name "Scott Chacon"
$ git config --global user.email "schacon@gmail.com"
1
2

执行了上面的命令后,会在家目录(/home/shiyanlou)下建立一个叫.gitconfig 的文件(该文件为隐藏文件,需要使用ls -al查看到). 内容一般像下面这样,可以使用vim或cat查看文件内容:

$ cat ~/.gitconfig
[user]
        email = schacon@gmail.com
        name = Scott Chacon
1
2
3
4

上面的配置文件就是Git全局配置的文件,一般配置方法是git config --global <配置名称> <配置的值>

如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱),你可以在项目中使用git config命令不带--global选项来设置. 这会在你当前的项目目录下创建 .git/config,从而使用针对当前项目的配置。

# 获得一个Git仓库

既然我们现在把一切都设置好了,那么我们需要一个Git仓库。有两种方法可以得到它:一种是从已有的Git仓库中clone(克隆,复制);还有一种是新建一个仓库,把未进行版本控制的文件进行版本控制。

# 初始化一个仓库

可以对一个已存在的文件夹用下面的命令让它置于Git的版本控制管理之下。

创建代码目录project

$ cd /home/shiyanlou/
$ mkdir project
1
2

进入到代码目录,创建并初始化Git仓库:

$ cd project
$ git init
1
2

Git会输出:

Initialized empty Git repository in /home/shiyanlou/project/.git/
1

通过ls -la命令会发现project目录下会有一个名叫.git 的目录被创建,这意味着一个仓库被初始化了。可以进入到.git目录查看下有哪些内容。

# 在IntelliJ IDEA中配置Git

菜单栏顺序选择: File->Settings,在弹出框中选择下图中的Git

image-20220531183015163

然后点击右侧上方输入框 Path to Git executable:中右面的浏览图标(小文件夹),并定位git的可执行程序(git.exe文件在git安装目录下的cmd文件夹中)。

image-20220531183031072

点击Test按钮。如果点击后可以显示出版本号,说明配置成功,此时点击窗口下侧的OK按钮即可。

image-20220531183037646

# 在IntelliJ IDEA中利用Git拉取项目

1 访问gitee或github,找到项目对应的仓库,并复制仓库地址。

image-20220531183043888

2 打开IDEA,依次选择菜单:File->New->Project from Version Control

image-20220531183051597

3 在弹出框中输入仓库路径(从第一步中gitee或github复制的路径)并点击Clone

image-20220531183058022

4 在弹出框中输入gitee或github的账号和密码并点击Log in

image-20220531183106516

等待下载完毕即可

image-20220531183113459

# 在IntelliJ IDEA中使用Git推送项目

# 去gitee网站注册用户

gitee网站地址:https://gitee.com/

github网站地址:https://github.com/

# 1 创建仓库

以下以gitee为例进行介绍,github操作雷同。

  1. 创建仓库

    点击页面右上方的"+"并选择"创建仓库"

    image-20220531183120475

  2. 设置仓库相关信息

    首先输入仓库名,通常可以和IDEA中项目名相同。是否开源则可结合需求选择,这里选择的私有(该项目仅自己可见)

    image-20220531183126265

    然后点击下方的"创建"按钮.

    image-20220531183133672

    此时gitee上完成了仓库的创建工作。

  3. 复制当前仓库路径,这个路径需要在后面IDEA上传项目时使用.

    image-20220531183140255

# 2 在IDEA中将项目导入版本控制

  1. 在IDEA菜单栏顺序选择:VCS->Import into Version Controlp->Create Git Repository

    目的是先在本地创建一个git仓库

    image-20220531183147651

    弹出框中字节点击"OK"按钮即可

    image-20220531183154983

  2. 鼠标右键项目名,在弹出的菜单栏中顺序选择:Git->Add

    目的是将当前项目中本地仓库没有的内容添加到本地仓库中(实际上并没有真是添加,只有在下一步操作中才会真实添加,但是所有仓库中没有的文件都需要先add后才可以通过下面的步骤添加到仓库!)

    image-20220531183201163

  3. 提交更改

    鼠标右键当前项目名,在弹出的菜单栏中顺序选择:Git->Commit Diectory

    image-20220531183207636

    之后输入本次提交的备注,例如:第一次提交(注:这里必须输入内容,否则无法提交)。然后点击Commit按钮进行本地提交。

    目的:提交的目的是将当前项目保存到本地仓库中

    image-20220531183213873

    之后,点击IDEA左侧边条的1:Project回到项目结构视图

    image-20220531183224191

    鼠标右键项目名,在弹出的菜单栏中顺序选择:Git->Repository->Push

    目的就是将本地仓库保存的内容同步到服务器(上传到服务器,并使服务器中的仓库与本地仓库内容保持一致)。

    image-20220531183231958

    第一次操作时需要配置服务器仓库地址,点击弹出框中的Define remote

    image-20220531183239383

    在弹出框中的URL输入框中添加gitee上创建的仓库路径(第一大步最后一小步中在页面上复制的仓库路径),并点击OK按钮

    image-20220531183244943

    之后IDEA会自动检查链接,没有问题则点击下方的Push按钮

    image-20220531183251018

    第一次提交时要求输入gitee上的账号和密码,输入后可选中Remember记住密码,后续就不需要输入了。

    image-20220531183257437

    此时完成提交,右下方会提示。

    image-20220531183303147

# 提交改动

使用快捷键CTRL+K,就会弹出提交的界面,点击Commit and Push即可

image-20220531183309043

# 更新

点击快捷键Ctrl+T,就会弹出更新的界面,点击OK即可

image-20220531183315897

# 3 push失败的解决办法

上面最后一步若提交失败,会在右下侧提示。

image-20220531183321172

此时点击IDEA下测控制台选项打开控制台视图:

image-20220531183327830

在控制台中依次执行下面三个命令:

git pull
git pull origin master
git pull origin master --allow-unrelated-histories
1
2
3

如图:

image-20220531183333888

image-20220531183342536

image-20220531183349338

之后再尝试push。

# git统计项目代码行数

把代码库clone到本地

git clone <代码库地址>
1

显示项目的所有文件列表及行数(已删除的文件显示为空) 最后一行会显示项目代码的总行数

git ls-files | xargs wc -l
1

只统计项目代码的总行数

git ls-files | xargs cat | wc -l
1

只查看项目文件列表

git ls-files
1