感谢支持
我们一直在努力

分布式版本控制系统 Git 详细教程

一.什么是Git
1.Git是什么

Git是目前世界上最先进的分布式版本控制系统(没有之一)。

实际上版本控制系统有如下几个:

1) CVS

2)  SVN

3) Git

这个概念中有两个疑问:

1. 什么是版本控制

2.什么是分布式?

2.为什么需要Git

大家熟悉的一个场景:论文

类似的场景,在软件开发中更为普遍。

分组完成项目的时候

1)多人协作,是如何完成的?

2)开发自己的任务的时候,从写第一行代码开始到整个结束,有没有来回修改?

如何来解决这些问题呢?

早期,在项目规模还没有那么大的时候,大家制定一些规则,手动解决就行。

随着软件和项目规模的增大,这种手动方式,效率太低,问题太多,不能满足开发的需求。

需要有相应的工具来解决于是就出现了 版本控制系统。

1)CVS,功能比较弱,现在很少使用

2)SVN,功能比较完善,使用比较多

3)Git,功能最强大的,也是最受欢迎的。

所以,版本控制可以帮助我们实现两件事情:

1)自动记录每次的修改,并且可以方便的切换到任一版本

2)可以完成多人协作开发

3.GitGitHub有何区别

Git,是一个版本控制系统,实际上是一个工具,大多数都是基于命令行的。

GitHub,是一个使用Git作为版本控制的托管代码的网站,平台

重点在于学习Git本身。

二.快速入门
1.安装Git

Git在多个操作系统均有相应的安装包。

使用windows系统。

还是一个典型的windows软件的安装

官网:https://git-scm.com/downloads/

这个表示加入了windowspath变量,意味着可以在cmd窗口中使用。

安装完成之后,我们可以在任意目录下,点击鼠标右键,弹出右键菜单,有两个选项:

1.Git GUI Here

2.Git bash Here

Git GUI here,其实就是一个可视化的界面,使用鼠标就可以完成相应操作。如下:

Git bash Here

命令行窗口

2.使用流程

基本的使用流程如下:

1)初始化一个Git仓库(git init

2)设置用户名和邮箱

3)添加文件到仓库(git add 文件名1 文件名2

4) 提交 git commit -m 说明文字)

5)查看版本 git log

6)回退 git reset –hard HEAD^/commit_id

(1).初始化一个Git仓库(git init

首先,需要指定我们的项目目录,比如此处放在project目录下,

使用git init 来初始化一个Git仓库。

在当前目录下打开 git bash 窗口,输入git init命令,如下:

repository: 仓库

相应的,会在当前目录下,创建一个隐藏的.git目录,

我们在开发的时候,是不能去动这个目录的。

如下:

(2).设置用户名和邮箱

使用

git config user.name 用户名

git config  user.email 邮箱

(3).添加文件到仓库(git add 文件名1 文件名2

我们需要在project目录下,开始开发。

使用 git add 文件名,将其添加到版本库

(4).提交 git commit -m 说明文字)

使用git add只是将其添加到git 的暂存区,需要使用git commit进行提交,同时必须要加上说明文字。

(5).查看版本 git log

接下来,需要重复3~5

比如,我新建一个base.css文件,将其引入到 index.html中,所以,又需要add

再次commit

(6).回退 git reset –hard HEAD^/commit_id

第三天开发,发现需要回到第一个版本

使用 git reset –hard HEAD^会退到上一个版本。

我又后悔,需要再回到第二个版本。这是当前版本的未来版本,必须使用commit_idreset

回退如下:

此时,就已经切换到第二个版本。

更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2017-05/143747p2.htm

三.Git基本概念及原理
1.基本概念

在使用git的时候,通常会提到如下几个术语:

1)工作区

2)版本库

3) 暂存区

4)分支

当我们使用git init命令初始化仓库的时候,创建一个隐藏的目录—- .git

这个文件夹将我们的项目目录一分为二:

1.版本库(仓库)

2.工作区

1)凡是在.git目录中的,都是属于版本库的

2)凡是在.git目录之外的,都是属于工作区的。

我们的项目目录

一旦我们创建了版本库,在开发的时候,就不能对版本库目录做任何的操作。

我们开发的操作都是在工作区进行的,新建、修改、删除都是在工作区进行的。

也就是说,我们的常规开发都是在工作区进行的。

对于工作区的内容,其实就是我们常规的和项目相关的文件和文件夹。

对于版本库,还需要进一步的去看看里面有什么东西。

版本库,又一分为二:

1) 暂存区

2)主分支

暂存区:stage,临时保存文件的一个区域,就相当于是一个中转站。工作区中的任何内容都是需要通过暂存区,才能提交真正的分支上去。

主分支:master,它才是保存各个版本的地方

2.基本原理

理解Git的关键在于 暂存区 的理解。

前面我们使用Git提交版本的时候,其实分成了两步:

1) 使用git add命令

2)使用git commit命令

实际上,我们在将工作区的文件提交给版本库的时候,首先是将其添加到 暂存区,然后才是从暂存区再提交给主分支。

1)git add ,将文件添加到 版本库的 暂存区。

2)git commit ,将暂存区所有的文件一次性提交个 主分支。

我们不能直接从工作区到 主分支,必须要经过暂存区。

结合命令再次来看看这个过程。

使用 git status 可以查看 git版本库的状态。

text项目目录下,新建一个版本库,目前工作区没有任何内容,如下:

使用 git status命令,查看 版本库的状态:

在工作区中,新建一个index.html文件,如下:

再次使用 git status查看,如下:

采纳它的建议,使用git add命令,将index.html添加到版本库的暂存区,如下:

再次查看状态,如下:

说明这个文件,已经被放入暂存区了。

使用git commit 将其从暂存区提交到 主分支,如下:

再次查看状态:

说明暂存区空了。

可以参考图示。

四.基本操作

实际上,就是几个常见命令,包括如下几个:

1)git config

2)git init

3) git add

4)git commit

5)git status

6)git rese

Git可以完成两件事情:

1.版本控制

2.多人协作

此处,讨论都是针对个人的版本控制。

1.git config

用户获取/设置git的一些配置。

获取git的配置,使用 git config –list

 

我们重点关注的就只有 用户名和邮箱的一个设置

git config user.name 用户名

git config user.email 邮箱名

如果需要设置全局的,可以加 –global

如果是第一次安装 gituser.name user.email是没有的,所以需要设置一下。

2.git init

用于初始化一个版本库。

可以用两种方式来初始化

1.先创建一个目录,在这个目录下,使用git init命令

2.直接使用 git init 项目名称,初始化

 

不管是哪种方式,都会在 项目目录下,新建一个.git目录,该目录就是 版本库,这个目录是隐藏,也不允许用户进行任何的操作。需要对版本库进行操作,使用命令操作即可。

3.git add

作用:将文件从 工作区 添加到 版本库的 暂存区

格式:git add 文件名1 文件名2 文件3

此处,也可以添加文件夹。

查看状态,如下:

4.git commit

作用:将所有文件一次性从暂存区 提交给 主分支,才会形成一个版本。

格式:git commit -m 说明文字

 

一旦commit,就会将其提交个主分支,形成一个新的版本,同时会将暂存区清空。

在使用的时候,需要注意的一个问题  —- 必须要添加说明文字。

添加说明文字有两种方式:

1)使用 -m 参数 (推荐)

2)进入vi编辑器,然后编辑

如果在git commit的时候,没有加上 -m ,就会进入vi编辑器,如图:

 

vi编辑器中,两种种模式:

1)输入模式,允许用户输入内容

2)命令模式,可以执行相关的一些命令

默认进来是一个命令模式,切换到输入模式,按下 i,就可以输入相应的说明文字。

按下ESC键,就退出输入模式,进入命令模式。

如果想保存退出,需要输入 wq

 

推荐大家使用-m参数来添加说明文字。

5.git status

作用:查看版本库的状态,重点就是暂存区。

格式:git status

重点就是 读懂不同的情况下的说明信息:

 

6.git reset

作用:用于切换到某一个版本

格式:git reset –hard HEAD^ /commit_id

一旦我们将项目形成多个版本,就可以使用git reset切换到任意版本。

通常需要查看当前版本库的日志信息。使用git log来查看,如下:

现在就可以使用git reset命令回退。

如果是会退到之前的版本,可以使用HEAD关键字和commit_id。

HEAD^,回退到之前的一个版本

HEAD^^,回退到之前的两个版本

HEAD^^^,回退到之前的三个版本

如果大于3的话,HEAD^10

更好的方法就是使用 commit_id。

如果需要回退到当前版本的未来版本,必须使用commit_id。如果使用HEAD,会回退到更小的版本。

再回到未来版本时,要分两种情况:

我已经使用了git log查看过版本情况,直接拿到那个commit_id即可。

如果没有使用git log查看过版本,使用git reflog可以查看整个commit_id情况。

Git可以完成两件事情:

1. 版本控制

2.多人协作开发

如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发。

如果有多个开发人员共同开发一个项目,如何进行协作的呢。

Git提供了一个非常好的解决方案 —- 多人协作开发。

1.多人协作原理

典型的做法是,首先创建一个git服务器,被多个人所操作。

 

1.多人协助实现

分为如下几个步骤:

1.创建一个git裸服务器 (git init –bare

2.从裸服务器将版本库克隆至本地(git clone

3.本地常规操作

4.推送版本至服务器 git remote +  git push origin master

5.从远程服务器拉取版本(git pull

一般而言,我们需要在Linux服务器上来搭建我们的git版本服务器,每个公司都会有。

由项目负责人开始。

我们现在是windows系统上模拟这个操作过程。

(1).创建一个git裸服务器 (git init –bare

由负责人来完成的。服务器新建一个项目目录,如git-server

 

创建完毕,我们发现git-server内容和上次的不太一样。

上次使用git init 创建之后,会有一个隐藏的.git目录。目录中的才是现在看到的内容。

也就是说,现在根本就没有.git目录了。

这就意味着在这个目录中,不能做常规的开发。

(2).从裸服务器将版本库克隆至本地(git clone

git版本服务器,一般是不做任何开发工作的。如果要开发项目,就需要将版本库从服务器克隆到本地。

假设有一个程序员甲,开始自己的工作了。

使用命令 git clone git版本服务器地址

windows下面,就是使用绝对路径,如下:

 

然后,甲就可以在这个目录下,进行常规开发。

我们可以在这个目录下,创建自己的工作区目录,完成常规开发。

(3).本地常规操作

甲可以,在本地进行常规开发。

这个过程,可以反复进行。

我的第一个模块(功能)开发完毕。需要将其推送到服务器。

(4).推送版本至服务器 git remote +  git push origin master

当在本地完成一个模块(功能),需要推送到服务器,供其他同事使用。

第一件事情,需要知道服务器在哪儿?

git remote

第二件事情,直接推送即可

git push origin master

其中origin就是使用git remote得到的远程服务器的名称。

master表示是主分支。

 

对于甲来说,它的工作已经告一段落了,该轮到乙程序员出场了。

乙程序员,首先将版本库从git服务器上克隆到本地。

 

打开这个目录,然后进可以看到最新新的内容,如下:

对于乙而言,可以在本地进行常规开发。与此同时,甲继续他的常规开发。

模拟乙程序员在本地的开发。

将完成的工作,推送到git服务器。

回头,再看看甲的开发。

甲收工,准备下班了。在下班之前,需要将最新版本推送到git服务器。

开始使用命令,执行如下:

结果出错了,why

之所以会出错,原因在于:其他程序员已经将最新的一个版本提交到git服务器上,但是你在提交之前,已经不是最新的。

在这种情况下,甲,需要先从服务器拉取最新的版本。

(5).从远程服务器拉取版本(git pull

在多人协助开发时,每个开发人员在推送自己的最新版本时,都需要确保当前版本是最新的,所以就需要先获取最新版本,也就是说需要从服务器拉取最新版本到本地。

需要使用 git pull命令

 

如此一来,甲当前就是最新的版本。

然后再次使用 git push 命令推送至服务器。

 

接下来需要分两种情况:

如果有新的开发人员加入进来,重复2~5过程。

如果不是新的开发人员,重复3~5过程。

比如,对于乙而言,其实它现在已经不是最新的版本了,所以需要使用 git pull 拉取最新版本。

 

所以,对很多开发人员而言,一打开电脑,马上先git pull,拉取最新的。然后进行常规开发,

开发完毕之后,在git push之前,还需要使用git pull再拉取一遍。

如果还有一个新的程序员丙,加入了,怎么办呢?

需要先git clone

然后就进行常规开发,推送版本、拉取版本。

在整个协作开发时,有时候会出现冲突。通常都是由于开发人员分工不明确导致的,所以如果出现这种情况,需要两个程序员协商解决。

3.分支
(1).什么是分支

在前面所有的操作当中,我们一直使用的是master主分支。以刚才的项目版本控制为例

有四个版本,在我们的版本库中,都是存在于master主分支上的。

图示如下:

如果我们的项目本身比较简单,只需要有主分支master就够了。

但是,实际上并不是这样的。

在这个世界上,有一种软件叫做开源软件源代码开发,所有的人都可以免费使用。

开源软件是由世界上无数的程序员共同来开发。

每个程序员都可以创建一个自己的分支,这个自己分支和主master完全独立的两个分支。

相应的,每个程序员都可以拥有自己的分支,可以进行任何的开发,此时和master没有什么关系的。

一旦开发完毕,就可以将你的分支合并到主分支上去。

什么时候会用到分支呢?

假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险,怎么办?

你可以创建一个属于自己的分支,别人看不见,还继续在原来的分支上工作,而你在自己的分支上进行开发,等开发完毕,合并即可。

在开源世界中,需用大量的程序员共同维护一个项目。也是需要使用分支,如Jquery

(2).分支的基本操作

基本操作有如下几个:

1. 查看当前分支 git branch

2. 创建分支 git branch 分支名)

3.切换分支(git checkout 分支名)

4.分支上的常规操作

5.分支的合并 git checkout master + git merge 分支名)

6.分支的删除(git branch -d 分支名)

查看当前分支 git branch

 

其中的 * 表示 当前分支。

默认情况下,只有一个master主分支。

 

创建分支 git branch 分支名)

 

切换分支(git checkout 分支名)

创建完成之后,就有了一个新的分支,但是并没有立即切换到新的分支,需要使用命令切换一下。

分支上的常规操作

已经切换到b1分支上,就可以在b1分支进行常规开发和操作。

 

使用git add git commit提交。

使用git log查看即可:

 

与之对应的,我们再次切换到master分支上看看是什么情况:

 

说明在master分支上,并没有新提交的内容。

分支的合并 git checkout master + git merge 分支名)

分支的合并,一定是在 主分支上进行的。

只能在主分支合并其它分支。

需要两步:

1) 切换到主分支

2) 使用git merge 分支名 进行合并

 

再次查看master的一个log情况,如下:

 

分支的删除(git branch -d 分支名)

使用命令git branch -d 分支名

 

如果你发现你的分支中所做的开发没有任何用处,也可以不合并直接删除。

(3).分支的原理

分支的过程及原理如下:

默认只有master的情况下,master总是指向最新的版本,而HEAD指针总是指向master的。

 

现在,我创建了一个新的分支dev,将当前分支指定为dev,此时,masterdev都指向当前最新版本,但是HEAD指针已经指向了dev分支。

 

接下来,我们提交了新的版本,dev指向最新版本,而master则原地不动。

HEAD指向当前分支dev的。

 

当在dev分支上完成开发之后,可以将它合并到主分支master上。

合并时,需要先切换到master,意味着HEAD指向了master,合并的时候其实就是将masterdev的最新版本同步。

 

dev分支的使命已经完成,没有什么作用了,将其删除掉。只剩下一个主分支。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-05/143747.htm

赞(0) 打赏
转载请注明出处:服务器评测 » 分布式版本控制系统 Git 详细教程
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏