介绍

无论是工作还是学习,或者是自己做笔记,我们都经历过版本更新,数据迭代这样的阶段,使用Git进行版本控制。

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

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

分布式版本控制git

每个人都拥有全部的代码,安全隐患!

所有的版本信息仓库全部同步到本地每个用户,这样就可以在本地查看所有历史版本,可以离线本地提交,只需在联网时push到相应的服务器或其他用户那里,由于每个用户那里都保存着所有的版本数据,只要有一个用户的设备没有问题可以恢复所有数据,但是增加了本地存储空间的占用。

Git是目前世界上最先进的分布式版本控制系统

Git的基本理论(核心)

工作区域

Git本地有三个工作区域:工作目录,暂存区,资源库,如果加上远程的git仓库就可以分为四个工作区域,文件在这四个区域之间转换关系如下:

  • workspace:工作区,就是你平时存放项目代码的地方
  • index、stage:暂存区,用于临时存放捏改动,事实上它只是一个文件,保存即将提交到文件列表信息
  • Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据,其中HEAD指向最新放入仓库的版本
  • Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目中的一台电脑用于远程数据交换本地的三个区域确切的说应该是git仓库中HEAD指向的版本

工作流程

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

因此git管理的文件有三种状态:已修改,以暂存,已提交

Git的基本配置

查看当前用户的配置

1
git config --global -l

用户名和邮箱配置

1
2
git config --global user.name “username” #名称
git config --global user.email “email” #邮箱

Git项目搭建

本地仓库搭建

创建本地仓库的方法有两种一种是创建全新的仓库,另一种是克隆远程仓库

1、创建全新的仓库,需要用Git管理的项目的根目录执行:

1
2
# 在当前目录新建一个Git代码库
git init

2、执行后可以看到,仅仅在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录里面。

克隆远程仓库

1、另一种方法是克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地

1
2
# 克隆一个项目和它整个代码历史(版本信息)
git clone url

2、去github上克隆一个测试!

Git的基本操作

查看文件状态

git status 命令用于查看在你上次提交之后是否对文件进行再次修改

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

git add命令

git add 命令可将文件添加到暂存区

1
2
3
4
5
6
git add .
# 将当前目录下面所有文件添加到残存区
git add [file1] [file2]
# 将一个或多个文件添加到暂存区
git add [dir]
# 添加指定目录到暂存区,包括子目录

git commit命令

git commit命令将暂存区内容添加到本地仓库中

提交暂存区到本地仓库中

1
git commit -m "备注信息"

提交暂存区指定的文件到仓库区

1
git commit  [file1] [file2] ... -m "备注信息"

-a参数设置修改文件后不需要执行git add命令直接提交到本地仓库中

git reset回退版本

git reset命令用于回退版本,可以指定退回某一次提交的版本

重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变

1
git reset  [HEAD]

–soft 参数用于回退到某个版本

1
git reset --soft HEAD

–hard 参数用于撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交

1
2
3
git reset --hard HEAD
git reset --hard origin/master
# 将本地的状态回退到和远程的一样

注意:谨慎使用–hard参数,它会删除会退点之前的所有信息!

HEAD说明:

  • HEAD表示当前版本
  • HEAD^ 上一个版本
  • HEAD^^ 上上一个版本
  • HEAD^^^ 上上上一个版本
  • 以此类推…

另外^符号可以使用~数字代替例如HEAD~0表示当前版本

另外也可以使用git log查询出的id进行回退版本

git rm命令用于删除文件

如果只是简单的从工作目录中手工删除文件,运行git status时就会出现changes not staged for commit的提示,git rm删除文件有多种形式

将文件从暂存区和工作区中删除

1
git rm file

如果删除之前修改过并且已经放到了暂存区域,需要使用 -f 选项强制删除

如果想把文件从暂存区删除,但仍希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,就可以使用 --cached 选项

git mv 命令

用于移动或重命名一个文件、目录或软链接

1
git mv [file] [newfile]

如果文件名已经存在,但还是要重命名它,可以使用 -f 参数

git log查看命令提交历史

git 提交历史一般常用两个命令:

  • git log 查看历史提交记录
  • git blame 以列表形式查看指定文件的历史修改记录

git log

在使用git提交了若干更新后,或者是克隆某个项目,想查看一下提交历史可以使用 git log 命令查看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ git log
commit d5e9fc2c811e0ca2b2d28506ef7dc14171a207d9 (HEAD -> master)
Merge: c68142b 7774248
Author: runoob <test@runoob.com>
Date: Fri May 3 15:55:58 2019 +0800

Merge branch 'change_site'

commit c68142b562c260c3071754623b08e2657b4c6d5b
Author: runoob <test@runoob.com>
Date: Fri May 3 15:52:12 2019 +0800

修改代码

commit 777424832e714cf65d3be79b50a4717aea51ab69 (change_site)
Author: runoob <test@runoob.com>
Date: Fri May 3 15:49:26 2019 +0800

changed the runoob.php

commit c1501a244676ff55e7cccac1ecac0e18cbf6cb00
Author: runoob <test@runoob.com>
Date: Fri May 3 15:35:32 2019 +0800

--oneline选项查看历史记录的简洁版本

1
2
[root@yyt yyt]# git log --oneline 
a0c6c01 修改了mysql文章置顶,运行时间

git blame

以列表的形式显示指定文件的修改记录

1
git blame file

git remote在远程仓库的操作

显示所有远程仓库

1
git remote -v

显示某个远程仓库的信息

1
git remote show 链接

修改远程仓库地址

1
git remote set-url origin 项目地址

添加远程仓库

1
git remote add origin 项目地址

删除远程仓库

1
git remote rm origin

修改仓库名

1
git remote rename 旧名 新名 

git pull命令

git pull 命令用于从远程获取代码并合并本地的版本

1
git pull 远程主机名 远程分支名:本地分支名

忽略文件

有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等

在主目录下建立“.gitignore”文件,此文件有如下规则:

  1. 忽略文件重的空行或者以#号开始的行将会被忽略。
  2. 可以使用Linux通配符。例如:*代表任意多个字符,问号表示一个字符,方括号表示可选字符范围,大括号表示可选字符串等。
  3. 如果名称的最前面有一个感叹号,表示例外规则将不被忽略。
  4. 如果名称的最前面是一个路径分割符/表示要忽略的文件在此目录下,而子目录中的文件不忽略。
  5. 如果名称的最后面是一个路径分隔符,表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)
1
2
3
4
5
6
#为注释
*.txt #忽略所有.txt结尾的文件
!lib.txt #但lib.txt除外
/temp #仅忽略项目下的todo文件,不包括其他目录temp
build/ #忽略build/目录下的所有文件
doc/*.txt #会忽略doc/1.txt文件,但不包括doc/子目录/1.txt