一.什么是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.Git和GitHub有何区别
Git,是一个版本控制系统,实际上是一个工具,大多数都是基于命令行的。
GitHub,是一个使用Git作为版本控制的托管代码的网站,平台。
重点在于学习Git本身。
二.快速入门
1.安装Git
Git在多个操作系统均有相应的安装包。
使用windows系统。
还是一个典型的windows软件的安装
官网:https://git-scm.com/downloads/
这个表示加入了windows的path变量,意味着可以在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_id来reset。
回退如下:
此时,就已经切换到第二个版本。
更多详情见请继续阅读下一页的精彩内容: 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
如果是第一次安装 git,user.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,此时,master和dev都指向当前最新版本,但是HEAD指针已经指向了dev分支。
接下来,我们提交了新的版本,dev指向最新版本,而master则原地不动。
HEAD指向当前分支dev的。
当在dev分支上完成开发之后,可以将它合并到主分支master上。
合并时,需要先切换到master,意味着HEAD指向了master,合并的时候其实就是将master和dev的最新版本同步。
dev分支的使命已经完成,没有什么作用了,将其删除掉。只剩下一个主分支。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-05/143747.htm