1、关于Git
GitGit是在2005年, Linux系统的创建者inus Torvalds为了帮助全球的开发者维护Linux系统内核的开发而开发的自己的开源分布式版本控制工具,是一个版本控制系统。
在程序开发中我们会遇到很多问题,比如遇到电脑出问题,自己的代码找不回来了。或者自己在开发新功能时将原本好的代码改得面目全非,怎么都回不去了。Git的作用就是方便将代码回退到以前的版本,Git也更利于我们在开发中协同工作,每个人都有自己的分支,出问题时可以把责任追溯到个人,避免背锅(此处必须手动狗头)。
现在市面上的版本控制系统除了Git外还有很多,可以和Git一较高下的就是SVN,但现在早已是Git的手下败将,我通过给它们做一个简单的对比来说明Git的优势所在。
Git和Svn的比较:
SVN是集中式版本控制统,版本库是集中放在中央服务器的,而开发人工作的时候,用的都是自己的电脑,
所以首先要从中央服务器下载最新的版本,然后开发,开发完后,需要把自己开发的代码提交到中央服务器。所以首先要从中央服务器下载最新的版本,然后开发,开发完后,需要把自己开发的代码提交到中央服务器。这样做有以下几点弊端。
- 服务器单点故障将会导致所有人员无法工作;
- 服务器硬盘损坏将会导致项目的记录全部消失;
Git虽然也是一个代码仓库,但是它分为本地仓库和远程仓库,它使得每一个客户端都保存了完整地历史记录,所以即使服务器出现故障,也可以通过客户端的记录得到恢复这就是Git相较于SVN的最大优势。
2、Git的基本使用
对于Git的基本使用这里我会分很多小节来一一讲解,使用之前肯定是要安装的,关于安装就是下载后一步步next的事情我也就不赘述了,就挂一个Git的下载链接吧
https://git-scm.com/downloads
如果还是不清楚请参照 Git安装和使用
Git的工作流程
具体的工作流程如上图所示,添加和提交都是通过Git命令来实现,关于本地仓库到工作目录之间的工作流程等后面学了分支以后再讨论。
Git常用命令
先来看一下Git的一些常用命令:
- git init--------------初始化,创建git仓库
- git status--------------查看git状态(文件是否进行了添加、提交操作)
- git add--------------添加,将指定文件添加到暂存区
- git commit--------------提交,将暂存区文件提交到历史仓库
-
git log--------------查看日志(git提交的历史日志)
下面我们来一个个走一下这些命令:
首先在任意位置新建一个文件夹,比如我在桌面新建一个文件夹取名为test,在文件夹内单机右键,选择Git Bash Here(这是选择命令行执行的方式,另外一个Git GUI Here是选择图形化工具执行),输入git init
如上图所示,这就初始化成功了,在文件夹中点击查看,将隐藏的项目前面勾选上,就可以看到文件夹内部多了一个git文件夹。
然后我们在文件夹内部新建一个测试的text,取名为test,这里先不执行添加操作,先查看状态,输入git status,结果如下:
我们可以看到有一个红色的test.text,红色文件就代表还没有添加到暂存区的文件,我们接着把它添加到本地仓库后再查看状态,看看有啥变化。
我在添加的时候遇到错误,提示:pathspec 'test' did not match any files
这是因为我们没有进入到目录(真的莫名其妙),需要先进入到当前目录,在git中输入cd +文件夹的绝对路径,比如我的是:cd D:\test
再次查看状态后可以看见test.text变成了绿色,代表已经提交到暂存区。
将它提交到本地仓库使用 git commit -m'frist commit it'
git commit 后面跟一个-m'',单引号里面存放的是提交的一些说明。
查看日志也很简单了,直接输入git log就可以了。
这里查看日志时commit后面这一串是提交文件的一个唯一索引标识。
Git切换不同版本
使用命令"git reflog"查看所有log并查看每个版本的唯一索引以便切换版本
使用命令 "git reset --hard 唯一索引" 来切换版本
举个例子我们把test文件夹里面的test.txt文件进行编辑,加入一句话“这是版本2”,(版本1是我们第一次提交的空白test.txt)然后在添加并提交一次。
如上图我们先将修改后的test.txt添加到暂存器并提交到本地仓库,然后输入git reflog查看所有提交记录(即所有版本),可以看到有两次记录,每条记录前面的黄色字体就是他们各自的索引标识(只保留了前几位),现在的test.txt文件已经被添加了文字,我希望回退到第一版空白时候,如上图输入git reset --hard d1b7234即可,其中d1b7234是第一次记录的索引标识。HEAD->master会始终指向当前版本,比如我们现在再去查看log会发现HEAD->master会出现在第一个版本
Git分支工作流程
什么是分支?
分支是由每次提交代码的时候串成的一条时间线。
在分支当中存在一个指针master,它所指向的是主分支,一般是第一个创建的分支,除了master外还存在另一个指针HEAD,HEAD指向的是当前正在使用的代码版本。(上面由于我们只有一个分支,所以HEAD就指向master)。
对于分支的操作无非就是移动这两个指针
切换分支:改变HEAD指向的分支对象就可以了,
合并分支:比如我们创建一个新分支,这时HEAD指针就是指向新分支,master指向主分支,分支合并到主分支就直接让HEAD指向master就可以了。
创建和切换分支
创建分支的命令:git branch+分支名
切换命令:git checkout+分支名
查看当前分支下的文件:ls
下面来具体操作一下看看:
我们前面所创建的分支就是主分支,分支名就叫master
可以看到我们进命令窗口时后面括号里就显示了当前所在分支(master)
可以看到切换以后后面括号里面变成了master2,证明我们一家成功切换到新分支master2下了,紧接着查看新分支下的文件。
这里有点想不通,我新建的分支下竟然会有主分支的文件,按理来说分支应该是并行且互不影响的,这里等我去查阅资料再来修补。
合并分支和删除分支
合并分支命令:git merge+分支名
删除分支:git branch -d+分支名
查看仓库所有分支:git branch
我们在分支吗master下执行git merge master2就是把分支master2合并到主分支master,合并以后分支master2就没用了,所以我们执行 ^C,手贱按错了)
开始那张图就有了结果
本地仓库和工作目录之间的操作就是切换分支(通过切换分支将代码拉取到工作目录)
远程仓库的工作流程
远程仓库:一个代码托管平台(部署在公网上的一个网站)。
工作流程:
程序员A将代码从本地仓库推送到远程仓库,程序员B克隆代码到自己的本地仓库,注意克隆是完全复制,程序员B对代码进行更新以后将更新后的代码推送到远程仓库,程序员A再拉取代码就可得到更新后的代码了,所以远程仓库能够大大增加协同开发的效率。(注意拉取和克隆的区别)
常见的远程仓库
1、GitHub:
域名:https://github.com
介绍:GitHub是全球最大的开源项目托管平台,俗称大型程序员社区化交友网站,各类好玩的开源项目,只有想不到,没有找不到。
2、码云(和我爸爸同名)
域名:https://gitee.com
介绍:全国最大的开源项目托管平台,良心平台,速度快,提供免费私有库。
我一直用的都是gitee托管平台,个人觉得还是很良心的,GitHub因为开始使用时网速慢进不去,到现在也一直没用过。
远程仓库的创建(SSH公钥配置)-------以gitee为例
先来创建一个远程仓库
创建好远程仓库之后,就可以推送本地代码到远程仓库了,但在推送之前需要先进行SSH公钥的配置,至于SSH是什么?学过网络工程和参加过软考的同学对他应该都不陌生,它是一种协议,这里就不多做解释了。我把生成SSH公钥归为一下几个步骤:
1、设置Git账户
2、生成SSH公钥
3、设置账户公钥
4、公钥测试
一步步来。。。。。。。
1、设置Git账户
我们先查看自己的Git账户和邮箱,这里用到两个命令
git config user.name ----------------------查看git账户
git config user.email ----------------------查看git邮箱
具体命令操作如下:
再将账户和邮箱设置为全局账户和邮箱,这里又需要用到两个命令
git config --global user.name "账户名称"
git config --global user.email "邮箱"
具体操作如下所示:
最后一个命令cd ~/.ssh是用来查看是否生成过历史公钥,如果输出如上图所示则表示没有生成过历史公钥。
2、生成SSH公钥
执行完第一步以后就可以开始生成公钥了,生成公钥的命令是:
ssh-keygen -t rsa -C "邮箱"(希望大家能记住吧,反正我是一只记不住)
接下来就是生成公钥的一些选项,都选择默认就好了,敲三次回车,直到看到如下界面表示生成成功
那怎么查看我们生成的ssh公钥呢?
输入命令:cat ~/.ssh/id_rsa.pub
就可以看到我们的公钥了,如下图:
3、设置账户公钥
将刚刚查询到的公钥粘贴到图示位置,输入密码,创建成功!
本地代码推送至远程仓库
这里需要用到两个命令
git remote add 自定义名称 仓库URL地址
git push -u 自定义名称 分支名
第一个是关联远程仓库,将URL地址与自定义名称关联,其实就是给仓库URL地址去一个别名,方便后面代替,比如 git remote add first [email protected]:zzp_msh/myfirstgit.git 就是给URL地址取个别名叫first。
第二个推送就不说了,直接看看实际用处。
推送成功后我们刷新仓库能看到已经有文件上传到仓库了
值得注意的是我们在push前必须要现在本地仓库添加东西,不然会没有推送内容,也就是说需要先进行git add和git commit操作。当然在此之前配置SSH公钥也是必不可少的。
远程仓库操作——克隆拉取
这里也是用到两个命令:
git clone 远程仓库地址
git pull 远程仓库名 分支名
第一个是克隆的命令,第二个是用于拉取远程仓库的更新的命令
这里好像出了点问题,但他还是正常克隆了远程仓库的文件
再来看看拉取操作,我新建一个test3.txt,把它提交到远程仓库,然后在本地仓库拉取更新,看看能不能拿到test3.txt。
执行完这一步之后会发现远程仓库里面多了个test3.txt,接下来我们再来拉取更新,
这样就拉取成功了,再去查看你拉取的文件下就多了个test3.txt.