git版本控制系统小白教程(上)
前言:本文主要介绍git版本控制系统的一些基础使用,适合小白入门,因为内容较多,会分为两部分进行分享,查看下部请点传送门。
Git介绍
Git是目前世界上最先进的分布式版本控制系统。并且它是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git功能
我们先看一下Git的主要功能,从一般开发者的角度来看,git有以下功能:
- 🍊 从服务器上克隆完整的Git仓库(包括代码和版本信息)到单机上。
- 🍊 在自己的机器上根据不同的开发目的,创建分支,修改代码。
- 🍊 在单机上自己创建的分支上提交代码。
- 🍊 在单机上合并分支。
- 🍊 把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
- 🍊 生成补丁(patch),把补丁发送给主开发者。
- 🍊 看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
- 🍊 一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能:
- 🍋 查看邮件或者通过其它方式查看一般开发者的提交状态。
- 🍋 打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
- 🍋 向公共服务器提交结果,然后通知所有开发人员。
Git的优缺点
✔️ 优点:
- 适合分布式开发,强调个体。
- 公共服务器压力和数据量都不会太大。
- 速度快、灵活。
- 任意两个开发者之间可以很容易的解决冲突。
- 离线工作。
❌ 缺点:
- 资料少(起码中文资料很少)。
- 学习周期相对而言比较长。
- 不符合常规思维。
- 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
❓ 那为什么要用版本控制系统呢?
- 更方便地存储版本。
- 更方便地进行比对。
- 可以恢复之前的版本。
- 协同合作。
Git安装及账户配置
下载
在使用Git前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行,各平台安装包都可以在官网中找到,选择你需要的平台下载安装即可。windows的推荐使用这个下载地址,速度相对官网会更快。
安装
下载后安装,直接一路点击next安装即可。
安装完成后,在文件夹中右击,看到下面两个git选项,就说明git安装成功了。
查看Git版本
在文件夹中右击,点击Git Bash Here打开git命令行窗口,输入git --version
就可以查看git的版本信息了。
如果安装的版本较旧,想要升级最新版,可以使用git update-git-for-windows
命令一键升级到最新版。当然,你也可以直接在官网下载最新版的手动安装。
配置用户名和邮箱
初次安装Git时都需要配置一个用户名和邮箱,否则使用过程会出现警告信息如:please tell me who you are。
相关配置命令:
git config --global user.name "用户名"
:配置用户名git config --global user.email "邮箱地址"
:配置邮箱git config --global --list
:查看全局配置列表
global 表示全局,表示你这台机器上所有的Git仓库都会使用这个配置,提交项目内容时就会以配置的账户署名,当然你也可以对某个仓库指定不同的用户名和邮箱,也可以针对操作系统进行配置,配置命令几乎是一样的。
git config --local
:只对指定的仓库有效,如果不指定时(即git config
)默认是配置local,之一如果要指定仓库,配置时要先切换到对应仓库的目录。
git config --system
:对操作系统的所有用户有效。
创建Git仓库
仓库(即版本库)是什么?简单来说它就是一个目录,这个目录下的所有文件都可以使用git管理起来,对文件进行的增删改操作都会被记录下来,之后任何时刻都可以去查看这些历史记录,并且可选择回退到某一个时间点的该仓库的版本。
创建git仓库有两种方式:
方式一
git init
:已经手动创建了一个目录,直接把该目录变成一个git仓库。
在已经创建好的目录下右击,点击Git Bash Here,输入git init
回车,你会发现你的目录下多了一个.git文件夹,你可以点击进去看一下,这个文件夹是git用来跟踪管理仓库版本信息的,因此不要去修改里面的任何文件,否则会损坏仓库的版本信息。(如果你看不到这个文件夹,可以在文件设置中设置显示隐藏的文件,但强烈建议隐藏,避免误操作破坏仓库)
方式二
git init 仓库名
:新建一个git仓库
在你想要创建仓库的目录下右击,点击Git Bash Here,输入git init 仓库名
回车,就会在该目录下创建一个git仓库,并且仓库内会生成一个.git文件夹。
提交版本
这里先科普一下两个名词,工作区和暂存区。
工作区就是你在电脑中能看到的目录,比如我现在新建一个learn文件夹,这个文件夹就是一个工作区。问题来了,我在前一章中创建的my_git仓库它是不是工作区呢?答案是否,它就是一个仓库,一个版本库,版本库里存了很多的东西,其中最重要的一个就是暂存区(stage也叫index),如图:
我们提交版本时,是分两步执行的,第一步先把对文件的操作从工作区添加到暂存区,第二步再把暂存区的所有操作提交到当前分支,我们创建git仓库时,git会默认创建了一个master分支,因此我们未创建其他分支时,提交版本是默认提交到master分支上的。
另外一点,我们要知道的是,所有的版本控制系统,都只能跟踪文本文件类的改动,比如:txt文本,html网页文件、py文件、css、js等程序代码,版本控制系统可以清楚地记录每个版本的改动,但是像图片、视频、mp3这些二进制文件,虽然也能由版本控制系统管理,但无法跟踪文件的具体变化,只能简单地记录某些变动的地方,比如图片从100kb变成250kb,但是图片替换了还是调整了像素,具体到底改了什么,版本控制系统是不知道的。
提交版本的相关命令:
git add <file>
:把指定的文件添加到暂存区git add .
:把所在目录下的所有文件添加到暂存区git commit -m '版本信息'
:把暂存区的操作真正地提交到git仓库git log
:查看提交版本的log
我们先创建一个txt文本,以提交txt文本为例,提交后查看日志,日志清晰地记录了提交版本的哈希值、提交人的信息、提交的时间、提交的版本信息。
除了上面的方式提交版本外,还有一种方法可以一步到位,就是使用git commit -a -m '版本信息'
来提交,仔细看的话就会发现其实它是把add融合在一起了,想用哪种方式提交都是可以的,看你喜欢啦!
查看版本状态
一般在我们提交版本或对某些文件进行了一些修改时,我们如何知道修改的文件在版本控制系统中处于什么样的状态呢,是修改中、已添加到暂存区还是已经提交到仓库了呢?我们可以通过以下命令行来查看版本的状态,也可以说是查看工作区的状态。
git status
:查看工作区的状态git status -s
:以简洁的方式查看工作区的状态git status --short
:与上一个命令是一样的效果
工作区干净时
没有任何文件处于修改或添加中时:
文件被修改但未提交
在test.txt文本添加一行内容,保存后关闭,再次查看git状态,通过状态信息我们可以看到,test.txt这个文件被标红了,意思是说该文件被修改了,但是还未添加到暂存区,并且提示我们可以使用git add <file>
添加文件到暂存区,或者使用git restore <file>
丢弃工作目录中的修改。
也就是说在文件被修改后,文件还未添加到暂存区,而你已经关闭文件,又想要把修改的全部撤回,那么就可以使用该命令撤销修改的部分回到这个文件的上一个版本。
比如我修改了test.txt,在最后一行追加了“hello, git!”,使用了撤销命令后,再去查看这个文件,就会发现追加的最后一行已经不见了,还原到了上一个版本。
文件已添加到缓存
把test.txt添加到暂存区后查看状态,text.txt被标绿了,意思是说该文件已经添加到缓存,但是还未提交到仓库,并且提示可以使用git restore --staged <file>
把该文件从暂存区中撤销,重新放回到工作区中,放回到工作区中它是修改但未添加到暂存区的状态。
如下图例子,从暂存区撤销后,该文件再次处于被修改但未添加暂存区的状态。
如果选择不撤销,把文件提交到git版本库,那么工作树就会回到干净状态。
简洁的状态信息
上面中我们看到的状态信息都是比较详细的,如果我们不想看到太多信息,可以使用git status -s
查看简洁的状态信息,返回的内容分为以下几种:
- ?? 文件名:该文件是新创建的,还未添加到暂存区
- A 文件名:该文件是新创建的已添加到暂存区,但还未提交到仓库
- M 文件名:该文件被修改了,但还未添加到暂存区
- M 文件名:该文件已添加到暂存区,但还未提交到仓库
A就是add的意思,M就是modified。
如果工作树是干净的状态,使用该命令是没有任何信息的。
查看历史版本
顾名思义,就是查看历史提交的版本信息,几个常规查看命令如下:
git log
:不带参数最基本的查看git log --pretty=oneline
:只显示一行git log -p
:查看版本之间的差别git log -2
:查看最近的2个版本git log -2 p
:查看最近的2个版本之间的差别git log --stat
:查看大致的统计信息
参数之间是可以组合使用的,下面举几个例子:
忽略特殊文件
有时候我们不想让某些文件被添加到版本控制系统中,比如一些缓存文件,保存了账户信息或数据库密码的配置文件等,那么我们就可以配置.gitignore文件去忽略一些特殊的文件。
首先我们要在工作区的根目录下创建一个.gitignore文件,这个文件名是固定的,如果你直接在操作系统下重命名,可能会提示“必须键入文件名”,我们可以通过编辑器打开文件重新另存为即可。
匹配规则
.gitignore文件使用的是glob模式匹配,这个模式匹配有点类似正则表达式,常用的匹配语法如下:
字符 | 描述 |
---|---|
# | 注释 |
* | 星号,匹配0个或者任意个字符 |
[abc] | 匹配任何一个在括号内的字符 |
[0-9] | 0-9的字符 |
? | 匹配一个任意字符 |
/ | 结尾指定目录 |
! | 取反,就是否的意思,屏蔽了某文件,使用!后就不会再屏蔽 |
下面看一下.gitignore配置例子:
# .gitignore文件
# 屏蔽src文件夹
src/
# 屏蔽python缓存文件,python缓存文件有可能是.pyc,.pyo,.pyd
# 使用[cod]匹配三种文件
# *号表示匹配0个或者任意个字符,也就是说只要是.py[cod]结尾的文件都屏蔽掉
*.py[cod]
# 也可以精确屏蔽某一个文件
conf.ini
我们先在工作区新建一些对应的文件,看一下提交时是否有屏蔽:
把该工作区的文件全部添加到暂存区,然后提交到仓库,提交后我们可以看到它只提交了.gitignore文件和test_login.py文件。
强制添加
如果你在某些时候提交文件时,发现如何都提交不了,那你可以看一下.gitignore是否配置了忽略,如果你确实想添加这个文件,但又不想把它从忽略中移除,可以使用-f
强制添加,即git add -f 文件名
。
检查规则
还有一种可能,你在配置.gitignore时,可能会因为匹配规则编写时不够严谨,把不应该并屏蔽的文件给屏蔽了,但又不知道是因为哪一条规则引起的屏蔽,我们就可以使用git check-ignore -v <file>
命令来检查一下。它会告诉你是.gitignore文件第几行的匹配规则屏蔽了该文件。
版本比对
工作区比对
我们在工作区修改了一些文件,在还没有添加到暂存区时,可能会想要去查看修改后的文件相对于上一个版本具体作了那些修改,这些修改是否合适。我们就可以使用git diff
去比对一下当前的修改相对于上一个版本有哪些差别,需要注意的是,修改的文件必须是还未添加到暂存区的,以下为例:
暂存区比对
如果文件已经添加到暂存区,但又想与上一个版本比对一下呢?这时就要加上一个--staged
参数去比对,即git diff --staged
,用法与git diff
是一样的,这里就不做举例了。
版本间比对
除了可以查看当前与上一个版本的区别外,我们还可以指定两个版本查看它们间的区别。我们先查看一下git现在有哪些版本。
然后使用git diff 老版本 新版本
然后指定两个版本,来查看它们的区别,我们只需要复制一下版本的部分哈希值即可,注意这里是老版本在前新版本在后,如果反过来的话,返回的对比信息就是新版本在前,老版本在后。