本文主要介绍Git版本控制工具的具体使用,并不介绍其安装,具体安装可自行上网搜索。 本文全部操做均在Linux环境进行,但命令自己并不区分平台,在Windows平台也可正常运行。 为了便于你们进行实操练习,本文使用的远程Git库是GitHub,能够很方便的申请一个帐户。 做者: SunnyZhanggit
Git是一个分布式的版本控制工具,其在使用上要比SVN等版本控制工具稍显复杂。为了便于理解,本文经过图文方式详细介绍Git的使用,以便于快速掌握Git。Git涉及的主要概念和命令如图所示。理解上述概念后,基本可使用Git完成平常开发工做。github
从上图能够看出Git从概念上分为3个大的区域,分别是工做空间、本地仓库和远程仓库。另外还有一个暂存区域,也称为索引区。下面咱们看一下各个区域是作什么的。体现Git是分布式版本控制的关键点是它具有一个本地仓库,其实平时的版本控制工做都是在本地库操做,若是不涉及团队协做或者备份,甚至能够只使用本地库便可。bash
为了保持文章的完整性,这里啰嗦一下。建立工做空间其实就是建立一个本地目录。在Linux平台执行以下命令便可。服务器
mkdir gittest
复制代码
而后切换到该目录,并在里面随便建立一个文件,能够执行以下命令。微信
cd gittest
echo "hello itworld123" > test.md
复制代码
完成上述操做后,咱们能够看一下工做空间(其实就是一个本地目录,没有什么高大上的)。 分布式
建立本地仓库其实很是简单,保持在刚才建立的文件夹内部(工做空间)。经过执行git init
命令就能够初始化一个本地仓库。工具
git init
复制代码
完成本地仓库的建立以后,咱们能够看到在目录下多出一个.git的隐藏目录,Git就是经过这个目录里面的内容实现版本控制的。 测试
建立完成本地仓库以后就能够查看工做区的状态了。经过git status
命令能够查看工做空间的状态(也就是文件的被管理状况)。字体
git status
复制代码
执行该命令后,能够看到在该工做区有一个文件,且处于未管理状态。fetch
若是在没有建立本地仓库的状况下执行该命令会有相应的报错,其内容大概是这样的:fatal: Not a git repository (or any of the parent directories): .git
好吧,通过上面的操做其实咱们已经有了一个本地仓库了,可是本地仓库内部并无管理任何内容。咱们这一步作的就是让他管理一个文件。咱们在前面工做空间中已经建立了一个名为'test.md'的文件了,这是个普通的文本文件,内容是"hello itworld123"。咱们这步先把它管理起来,具体执行以下命令。
git add test.md
复制代码
此时就将该文件添加到了暂存区。而后咱们在执行如下git status
命令,能够看到以下结果。此时该文件已经被管理起来了,从提示咱们能够看到这个文件尚未提交。没有提交的意思就是尚未真正在本地仓库里面,只是在暂存区而已。
提交文件其实就是将文件提交到本地库,也就是开始进行真正的版本管理了。具体能够经过执行以下命令,其后面的-m选项表示该次提交的注释内容。
git commit -m "add new file"
复制代码
完成提交后会有相应的返回,提示提交的结果是怎样的。
完成提交后,咱们能够在看一下这个工做空间的状态。能够看到此时工做空间的内容已经与本地仓库彻底一致。
完成提交以后,在本地仓库已经有了咱们刚才提交的内容。也就是说如今本地仓库已经对咱们的内容进行版本控制了。那么,咱们怎么知道已经作了哪些提交呢?这个时候git log
命令就派上用场了。从字面上咱们也能猜出大概用途来,这个命令是用来查看提交日志的。
git log
复制代码
从上图能够看到提交的基本信息,包括提交的UUID(黄色字体)、做者、日志和描述信息等内容。
若是咱们想看一下提交的详细内容又该怎么办呢?经过git show
命令能够查看某一次提交的详细内容。以上次提交为例:
git show 4909da5e6097e2f50c36ad892a18fd6f2527d4c1
复制代码
由上图能够看到提交的详细内容,除了上一个命令所涉及的简要信息外,还包括具体修改的那个文件,哪一行,以及具体修改的内容等等。
咱们在本地进行修改后,有的时候想了解当前工做区的内容做了哪些修改,这个时候可使用git diff
命令进行查看。
git diff
复制代码
执行该命令是查看工做空间与暂存区
的差别状况。好比咱们在test.md文件中增长一行,此时执行git diff
命令,如图绿色的部分就是咱们新加的内容。
可是若是咱们把这个文件加入暂存区,而后在执行相同的命令,这时咱们将看不到任何差别提示。固然该命令不只仅可以实现工做区与暂存区的对比,还能实现更复杂的对比功能。这里本文暂时不作介绍,后面再详细介绍。
在修改代码的时候常常会出现改了不少代码致使程序没法正常运行的状况,这个时候想回退到某个版本,而后把修改的代码慢慢加进去。Git提供了git reset
命令来解决代码回退的问题。好比咱们对刚才添加的代码不满意,想经过Git命令回退到以前的版本。这是须要找到指望回退版本的commit id,而后执行以下命令。
git reset --hard 4909da5e6097e2f50c36ad892a18fd6f2527d4c1
复制代码
执行成功后,能够看到以下提示,而且文件的内容已经被回退到该版本。
该命令一样有更为丰富的功能,不只能够实现上述的代码回退,还能够实现本地仓库、暂存区和远程仓库的回退,本文暂时不作介绍。
首先介绍一下什么是分支,分支( branches ) 是指在开发主线中分离出来,作进一步开发(好比新特性)而不影响到原来主线。实际上在咱们建立完本地仓库时,就已经有一个_分支_了,只不过这个分支是主分支,也叫主线(master)。如图所示,在实际应用中除了主分支外还会有其它分支,好比dev分支用于开发新特性。当完成新特性开发后,将代码统一合并到主分支中。
咱们先了解一下咱们工做空间的分支状况,经过命令git branch -l
能够看到本地分支。在咱们的测试环境运行该命令能够看到当前以及存在的分支。
咱们前面提交的内容都是直接提交到主线的。若是咱们开发一个新的特性,直接提交到主线在人多的状况下会很是乱。所以咱们能够建立一个分支,等特性开发完成后再合并到主线。执行git branch
命令能够建立一个新的分支。
git branch branch0
复制代码
建立完成后,咱们经过git branch -l
能够看到已经有一个新的分支,名称为branch0。
若是仔细观察就会发现,此时master分支的颜色是绿色的,并且前面有个*
,这说明当前工做空间仍然在master分支。若是想切换到新的分支怎么办呢?可使用下面介绍的命令。
经过git checkout
命令能够将工做空间切换到新建立的分支。执行该命令进行分支切换,而后经过git branch -l
能够看到发生的变化,此时branch0分支变成了绿色。
git checkout branch0
复制代码
切换分支之后,再提交的代码就位于新的分支。须要注意的是,若是在分支作了一些修改,但尚未提交,这时切换分支会丢失已经作得的修改,所以切换以前须要提交代码。
假设咱们在branch0分支已经添加了一些内容,并进行了提交。此时咱们想将这些内容合并到主分支中。合并的方法就是先切换到主分支,而后执行git merge
命令。
git merge branch0
复制代码
以下图是整个合并分支的过程,红线上面的是branch0分支的test.md文件的内容,绿线上面是master分支中test.md文件的内容,前者比后者多3行内容(含1行空行),执行合并命令后再看master分支中test.md的内容已经与branch0中的一致了。
其实咱们前面玩了半天,都是在本地玩的,压根没有涉及Git服务器的任何事情。若是要多人协同确定要涉及到一个服务节点,这个服务节点其实相似于中转站的概念,跟SVN服务有着本质的区别。前面说了咱们以github为例进行介绍。假设咱们在github上已经有了一个空的远程库(假设远程库路径为https://github.com/xxx/test.git),此时远程库没有任何内容。此时咱们能够经过git remote add
命令添加远程库。
git remote add origin https://github.com/xxx/test.git
复制代码
添加远程库后,其实并无对远程库作任何事情,远程库仍是空的。这里只是添加了本地仓库与远程仓库的关联关系。其中origin是远程仓库的一个代名词,可使用其它任何名称,这里只是惯用法而已。
添加完关联关系以后,咱们就能够将本地仓库推送到远程服务器上,例如咱们将本地的master分支推送到github上,执行以下命令,过程当中须要咱们输入github上注册的用户名及对应的密码。
git push origin master
复制代码
完成该操做后,能够登陆github看一下远程仓库的状况。能够看到在github上的远程仓库已经具有了一个master分支,且包含与本地仓库同样的内容。
除了第一次向远程仓库推送内容外,咱们后面修改代码后想向远程仓库提交代码使用的也是这个命令。默认状况下,git会将代码推送到与本地分支同名的远程分支。
咱们提交代码的通常流程是这样的:添加到暂存区(git add),提交到本地仓库(git commit),最后推送到远程仓库(git push),具体能够参考图1。
若是咱们来了一个新同事,须要下载远程仓库的代码进行开发怎么办?这个使用就用到了克隆命令,克隆命令能够将远程仓库的内容克隆一份,生成一个如出一辙的本地仓库,同时会生成工做空间的内容。须要知道的是,默认状况下工做空间的内容是master分支的内容,若是须要其余分支,则须要建立本地分支,而且进行切换。例如咱们从测试用的github上克隆上文推送的代码,假如咱们克隆到一个新的文件夹gittest1,执行以下命令后,能够看到克隆后gittest1下面已经具备master分支的内容。
git clone https://github.com/xxx/test.git gittest1
复制代码
在多人协同的状况下,会不断的有人向远程仓库提交新内容。为了保证代码的同步,咱们须要将远程代码拉到本地,git有2个命令能够将远程仓库的内容拉到本地,一个是pull,能够将远程仓库的代码拉到本地仓库,同时合并到本地工做空间;另外一个是fetch命令,这个命令只将远程仓库的内容更新到本地仓库。
git fetch
复制代码
执行上面命令能够将远程仓库的内容拉取到本地仓库,但并不会更新本地工做空间
。如图所示,咱们将gittest中文件添加一行(a5),而后同步到远程仓库。而后切换到目录gittest1,并经过git fetch
命令拉取远程仓库的内容。能够看到gittest1中test.md文件中的内容并无变化。而后咱们再执行git merge
命令,该命令会将本地仓库相同分支的内容更新到工做空间,此时再查看文件内容,已经更新为最新的内容。
使用git pull
命令能够直接将文件内容更新到工做空间,如图咱们在gittest文件夹中test.md添加一行a6,并同步到远程仓库。而后,咱们切换到gittest1文件夹执行git pull
命令,能够看到文件内容已经更新。
在很大的项目中,团队成员会不少,有时候咱们须要知道某一段代码的做者。这时可使用git blame
命令。经过该命令能够获取提交的ID、做者和时间等信息。
git blame -L 5 test.md
复制代码
写到这里其实已经涵盖了Git的大部分经常使用命令,基本上能够知足咱们平常开发使用。可是,Git的功能是如此的强大,以致于咱们介绍三天三夜也没法讲完。本文先介绍到这里,后面再详细介绍每条命令的用法。
关注做者微信公众号,更及时的获取原创IT技术文章。