版本控制

什么是版本控制

版本控制系统是一段时间内帮助跟踪代码中的更改的软件。 当开发人员编辑代码时,版本控制系统会为文件拍摄快照。 然后,它会永久保存该快照,以便以后可以根据需要重新调用它。

如果没有版本控制,开发人员会尝试在其计算机上保留多个代码副本。 这很危险,因为很容易在错误的代码副本中更改或删除文件,可能会丢失工作。 版本控制系统通过管理代码的所有版本来解决此问题,一次向团队提供多个版本。

版本控制的优点

  • 实时跨区域多人协作开发;
  • 组织和保护你的源代码及文档;
  • 统计工作量;
  • 跟踪记载一个或多个文件的历史记录;
  • 并行开发,提高效率;
  • 减轻开发负担,节约时间,降低人为的错误;

常见的版本控制工具

  • Git
  • SVN
  • CVS

版本控制的分类

  1. 本地版本控制

    记录文件每次的更新,对每个版本做快照或是记录补丁文件,适合个人使用,例如:RCS;

    image-20220908150746057

  2. 集中化的版本控制

所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改,例如:SVN;

image-20220908150807204

**存在问题:**如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作;如果发生服务器磁盘损坏,会造成数据丢失;

  1. 分布式版本控制

    于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 在这类系统中,像 Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

    image-20220908150825778

    优势:分布式版本控制系统可以指定和若干不同的远端代码仓库进行交互。在同一个项目中,分别和不同工作小组的人相互协作。 可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这是在集中式系统中是无法实现的。

Git简介

Git发展史

Linux 内核开源项目有着为数众广的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。

到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。 他们对新的系统制订了若干目标:

  • 速度很快
  • 设计简单
  • 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
  • 完全分布式
  • 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

自诞生于 2005 年以来,Git 成熟完善,在高度易用的同时,仍然保留着初期设定的目标,以及Git强大的非线性分支管理系统。

Git与SVN的区别

  • Git是分布式版本控制,SVN是集中化版本控制。
  • Git把内容按元数据方式存储,而SVN是按文件。
  • Git分支和SVN的分支不同。
  • Git没有一个全局的版本号,而SVN有。
  • Git的内容完整性要优于SVN。

安装Git和环境配置

安装Git

  1. 下载Git,Git (git-scm.com),选择无中文的安装路径,默认安装即可

    官网下载慢可以选择国内镜像下载

  2. 启动Git

    image-20220908152422942

    Git Bash:Linux风格命令行,推荐使用

    Git CMD:Windows风格命令行

    Git GUI:图形界面Git,初学者不推荐使用

常用Linux命令

  • cd:改变目录;
  • cd..:回到上一级目录;
  • pwd:显示当前所在目录路径;
  • ls(ll):列出当前目录下所有文件,ll更为列出所有文件更详细的信息;
  • touch:新建一个文件
  • rm:删除文件
  • mkdir:新建目录
  • rm -r:递归的删除目录
  • mv:移动文件
  • reset:重新初始化终端
  • clear:清屏
  • history:查看命令历史
  • help:帮助
  • exit:退出
  • # 注释符

Git的配置和工作原理

Git的配置

查看配置git config -l

1
2
3
4
5
6
7
8
9
10
11
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=C:/GitHub/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
credential.helper=manager-core

查看不同级别配置文件

1
2
git config -system -l #查看系统的配置
git config --global --l #查看用户(全局)的配置

配置文件的位置

系统级别:Git安装路径/etc/gitconfig

全局配置:C:\Users\你电脑用户名\.gitconfig

设置用户名与邮箱(一定要配置)

1
2
git config --global user.name "用户名"
git config --global user.email 邮箱地址

Git的工作原理

工作区域

Git本地由三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。

若在加上远程Git仓库(Remote Directory)就可以分为四个工作区域。

文件在这四个区域的转换关系如下:

image-20220908155507865

  • Working Directory:工作区,平时存放项目代码的地方;
  • Stage(intde):暂存区,临时存放改动内容;实际上是一个文件,主要存放即将提交的文件列表信息;
  • Repository:本地仓库,安全存放数据的位置,里面由你调教所有版本的数据;
  • Remote Direcotry:远程仓库,托管代码的服务器;

Git仓库中HEAD指向的版本:

image-20220908160426732

  • Directory:使用Git管理的目录,也就是一个仓库,包含我们的工作空间和Git的管理空间;
  • WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间;
  • .git:存放Git管理信息的目录,初始化仓库的时候自动创建;
  • Stage(intde):暂存区;
  • Local Repo:本地仓库,存放在本地的版本库;HEAD是当前的开发分支(branch);
  • Stash:隐藏,一个工作状态保存站,用于保存和恢复WorkSpace中的临时状态;

工作流程

Git工作流程:

  1. 在工作目录中添加、修改文件;
  2. 将需要进行版本管理的文件放入暂存区域;
  3. 将暂存区域的文件提交到Git仓库;

Git管理文件的三种状态:已修改(modified),已暂存(staged),已提交(committed);

Git项目创建和克隆

创建工作目录

工作目录(WorkSpace)一般是希望Git帮助你管理的文件夹,可以是项目目录,也可以是一个空目录,建议不要有中文;

常用命令:

image-20220909110013818

本地仓库搭建

创建本地仓库有两种方法:

  • 创建全新仓库:需要在Git管理的项目根目录执行

    1
    2
    # 初始化本地仓库
    git init
  • 克隆远程仓库:将远程服务器上的仓库完全镜像到本地

    1
    2
    # 克隆远程仓库到本地
    clone 远程仓库地址

Git的基本操作命令

文件的四种状态

  • Untracked:未跟踪,文件在文件夹中,但为加入到git库,不参与版本控制;可以通过git add变为Staged状态。
  • Unmodify:文件已经入库,未修改;如果被修改,则变为Modified;使用git rm移出版本库,变为Untracked状态。
  • Modified:文件已修改,可通过git add进入Staged状态;使用git checkout则丢弃修改,回到Unmodify状态。
  • Staged:暂存状态,执行git commit 同步到库中,这时库文件和本地文件一致了,又变为Unmodify状态;执行git reset HEAD filename取消暂存,文件变为Modified状态。

文件状态操作

查看文件状态

1
2
3
# 查看指定文件状态
git status [filename]
# 查看所有文件状态

添加和提交文件

1
2
3
4
5
git status
# 添加所有文件到暂存区
git add .
# 提交暂存区到本地仓库
git commit -m '提交信息备注'

忽略文件

有时我们不想把一些文件放入版本控制,例如数据库文件,临时文件等

在主目录下创建.gitignore文件,配置规则如下:

  • #号开始或空行将会被忽略;
  • 可使用Linux的通配符,如:*代表多个任意字符;?代表一个字符,[ab]代表可选字符范围,{str1,str2}代表可选字符串…
  • 如果名称最前方有!,表示例外规则,不被忽略;
  • 如果名称最前方有/,表示忽略/前的内容;
  • 如果名称最后方有/,表示忽略/后的内容;
1
2
3
4
5
6
# 注释
*.data # 忽略所有.data结尾的文件
!map.data # map.data不忽略
/lib # 忽略lib下所有文件,不包括lib下的子目录
bin/ # 忽略bin目录下所有文件
bin/*.data # 忽略bin目录下所有.data结尾的文件

Gitee注册及配置SSH公钥

  1. 注册gitee账号,完善个人信息;

    Gitee - 基于 Git 的代码托管和研发协作平台

    也可以选择Github

  2. 设置本机绑定SSH公式,实现免密码登录!

    1
    2
    3
    4
    # 进入 C:\Users\你电脑用户名\.ssh目录
    # 生成公钥命令
    ssh-keygen -t rsa -C "你的邮箱"
    # 然后回车不设置密码

    这时.ssh下就会生成两个文件

    image-20220909135039224

  3. 将公钥信息public key添加到Gitee账户中即可

    复制上方公钥文件里的内容,粘贴到下方公钥的位置保存即可!

    Gitee SSH公钥添加位置

    公钥粘贴上方复制好的;

    image-20220909133556293

    Github 添加SSH

    image-20220909133809486

  4. 创建一个自己的远程仓库

    image-20220909140248698

    创建之后,可以选择地址克隆到本地

    image-20220909140413059

    克隆博客到本地

    1
    2
    3
    4
    5
    6
    7
    $ git clone https://gitee.com/jokerdig/idea-connection.git
    Cloning into 'idea-connection'...
    remote: Enumerating objects: 4, done.
    remote: Counting objects: 100% (4/4), done.
    remote: Compressing objects: 100% (4/4), done.
    remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
    Receiving objects: 100% (4/4), done.

IDEA集成Git

  1. 打开IDEA,新建一个项目

  2. 项目绑定Git

    把刚刚克隆的远程文件复制到新建的IDEA项目中即可

    复制好之后,打开IDEA

    image-20220909141353154

  3. 提交文件到远程仓库

    命令提交

    打开IDEA左下角的Terminal,添加所有文件:

    1
    git add .

    提交文件到本地仓库

    1
    git commit -m "第一次git提交"

    push到远程服务器

    1
    git push
  4. 查看远程仓库

    image-20220909142238475

关于Git的分支

每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。

使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

branch

Git分支基本命令

1
2
3
4
5
6
7
8
9
10
# 创建分支
git branch 分支名
# 切换分支
git checkout 分支名
# 合并分支
git merge 分支名
# 列出分支
git branch
# 删除分支
git branch -d 分支名