废话部分
为什么要写这篇文章?前段时间公司新开发一个项目需要用的git,领导问我会不会使用git,我说不会,然后被领导狠狠的鄙视了一顿。的确现在很多公司都在使用git进行版本控制,如果你不会使用git甚至连git都不知道,那么在公司里的地位肯定是要受到大家的嘲讽的。所以我恶补了一遍git相关的知识,并且将相关的一些知识记录下来希望能帮助到跟我一样需要用到的人,以免也受到其他人的鄙视。
正文部分
一、概念部分
在介绍git之前,先来说说这样一个概念:版本控制。
1、1 什么是版本控制
不知道你是否还记得以前读书的时候写大论文,我们的电脑上有个文件夹,里面是大论文1、大论文2、大论文3、大论文4........。有时候想找到某一版的论文需要将所有的文件都打开看一遍才能找到,很麻烦,这就是没有使用到版本控制。
版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。
- 实现跨区域多人协同开发
- 追踪和记载一个或者多个文件的历史记录
- 组织和保护你的源代码和文档
- 统计工作量
- 并行开发、提高开发效率
- 跟踪记录整个软件的开发过程
- 减轻开发人员的负担,节省时间,同时降低人为错误
可以简单的认识版本控制就是用于管理多人协同开发项目的技术。就跟前面提到的写大论文一样,如果没有进行版本控制或者版本控制本身缺乏正确的流程管理,在软件开发过程中将会引入很多问题,如软件代码的一致性、软件内容的冗余、软件过程的事物性、软件开发过程中的并发性、软件源代码的安全性,以及软件的整合等问题。
目前比较主流的进行版本控制的软件有如下这些:
Git
SVN(Subversion)
CVS(Concurrent Versions System)
VSS(Micorosoft Visual SourceSafe)
TFS(Team Foundation Server)
而其中影响力最大且使用最广泛的是Git与SVN了。
SVN是集中式的版本控制系统,而Git是分布式版本控制系统。
1、2 什么是Git
说完了版本控制,我们再来说说本文的重点Git。
Git是目前世界上最先进的分布式版本控制系统,在处理各种项目时都十分高效,而且非常的高大上。
前面说到SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器那里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。就好比我们一个小组进行写一篇文章,但是只有一个本子,那么就需要A写完了之后把自己的内容更新到本子上之后,那么B才能开始写,B写完了再把内容更新到本子上之后C再写....可想而知这样是比较麻烦的。而且集中式版本控制系统是必须联网才能工作。
而Git则是分布式版本控制系统,它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。就比如前面的写文章,如果是分布式的话,那么每个人都直接写就可以了,到时候提交的时候会自动进行合并。所以Git相较于SVN具有一定的优势。
1、3 如何安装Git
linux上安装git:
首先,可以在命令行输入git,看看系统有没有安装Git:
$ git The program 'git' is currently not installed. You can install it by typing: sudo apt-get install git 复制代码
linux系统的话可以使用下面的命令安装Git即可:
sudo apt-get install git 复制代码
windows系统安装:
打开Git官网下载windows版本的安装程序,然后按照默认选项安装即可。
安装完成后,打开Git bash软件,弹出一个类似cmd的命令行窗口,证明安装成功。
安装完成后,需要进行设置,在命令行输入以下代码设置你的名字和Email地址:
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com" 复制代码
并且可以通过下方的命令查看一下用户名和密码:
$ git config user.name $ git config user.email 复制代码
这时候如果没有报错,那么git就安装成功了。使用git config -l 可以查看现在的git环境详细配置:
#查看系统configgit config --system --list #查看当前用户(global)配置git config --global --list #查看当前仓库配置信息git config --local --list 复制代码
二、操作部分
前面介绍了git相关的一些基本概念,下面就开始进行git的具体使用操作。
Git本地有三个工作区域:工作区(Working Directory)、暂存区(Stage/Index)、本地资源库(Repository或Git Directory)。
如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。
Workspace:工作区,就是我们平时存放项目代码的地方
Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote:远程仓库,托管代码的服务器,可以简单的认为是项目组中的一台电脑用于远程数据交换,或者就是我们经常使用的github。
这四个工作区域之间的关系是这样的(图源自网络):
所以git的工作流程一般是这样的:
1、在工作区中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域;
3、将暂存区域的文件提交到git仓库。因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)。介绍完上面的内容,接下来我们就开始进行git操作的实战,只有动手才能够加深理解和记忆。
2、1 创建版本库
先来创建一个版本库:先在自己本地找一个合适的地方通过下面的命令创建一个空的目录:
$ mkdir gitspace 复制代码
然后进入该目录下,通过如下命令把这个目录变成Git可以管理的仓库:
$ git init 复制代码
可以看到在当前目录下多了一个 .git 的目录,这个目录是Git来跟踪管理版本库的,这样就把git仓库建好啦。
注:有些人可能看不到.git文件,那可能是因为这个文件是隐藏文件,所以需要设置显示隐藏文件即可看到。
在该目录下新建一个文本文件,并输入一些内容:
2、2 git add和git commit
接着使用git add命令将该文本文件添加到仓库中:
git add demo1.txt 复制代码
用git commit命令,把文件提交到仓库:
git commit -m "提交demo1.txt到仓库" 复制代码
注:-m后面输入的是本次提交的说明,也就是注释,可以随便输入,一般开发是就注释下这次修改的内容和说明等等。 这时候我们已经提交了一个版本的文件到仓库上了,那如果这时候需要修改该文件的内容。
可以先运行下下面的命令,查看仓库当前的状态:
git status 复制代码
当前没有需要提交的修改,而且,工作目录是干净的.然后我们修改下demo1.txt文件的内容:
再来看下仓库的状态:
2、3 版本信息
这时候可以看到demo1已经modified了,但是还没有提交修改。还可以使用git diff命令,查看修改的内容:
git diff demo1.txt 复制代码
我们接着使用上面的git add和git commit对修改的文件进行提交。
这时候我们已经提交了两个版本的文件到仓库中了,可以使用git log命令查看历史信息:
git log 复制代码
会显示用户的信息:姓名和邮箱,以及修改的时间和修改的内容,并且最早提交的记录在下面。
2、4 版本回退
如果我们刚刚添加的hello world内容有误,怎么办?那么就需要将文件回退到上一个版本,这时候就需要使用到git reset命令了。
git reset --hard HEAD^ 复制代码
版本已经回退到了上一个版本(提交demo1到仓库那个版本)。 注意:HEAD表示当前版本,则HEAD^表示上一个版本,那么上上版本就是HEAD^^。
这时候通过cat命令查看文件内容已经回滚到上一个版本了。
如果后来我们又发现,刚刚添加的hello word是对的,我们又想回到刚刚的那个版本怎么办呢?可以直接在文本添加然后在提交上去。当然这不是这里要说的办法。我们还是可以使用git reset命令来进行回滚到最新版本。这里使用的命令是:
git reset --hard commit_id 复制代码
这里不能用HEAD而必须使用commit_id ,因为最新版本在之前返回时已经被删除了,而这里的commitid可以通过刚刚提到的git log命令加上参数:--pretty=oneline来获取:
git log --pretty=oneline 复制代码
所以回滚到最新版本就是:
git reset --hard 75b036995f2ba5a6ebabaad22ce0a3d916c1b393 复制代码
如果仓库中有个文件是我们不想要的,那么如何处理呢? 新建一个demo2.txt文件,并且提交到git仓库中。
这时候就可以使用rm命令对不想要的文件进行删除。
rm demo2.txt 复制代码
rm命令删除的是工作区里的文件,如果要从版本库中删除文件,那么就需要使用git rm命令删除,并且删除后记得使用git commit命令提交。
git rm demo2.txt 复制代码
如果删除的是工作区的文件,后来发现删除错了,那么可以通过git checkout命令用版本库里的文件进行恢复:
$ git checkout -- demo2.txt 复制代码
2、5 远程库
上面是通过git在本地库进行版本控制,我们知道git还有一个远程仓库,这里我们使用github使得本地库和远程库进行仓库同步,这样远程库既可以进行文件的备份,又可以与其他人进行同步协作开发。
首先我们需要在github上注册一个账号,输入用户名、密码以及邮箱进行注册即可。
因为本地仓库和远程仓库是需要通过SSH秘钥进行加密传输同步的,所以我们需要配置SSH KEY。
我们注册好github后,在个人下面进入settings找到Add SSH and GPG Keys。
我们先需要通过git创建SSH秘钥,使用下面的命令:
ssh-keygen -t rsa -C "xxxxx@xxxxx.com邮箱账号" 复制代码
创建好秘钥之后我们可以发现在用户目录下有.ssh文件夹了,与.git类似
然后再点击"New SSH Key"进行SSH Key 的创建,填上Title,可以任意填写 ,把 id_rsa.pub 中的内容复制到Key文本框内,然后点击add ssh key。可以通过下面的命令查看秘钥: cat ~/.ssh/id_rsa.pub
处理完上面的准备工作后,我们可以在github上创建一个仓库。在右上角找到New repository钮,创建一个新的仓库
然后输入仓库的名称,然后其他的保持默认的选项点击create repository即可。
创建完成之后是这样的:
然后我们可以通过git remote add origin加ssh(这里指的是下面截图部分的内容)命令将本地仓库推送到远程仓库上:
git remote add origin ssh秘钥 复制代码
这时候本地库的文件还没有被推送上远程库。这时候需要使用到git push命令把当前分支 master 推送到远程库:
git push -u origin master 复制代码
因为远程库是空的,所以在第一次推送 master 分支时,要加上-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
这时候我们可以看到远程库已经有刚刚推上来的本地库文件了:
这样以后,只要本地库作了提交,就可以通过下面的命令把本地 master 分支的最新修改推送至GitHub:
git push origin master 复制代码
在团队协作进行项目开发的时候往往都会讲源码托管在远程库上,那么这时候如果来了个新人他想要获取项目的源码或者别人更新了远程的代码你需要获取最新的版本,那么就需要从远程库上将代码克隆下来。这里以github为远程库为例来说明如何从远程库克隆代码。
这里需要使用的命令是git clone命令,我这里之前有个远程库我将它克隆到本地库:
git clone 远程库的ssh或者是http地址也行 git clone git@github.com:JangYt/Vue.git 复制代码
2、6 合并分支
我们可以看到上面有个master,在git里面这个叫主分支,而往往在一个项目中为了项目需要我们不仅仅只有一个主分支,还会有什么dev分支等等其他分支。那么如何创建新的分支,并进行分支合并呢?
首先我们创建一个新的dev分支并切换到该分支上需要使用命令:
git checkout -b dev #git checkout 命令加上 –b参数表示创建并切换,相当于如下2条命令 git branch dev git checkout dev 复制代码
Switched to a new branch 'dev':切换到一个新的分支。我们还可以通过命令git branch查看分支,会列出所有的分支,当前分支前面会添加一个星号。
这时候我们在demo1.txt文件中新加内容:创建新dev分支,然后使用git add和git commit命令将它提交到本地库中。
然后通过cat 命令查看demo1.txt文件的内容:
这里的乱码是没有进行编码处理,这里先不管这个,只要知道添加的内容有就可以了。
然后我们再切换到master主分支上,通过cat 命令查看demo1.txt文件的内容:
这时候我们可以看到主分支上的demo1.txt文件是没有新添加的内容的。那么可以将dev分支上的内容合并到master分支上么?是可以的,在master分支下使用git merge dev命令即可
这时候我们可以看到dev分支的内容已经被合并到master分支上了。
如果我们不需要dev分支了,但是又怕别人把代码上传到该分支上怎么办?这时候可以使用下面的命令删除dev分支:
git brach -d dev 复制代码
总结
以上就是如何使用git的一些常用操作命令。
很多人可能觉得这种命令的操作方式使用不方便,那么git也有一些图形化的软件,比如sourcetree,使用也是很方便的,操作也是很简单的,这里就不再说明了,有需要的可以自己上网百度一下如何使用。