一篇文章带你了解热门版本控制系统——Git

这篇文章会介绍到关于版本控制的相关知识以及版本控制神器Git

我们可能在生活中经常会使用GitHub网页去查询一些开源的资源或者项目,GitHub就是基于Git而产生的平台

接下来让我们来细细道来~

Git是一门非常简单的技术,但在实际开发中占有很重要的地位,请务必了解掌握

版本控制

在介绍Git之前我们先来介绍一个名词:版本控制

版本控制概念

我们在标题已经提到了Git的最大作用:版本控制

那么我们先来了解一下版本控制:

  • 版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。

通俗来说的话:

  • 版本控制用于在开发的过程中管理我们的文件
  • 我们可以查看文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本。

例如我们所使用的产品有Version,版本常分为1.0,2.0...版本区分

但是我们所淘汰掉的版本是不会被直接抛弃删除,而是被像Git这样的软件所保存传送到相关仓库中

又或者我们的软件开发之后,会由许多人进行开发修改

但是并非所有人的开发版本都会被保留使用,那些被淘汰的版本就会被像Git这样的软件所保存传送到相关仓库中

版本控制的优势:

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

总而言之版本控制在我们的实际开发中占有很重要的地位!

多人开发就必须要使用版本控制,否则无法控制项目的开发状态

版本控制工具

我们目前常用的控制工具大致分为五种:

  • Git
  • SVN(Subversion)
  • CVS(Concurrent Versions System)
  • VSS(Micorosoft Visual SourceSafe)
  • TFS(Team Foundation Server)

其中SVN属于版本控制的老大哥,但目前大部分公司已经不再使用

我们目前学的Git就属于版本控制的主流工具,基本上大部分公司都在使用Git工具

版本控制分类

我们通常将版本控制分为三类:

  1. 本地版本控制
  • 概念:

本地版本控制通常用于个人开发,我们将我们自己的项目进行版本控制,在迭代后将原版本的项目原件保留下来

记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,如RCS。

  • 优缺点:

只能用于个人开发,多人开发在多台计算机上,本地版本控制无法满足

  1. **集中版本控制 **
  • 概念:

集中版本控制通常用于团队开发,将一个电脑作为主机,将所有需要保存的项目资料都存放在该电脑上,实现集中控制

协同开发者从服务器上同步更新或上传自己的修改,如SVN

  • 优缺点:

集中版本控制将所有资料保存在一台电脑上,相当于单机存储,保密性较高;但一旦计算机出现损坏,项目备份丢失,无法找回

  1. 分布式版本控制
  • 概念:

分布式版本控制通常用于团队开发,所有人都保存有项目的所有资料,实现分布式控制

  • 优缺点:

保密性差,所有人都携带项目源码,具有一定安全隐患;但同时所有人都保存有源码,一台电脑损坏并不影响项目的保存

Git和SVN的主要区别

我们在前面提及到了集中版本控制和分布式版本控制,实际上它们就分别对应着SVN和Git的控制方式

因而我们给出相关总结:

  • 数据存放地址:SVN存放在一台计算机;Git存放在所有计算机
  • 项目开发方式:SVN需要联网获得主机上的项目,然后开发完后推送回原电脑;Git直接开发并比对研究即可
  • 优缺点:SVN安全性低但容易丢失;Git不易丢失但安全性差

Git环境配置

首先我们来讲解Git的安装以及环境配置等信息

Linux常用指令

在正式开始Git教学之前,我们来复习一些Linux相关指令:

# 表示注释

cd : 改变目录。

cd . . : 回退到上一个目录,直接cd进入默认目录

pwd : 显示当前所在的目录路径。

ls(ll) :  都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。

touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。

rm:  删除一个文件, rm index.js 就会把index.js文件删除。

mkdir :  新建一个目录,就是新建一个文件夹。

rm -r :  删除一个文件夹, rm -r src 删除src目录

mv : 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,

reset : 重新初始化终端/清屏。

clear : 清屏。

history : 查看命令历史。

help : 帮助。

exit : 退出。

Git下载与打开

  1. 官网下载安装(官网地址:https://git-scm.com/)

安装基本只需要修改安装路径和默认打开方式,其他选项一律默认即可

  1. 启动Git

我们启动一般有三种方法:

  • Git Bash:Unix与Linux风格的命令行,使用最多,推荐最多
  • Git CMD:Windows风格的命令行
  • Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令

我们通常选用Git Bash,采用Linux命令行来进行

下载Git之后,我们可以在文件夹下直接点击右键,可以看到出现有Git Bash的选项,点击即可开启

Git相关配置

我们在下面介绍一些Git的配置查看方法以及配置方法

首先我们需要知道查看Git配置的方法:

# 查看全部配置
git config -l

Git中存在有系统默认配置以及我们自己配置的信息:

# 查看系统config
git config --system --list
  
# 查看当前用户(global)配置
git config --global --list

我们在Git中有必须设置的两个属性:

# 这是非常重要的,因为每次Git提交都会使用该信息。

# 设置名称
git config --global user.name "QiuLuo" # 设置邮箱
git config --global user.email 3206154701@qq.com

如果你希望在单个项目中修改name和email可以去掉--global,表示不在全局中配置

Git基本理论

我们下面将从Git的数据传递方面讲起,是很重要的地方哦~

Git四个区域

我们的Git会将我们的数据保存下来,作为版本保留下来

而保留的地点通常被我们划分为四个区域:

  • 工作目录(Working Directory)
  • 暂存区(Stage/Index)
  • 资源库(Repository或Git Directory)
  • 远程仓库(Remote Directory)

这四个区域的转换方式如下图所示:

接下来让我们依次介绍这四个区域:

  • 工作目录:第一层,主机存放代码的区域
  • 暂存区:第二层,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
  • 资源库:第三层,本地仓库,安全存放数据的位置,保存有你提交到所有版本的数据。
  • 远程仓库:第四层,托管代码的服务器

Git区域工作流程

在我们代码书写完毕后,我们通常会将数据存放到资源库

具体的Git流程如下:

1、在工作目录中添加、修改文件 [Git状态:已修改(modified)]

2、将需要进行版本管理的文件放入暂存区域 [Git状态:已暂存(staged)]

3、将暂存区域的文件提交到git仓库 [Git状态:已提交(committed)]

Git项目搭建

接下来我们开始Git项目搭建的讲解~

本地仓库搭建

我们前面说到,我们Git会将工作目录的项目传递到本地仓库上

那么首先我们需要学会创建本地仓库:

  1. 本地仓库创建
# 在当前目录新建一个Git代码库(注意:会在当前页面下产生一个隐藏目录.git,需要打开隐藏目录标签才可以查看到)
$ git init
  1. 远程仓库克隆
# 克隆一个项目和它的整个代码历史(版本信息) 提供一个url:https://gitee.com/kuangstudy/openclass.git
$ git clone [url]

Git常用六个方法

Git项目文件的处理一共只有六个方法,用于控制四个区域的流动:

  • add:工作目录 -> 暂存区
  • commit: 暂存区 -> 资源库
  • push: 资源库 -> 远程仓库
  • clone: 远程仓库 -> 资源库
  • checkout: 资源库 -> 工作目录
  • pull: 远程仓库 -> 工作目录

Git文件操作

我们Git的项目操作实际上来说就是对文件进行操作

下面我们来介绍Git操作文件的一些方法以及文件的四种常见状态

Git文件状态

我们对文件进行不同的操作或采用了不同的代码之后,文件的状态会发生变化

我们通常将文件的状态分为四种:

  • Untracked : 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
  • Unmodify : 未修改, 即版本库中的文件快照内容与文件夹中完全一致.
  • Modified : 文件已修改, 仅仅是修改, 并没有进行其他的操作.
  • Staged : 暂存状态.

文件之间的状态转换如下:

  • Untracked通过git add状态变为Staged.
  • Unmodify如果被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
  • Modified通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态
  • Staged执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态.

Git文件指令

Git提供了两个方法可以查看单个文件以及所有文件的状态:

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

同时Git也提供了两个方法进行文件类型的转换:

# 添加所有文件到暂存区
git add . # 提交暂存区中的内容到本地仓库 -m 提交信息
git commit -m "消息内容"

Git文件忽略

在我们的实际开发中,有些文件并不需要添加到本地仓库中,因而Git为我们提供了一个配置类:

  • .gitignore配置类

该文件存在以下规则:

  • 忽略文件中的空行或以井号(#)开始的行将会被忽略。

  • 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符

  • 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。

  • 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。

  • 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。

我们给出相关示例:

#为注释

#忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
*.txt #但lib.txt除外
!lib.txt #仅忽略项目根目录下的TODO文件,不包括其它目录temp
/temp #忽略build/目录下的所有文件
build/ #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt

Gitee码云

我们在实际开发中通常需要一个远程仓库来存放我们的项目版本

目前可靠的Git开发平台有GitHub,Gitab,Gitee,我们在这里采用Gitee为例

  1. 注册登录码云页面

  1. 获得SSH公钥
# 首先我们采用Git获得SSH公钥

# 生成SSH公钥 然后进入 C:\Users\Administrator\.ssh 目录 可以查看相关信息
ssh-keygen
  1. 设置本机绑定SSH公钥,实现远程仓库免密码登录

  1. 创建一个远程仓库

  1. 克隆至本地即可
$ git clone 远程仓库HTTPS

IDEA集成Git

这一小节我们来介绍如何在IDEA中使用Git保存数据

  1. 创建项目,绑定Git

我们通常将我们远程仓库中的代码直接拷贝复制到当前项目文件夹下即可

此时我们的IDEA页面会发生变化(红色文件为选中文件):

  1. 修改文件,逐步实现add,commit,push操作

我们可以选择在Terminal控制台输出:

同样可以选择IDEA界面快捷输出:

  1. 返回Gitee页面查看数据即可(注意:需要设置为公开才可更新成功)

Git分支

分支就是脱离于主线之外的内容

版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线,让我们在不影响主线的同时继续工作

如果同一个文件在合并分支时都被修改了则会引起冲突:

  • 解决的办法是我们可以修改冲突文件后重新提交
  • 但是我们需要选择要保存某一人的代码而舍弃另一个人的代码

那么我们的日常开发应该是以哪种方式开发呢:

  • master主分支应该非常稳定,用来发布新版本,一般情况下不允许在上面工作
  • 工作一般情况下在新建的dev开发分支上工作,在分支稳定后可以合并到主分支master上来。

我们在这里给出Git分支的常用指令:

# 列出所有本地分支
git branch # 列出所有远程分支
git branch -r # 新建一个分支,但依然停留在当前分支
git branch [branch-name] # 新建一个分支,并切换到该分支
git checkout -b [branch] # 合并指定分支到当前分支
$ git merge [branch] # 删除分支
$ git branch -d [branch-name] # 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

结束语

好的,关于Git的内容就介绍到这里,希望能为你带来帮助!

附录

该文章属于学习内容,具体参考B站遇见狂神说的秦江老师的Git课程

这里附上视频链接:1、前言之版本控制_哔哩哔哩_bilibili

一篇文章带你了解热门版本控制系统——Git的更多相关文章

  1. 一篇文章带你了解服务器操作系统——Linux简单入门

    一篇文章带你了解服务器操作系统--Linux简单入门 Linux作为服务器的常用操作系统,身为工作人员自然是要有所了解的 在本篇中我们会简单介绍Linux的特点,安装,相关指令使用以及内部程序的安装等 ...

  2. MYSQL(进阶篇)——一篇文章带你深入掌握MYSQL

    MYSQL(进阶篇)--一篇文章带你深入掌握MYSQL 我们在上篇文章中已经学习了MYSQL的基本语法和概念 在这篇文章中我们将讲解底层结构和一些新的语法帮助你更好的运用MYSQL 温馨提醒:该文章大 ...

  3. 一篇文章带你掌握主流基础框架——Spring

    一篇文章带你掌握主流基础框架--Spring 这篇文章中我们将会介绍Spring的框架以及本体内容,包括核心容器,注解开发,AOP以及事务等内容 那么简单说明一下Spring的必要性: Spring技 ...

  4. 一篇文章带你掌握主流办公框架——SpringBoot

    一篇文章带你掌握主流办公框架--SpringBoot 在之前的文章中我们已经学习了SSM的全部内容以及相关整合 SSM是Spring的产品,主要用来简化开发,但我们现在所介绍的这款框架--Spring ...

  5. 一篇文章带你掌握MyBatis简化框架——MyBatisPlus

    一篇文章带你掌握MyBatis简化框架--MyBatisPlus 我们在前面的文章中已经学习了目前开发所需的主流框架 类似于我们所学习的SpringBoot框架用于简化Spring开发,我们的国人大大 ...

  6. 一篇文章带你了解网页框架——Vue简单入门

    一篇文章带你了解网页框架--Vue简单入门 这篇文章将会介绍我们前端入门级别的框架--Vue的简单使用 如果你以后想从事后端程序员,又想要稍微了解前端框架知识,那么这篇文章或许可以给你带来帮助 温馨提 ...

  7. 一篇文章带你了解NoSql数据库——Redis简单入门

    一篇文章带你了解NoSql数据库--Redis简单入门 Redis是一个基于内存的key-value结构数据库 我们会利用其内存存储速度快,读写性能高的特点去完成企业中的一些热门数据的储存信息 在本篇 ...

  8. 一篇文章带你了解轻量级Web服务器——Nginx简单入门

    一篇文章带你了解轻量级Web服务器--Nginx简单入门 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件代理服务器 在本篇中我们会简单介绍Nginx的特点,安装,相关指令使用以及配置信 ...

  9. MYSQL(基本篇)——一篇文章带你走进MYSQL的奇妙世界

    MYSQL(基本篇)--一篇文章带你走进MYSQL的奇妙世界 MYSQL算是我们程序员必不可少的一份求职工具了 无论在什么岗位,我们都可以看到应聘要求上所书写的"精通MYSQL等数据库及优化 ...

随机推荐

  1. WPF 截图控件之绘制箭头(五)「仿微信」

    前言 接着上周写的截图控件继续更新 绘制箭头. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 4.WPF 截图控件之绘制方 ...

  2. 手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果

    七夕来咯!又到了给重要的人送惊喜的时刻. 今年,除了将心意融入花和礼物,作为程序员,用自己的代码本事手搓一个技术感十足"七夕限定"惊喜,我觉得,这是不亚于车马慢时代手写信的古典主义 ...

  3. bash脚本里的-h是什么意思?

    问题描述 我在看脚本的时候,看到了下面代码 其中的-h "$PRG"我一时没明白是在判断什么东西.然后翻阅了一下菜鸟教程和其他教程,都没有说. 问题解决 -h其实是在判断这个文件是 ...

  4. Redis架构之哨兵机制与集群

    Redis架构之哨兵机制与集群 哨兵机制 1.介绍: Sentinel(哨兵)是redis高可用性解决方案:由一个或多个由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个 ...

  5. shiro登录过程

    工作流程: 浏览器将用户名.密码.是否记住登录等信息发送给登录controller , new UsernamePasswordToken()获取token,将用户名.加密后的密码.rememberM ...

  6. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(14)-Fiddler断点(breakpoints)实战,篡改或伪造数据

    1.简介 上一篇主要就讲解和分享Fiddler断点的理论和操作,今天宏哥就用具体例子,将上一篇中的理论知识实践一下.而且在实际测试过程中,有时候需要修改请求或响应数据,或者直接模拟服务器响应,此时可以 ...

  7. OID天下第一 (双指针,LCT,线段树)

    题面 或曰:"笑长天下第一!",OID 喜得合不拢嘴:"哈哈哈哈哈哈--" OneInDark 是天下第一的. OneInDark 给了你一个 n n n 个点 ...

  8. Shiro反序列化利用

    Shiro反序列化利用 前言:hvv单位这个漏洞挺多的,之前没专门研究打法,特有此篇文章. Shiro rememberMe反序列化漏洞(Shiro-550) 漏洞原理 Apache Shiro框架提 ...

  9. String与StringBuilder相互转换以及获取字符串中第一个中文汉字

    String与StringBuilder相互转换 1. StringBuilder转为String StringBuilder sb = new StringBuilder(); sb.append( ...

  10. 免费内网穿透服务Localtunnel

    Localtunnel 将为您分配一个唯一的可公开访问的 url,它将所有请求代理到您本地运行的网络服务器. 快速开始 全局安装 Localtunnel(需要 NodeJS)以使其在任何地方都可以访问 ...