一. 什么是Git
1.Git是什么
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
我是一个任性的笨蛋,所以我把我的所有的项目的名字都和我很相似。第一个是Linux,现在是Git。
目前在用的有如下几种:
cvs (可以忽略)
svn
git
2.为什么需要Git
就以写毕业论文为例
这是一个很痛苦的过程。
在软件开发。
项目,已经完成了基本功能。可以使用了。
想在基本功能的基础之上,增加新的功能,此时有两条路:
直接在原来的代码上进行开发 (不可取)
先保存一个副本,继续开发 (可以,但是不好)
对后期的维护造成灾难。这还是其一。
更为重要的是在协同开发的时候,如果没有一个好的方案,项目的开发效率会大大降低。
团队开发的时候,除了代码本身,相互之间的协作是一个很重要的因素。
版本控制,就是可以解决上述这些问题?
自动记录每次的修改,并且可以方便的切换到任一版本-- 版本迭代
可以完成多人协作开发
3.Git和GitHub有何区别
Git,是一个版本控制系统,是一个工具,命令行的工具。
Github,是一个网站,(全球最大的同性交友平台),托管代码的平台。基于git版本控制系统的一个网站。
学习的时候,要学习Git。
二.快速入门
1.安装Git
Git,针对三大平台都有相应的安装包:
Linux
Mac
Windows
我们以windows平台为例。
下载地址:https://git-scm.com/downloads/
安装
安装到哪儿 - 任何地方
怎么安装 – 一路next下去
安装完成之后,我们的任何目录下,都可以使用右键菜单,运行窗口或图形用户界面
重点是学习 命令行的方式。
Ps:git bash,也可以作为windows的cmd窗口来使用。
最简单的安装:什么都不管,直接一路next到底。
2.使用流程
典型的使用流程如下:
初始化一个Git仓库(git init)
设置用户名和邮箱
添加文件到仓库(git add 文件名1 文件名2 )
提交 (git commit -m 说明文字)
查看版本 (git log)
回退 (git reset --hard HEAD^/commit_id)
(1).初始化一个Git仓库(git init)
一般来说,我们只要开发项目,就应该使用git。
在项目目录下, 使用git init
以.开头的文件/文件夹,通常都是隐藏文件/文件夹。
需要在操作系统中,设置显示隐藏的文件
可以看到这个.git目录
这个.git目录,就是我们的版本仓库。
版本仓库,是不能写代码的,是用来保存项目的信息的。
(2).设置用户名和邮箱
需要使用 git config --list,查看是否已经配置了用户名和邮箱信息:
如果有,就可以略过。
如果没有,就需要增加。
Git config user.name 用户名
Git config user.email 邮箱
用户名和邮箱,在本机使用,可以随意配置,如果要配合github,就需要github的账号。
(3).添加文件到仓库(git add 文件名1 文件名2 )
现在,就可以正式开发了。
当我认为,某一个功能已经开发完毕,需要形成一个版本。
将其添加到版本仓库
我添加了一个文件和一个文件夹。
(4).提交 (git commit -m 说明文字)
使用git commit -m 来提交到版本1。
(5).查看版本 (git log)
现在就可以查看版本信息了。
然后就是重复3~4 这两个步骤。
查看版本,
(6).回退 (git reset --hard HEAD^/commit_id)
可以使用 git reset --hard HEAD^ 可以回退到上一个版本。
查看项目目录:
发现,在第二个版本中增加的list.html已经不见了。
说明,我们已经回退到第一个版本了。
使用git log查看,如下:
我又后悔了,需要回到第二个版本。
可以直接使用 git reset --hard commit_id
如下:
三.Git基本概念及原理
在上述的操作流程中,有两个地方不太好理解。
就是git add 和 git commit。
需要搞清楚git的基本原理
同时,有一个概念需要搞清楚。
1.基本概念
要想用好git,必须搞清楚几个概念
工作区
版本库
暂存区
分支
所谓的工作区,就是我们进行常规开发的目录
所谓的版本库,就是指git init时创建好的.git目录。
一句话:凡是.git之外都属于工作区。(在当前项目目录下)
在版本库中,有分为:
暂存区 stage
主分支 master
暂存区,就是暂时存储文件的区域。
主分支,最终的版本存放的区域
2.基本原理
我们的代码,都是在工作区中进行的。
当我们认为某一个功能已经开发完毕,需要形成一个版本。此时,就可以仓库提交。
Git add 文件名
使用git add,只是提交到版本库中的state(暂存区),此时并没有形成真正的版本。而是在暂存区放着呢。
如果需要变成真正的版本,需要使用 git commit 命令
使用git commit 命令,可以将暂存区中存放的所有文件,一次性提交给主分支,形成一个版本。
在这个过程中,真正的核心是 ------ 暂存区
暂存区 可以理解为中转站
也可以理解为秘书。
对于刚才的那个流程,可以描述如下:
四.基本操作
git有两大核心功能:
版本控制
多人协作开发
目前介绍的基本操作,基于单人开发
1.git config
配置命令
查看所有配置 git config --list
获取配置 git config 配置名
设置配置 git config 配置名 值
2.git init
在项目开始的阶段,就需要使用git init 来初始化我们的版本仓库。
有两种用法:
git init 项目名称
先建好项目目录,然后在目录下使用git init
第一种方式:
第二种用法:
一旦使用了git init命令,就会创建一个.git目录,作为当前项目的版本仓库。
3.git add
作用:将我们的项目文件,添加到版本仓库中的暂存区。
用法:git add 文件名1 文件名2 文件名3
也支持文件夹。
可以使用git status 命令查看版本仓库的一个状态。
可以不停的重复这个动作。
4.git commit
作用:将暂存区中的文件,提交到版本库的主分支
格式:git commit -m 说明
在使用git commit命令的时候,一定要添加说明信息。
说明信息的添加,有两种方式:
使用 -m 参数,推荐
使用vi编辑器 不推荐
我们在使用git commit时,没有添加-m,就会进入vi编辑器的模式
vi有两种模式:
编辑模式,按 i 键
命令模式,按esc键
退出命令 :q
保存并退出 :wq
强制退出 :q!
推荐使用 -m 参数如下:
提交完成,就得到一个新的版本。
5.git status
作用:用于查看版本仓库的一些信息
格式:git status
在刚创建好版本仓库时,如下:
当我们在工作区,增加新的文件之后,使用git status查看如下:
它提示说,文件没有放入暂存区,没有和版本库建立任何关联。
并且提示我们使用 git add 将其加入到暂存区。
当我们使用 git add 命令将其加入到暂存区,再看查看,如下:
使用 git commit -m 提交,再次查看
可以这么理解:查看暂存区的情况。
6.git reset
作用:重置到指定的版本
有两种,软重置和硬重置,一般主要是使用硬重置。
格式:
git reset --hard commit_id (推荐)
git reset --hard HEAD^ ,回退到上一个版本
git reset --hard HEAD^^ ,回退到上上一个版本
git reset --hard HEAD^^^,回退到上上一个版本
…
git reset --hard HEAD^n ,回退到倒数第n个版本
举例,有如下三个版本:
当前是在最新的版本,回退到第二个版本。
回退之后,第三个版本中新增的那些文件就没有了。
后悔了,又想回到第三个版本。
分两种情况:
第三个版本的commit_id已知
第三个版本的commit_id未知
如果是已知的,简单,直接回退即可:
如果是未知。
比如,昨天刚回退一个版本,今天上班了,后悔了。
查看记录。 Git reflog
找到这个commit_id的快捷方式,就可以回退到任意版本。
五.多人协作开发
git还有一个非常强大的功能-- 多人协作开发
1.多人协作原理
多个人同时管理一个版本库。
典型的做法是,首先创建一个git服务器,被多个人所操作
2.多人协作实现
基本步骤如下:
创建一个git裸服务器 (git init --bare)
从裸服务器将版本库克隆至本地(git clone )
本地常规操作
推送版本至服务器 (git remote + git push origin master)
从远程服务器拉取版本(git pull)
说明:一般来说,服务器其实都应该是在linux操作上进行的。我们现在是在windows上模拟这个过程。
(1).创建一个git裸服务器 (git init --bare)
使用命令 git init --bare
在web03目录下,新建一个文件夹git-server,然后使用命令创建如下:
分析和前面git init的区别:
不同的地方:git init 命令会创建一个.git目录,而git init --bare则没有
相同的地方:所创建的那些文件是一样的
说明他们的功能是不一样的。
.git目录是 工作区和版本仓库的一个分界线。
既然现在没有了.git分界线,说明当前这个目录是一个整体,是版本仓库。
也就意味着,我们不能在这个目录上编写任何代码
所以,裸服务器只提供了版本仓库,不能在当前目录下编写任何代码。
团队的每一个程序员,都需要进行后续的操作。
(2).从裸服务器将版本库克隆至本地(git clone )
程序员甲,开始工作了。
将服务器上的版本库仓库克隆至本地。
格式: git clone 地址
此处,在windows操作系统下,地址可以使用绝对路径来表示。
(3).本地常规操作
克隆完这个版本仓库之后,就可以在本地进行常规开发及版本控制操作。
如,编写代码
这个功能已经开发完毕。
需要提交至版本库。
首先,还是在本地上面进行版本库的管理。
(4).推送版本至服务器 (git remote + git push origin master)
面临两个问题:
服务器在哪儿?
如何推送?
使用git remote 命令获取服务器的名称。
使用 git push 远程服务器名称 分支
此时,我们需要来看看乙是怎么操作。
说明甲已经上了一个星期的班,乙新加入进来的。
对于乙而言,需要重复上面的2~4过程。
第一步,需要clone至本地
对于乙来说,它目前得到的就是服务器上的最新版本。
第二步,乙在本地进行常规开发及版本控制。
乙负责编写样式。
完成开发任务,需要提交至新的版本。
在本地提交版本。
第三步,将本地的版本推送至服务器。
乙可以休息一下了。
(5).从远程服务器拉取版本(git pull)
又轮到甲来开发了。
在本地进行常规开发和版本控制。
本地提交版本。
然后,甲想把这个最新版本推送至服务器。
思考:
目前服务器是什么版本?自己的是什么版本?
应该得到什么样的版本?
服务器上的最新版本:
甲自己的最新版本
我们发现,甲的最新版本和服务器的最新版本不一致。
我们希望的版本:
如果直接push,让服务器很为难。所以它就报错。
此时,需要将服务器上的最新版本拉取到本地。然后再推送。
原则:在推送至服务器版本仓库的时候,需要确保自己的当前版本是最新的。
所以,就需要从服务器上拉取最新的版本。
不要使用git clone。
需要使用 git pull
Pull的时候,也需要增加说明。使用默认即可。
再次查看甲的版本,如下:
然后,就可以将这个推送至服务器了。
此时,服务器的最新版本就是甲的这个版本。
此时,乙就不是最新版本了。如果想使用最新版本。
所以,也需要使用git pull拉取。
在实际开发时。
一般是这样的
正式开始开发项目时,使用git clone 将服务器上的版本库克隆到本地。
各个程序员在自己的本地进行常规开发及版本控制。
拉取最新版本。
推送自己的版本到服务器。
注意一个问题:
如果两个程序员都操作了同一个文件,就会发生冲突。需要协商解决。
六.分支
1.什么是分支
假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险,怎么办?
可以有两种解决方案:
在本地进行开发并且进行版本控制,不要去同步到服务器。如果你想看看项目开发的怎么样,此时就有点麻烦。
可以使用分支来。
你可以创建一个属于自己的分支,别人看不见,还继续在原来的分支上工作,而你在自己的分支上进行开发,等开发完毕,合并即可。
branch,树枝。分支
2.分支的基本操作
(1).查看当前分支 (git branch)
默认,就只有一个分支 – master。
版本,都是基于分支的。
是在自己的分支上,创建各个版本。
(2).创建分支 (git branch 分支名)
命令 git branch 分支名
(3).切换分支(git checkout 分支名)
默认,当前分支是master,如果需要在其他分支上进行操作。
需要切换分支。
命令:git checkout 分支名
接下来,对版本的操作都是基于b1分支的。
(4).分支上的常规操作
原来在master上进行的常规操作,在其他分支都是一样的。
一旦切换到新的分支,所有的版本操作都是基于这个新的分支,原来的master就不动了。
在b1上查看版本
在master上,查看版本
很多的开源项目都提供了这么分支功能。
(5).分支的合并
分两步:
第一步,切换到主分支,git checkout master
第二步,使用merge命令,git merge 分支名
查看主分支,如下:
意味着将b1分支的版本都已经合并到master中去了。
(6).分支的删除
命令:git branch -d 分支名
在主分支上,使用这个命令,如下:
3.分支的基本原理
默认在主分支上,如下:
创建了一个dev分支,并且切换到dev分支,如下:
在dev分支上,进行版本控制操作
此时,所有的版本操作都是基于dev分支的,master就相当于冬眠了。
在dev分支上完成开发,合并到master主分支,如下:
dev分支的使命已经完成,需要删除dev分支
七.结合GitHub使用
1.什么是github?
必须要搞清楚git和github的区别。
Git是一个分布式版本控制系统,是一个工具。
GitHub是一个托管代码的网站,是一个平台。基于git的网站。
Github:全球最大的同性交友平台。
基本上,我们描述某一个程序员的水平,有两点是可以直接证明的:
技术性博客
自己的github账号,开源一些不错的代码/项目
2.GitHub的基本使用
https://github.com/
需要注册账号。
基于git的代码托管平台。
原来在git命令中完成的操作,就可以使用界面操作来完成。
可以新建一个版本仓库,对应于git init命令。
填写配置信息,如下:
编写文件
进行提交
点击这个按钮,底层做了什么操作?
相当于执行了 git add + git commit -m 两个命令。
3.将GitHub作为服务器完成协同开发
刚才上面的操作,就是一个单人的版本控制。
有多个人完成协同开发。
如果是项目没有那么多的秘密,可以使用这个github平台。
创建一个新的项目(版本仓库)
让其它程序员,把这个作为服务器。协同完成开发。
步骤:
第一步,需要将项目克隆到 本地。
Git clone https://github.com/diamondwang2013/web03
如下:
第二步,在本地,进行常规开发和版本控制。
在本地完成版本提交
第三步,推送至github
这一步,需要输入用户名和密码
然后查看,服务器如下:
接下来,如果需要从github服务器上获取最新的版本。就是要git pull命令即可。
还有一个操作,如下:
Github上,有很多好的项目(代码)。
我们可以在这里找到很多资源。
如何运行github上的项目
https://github.com/superman66/vue2.x-douban
查看说明:
然后进入项目目录
使用npm install 安装即可
八.总结
Git是什么东西?
Git是一个分布式的版本控制系统。
所谓的分布式,就是基于服务器的架构。
不需要时时刻刻都连上服务器。只要在推送和拉取的时候,连接服务器就可以。
其它的时候,我们在本地直接进行操作就可以了。
版本控制系统可以做什么?
对项目版本迭代,版本管理。
可以完成多人协作开发
具体的使用。
a.单人的版本管理操作
git init 初始化一个版本仓库
在工作区进行常规的开发
某个功能开发完毕,可以git add + git commit 提交到一个版本(master)
重复上述过程。
在开发过程中,如果需要回退到某个版本,使用git reset + git reflog
b.多人协作开发
- 创建一个git裸服务器
- 各个程序员,需要从服务器将版本库clone至本地
- 在本地进行常规开发及版本控制
- 从远处拉取最新的版本
- 推送新的版本至服务器
重复 2 ~ 5 过程
操作练习一遍。
可以将这个写入你的简历。