一、基础知识
1.0、版本控制
什么是“版本控制”? 版本控制是一种记录一个或若干文件内容的变化,方便将来查阅特定版本修改情况的系统。
日常生活中,我们经常会存在对一个东西进行反复修改打磨的情况,但常常我们因为一个或多个修改的地方弄错了导致整个项目废掉(此时我们是希望能够回退到出错前的状态再开始打磨,而不希望从头开始);【但如果我们采用版本控制系统就可以将某个或多个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的正常状态,同时也可以对同一个文件进行比较差异,查出最后是谁修改了哪个地方,精准定位到问题,提高效率】。
1.0.1、本地版本控制系统
本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。最流行的一种叫做 RCS,工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。
1.0.2、集中化的版本控制系统
集中化的版本控制系统以Subversion(SVN) 最为出名,只有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。
①这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。 现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。 而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。
② 这么做最显而易见的缺点是中央服务器的单点故障。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问您将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
1.0.3、分布式版本控制系统
分布式版本控制系统(Distributed Version Control System,简称 DVCS),在这类系统中,像 Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份 ,如下所示:
许多这类系统都可以指定和若干不同的远端代码仓库进行交互。藉此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。
1.1、Git介绍
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目;同时Git也是个内容管理系统(CMS),工作管理系统等。
Git 是 林纳斯·托瓦兹(Linus Torvalds) 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
Git 快速入门指南https://www.runoob.com/manual/git-guide/Git 完整命令手册
http://git-scm.com/docs
基本概念
我们先来理解下 Git 工作区、暂存区和版本库概念:
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
-
图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所代表的目录树。
-
图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
-
图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
-
当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
-
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
-
当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
-
当执行 git rm --cached <file> 命令时,会直接从暂存区删除文件,工作区则不做出改变。
-
当执行 git checkout . 或者 git checkout -- <file> 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
-
当执行 git checkout HEAD . 或者 git checkout HEAD <file> 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
1.2、SVN介绍
Apache Subversion 通常被缩写成 SVN,是一个开放源代码的版本控制系统, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。
SVN在 2000 年由 CollabNet Inc 开发,现在发展成为 Apache 软件基金会的一个项目,采用了分支管理系统。
SVN 的一些概念
- repository(源代码库):源代码统一存放的地方
- Checkout(提取):当你手上没有源代码的时候,你需要从repository checkout一份
- Commit(提交):当你已经修改了代码,你就需要Commit到repository
- Update (更新):当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更
日常开发过程其实就是这样的(假设你已经Checkout并且已经工作了几天):Update(获得最新的代码) -->作出自己的修改并调试成功 --> Commit(大家就可以看到你的修改了) 。
如果两个程序员同时修改了同一个文件呢, SVN 可以合并这两个程序员的改动,实际上SVN管理源代码是以行为单位的,就是说两个程序员只要不是修改了同一行程序,SVN都会自动合并两种修改。如果是同一行,SVN 会提示文件 Conflict, 冲突,需要手动确认。
1.3、Git与SVN的区别
-
1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
-
2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
-
3、Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
-
4、Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
-
5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
二、GitLab介绍
2.1、GitLab介绍
GitLab 是一个用于仓库管理系统的开源项目。使用Git作为代码管理工具,并在此基础上搭建起来的web服务;可通过 Web 界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序\(Wall\)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用。
GitLab,GitHub和Bitbucket - 提供远程访问Git存储库的服务。 除了托管代码之外,这些服务还提供用来帮助管理软件开发生命周期的附加功能。 这些附加功能包括管理不同人之间的代码共享,错误跟踪,wiki空间和其他“社交编码”工具。
- GitHub 是一项公开可用的免费服务,它要求所有代码(除非您有付费帐户)公开。 任何人都可以看到您推送给GitHub的代码并提供改进建议。 GitHub目前承载数以万计的开源项目的源代码。
- GitLab是一种类似github的服务,组织可以使用它来提供git存储库的内部管理。 它是一个自我托管的Git-repository管理系统,可以保持用户代码的私密性,并且可以轻松地部署代码的更改(让您可以完全控制您的存储库或项目,并允许您自己决定是公共还是私有)
2.2、GitLab特点
- GitLab免费托管您的(私人)软件项目。
- GitLab是管理Git存储库的Web平台。
- GitLab提供免费的公共和私人存储库,问题跟踪和维基功能。
- GitLab是Git之上的一个用户友好的Web界面层,它提高了使用Git的速度。
- GitLab提供了自己的持续集成(CI)系统来管理项目,并提供用户界面以及GitLab的其他功能。
2.3、GitLab优点
- GitLab提供了GitLab Community Edition版本,供用户在他们的代码所在的服务器上进行定位。
- GitLab免费提供无限数量的私人和公共存储库。
- 代码片段可以共享项目中的少量代码,而不是共享整个项目。
三、sourcetree 介绍
3.1、Sourcetree介绍
SourceTree 是 Windows 和Mac OS X 下免费的 Git 客户端,拥有可视化界面,容易上手操作。同时它也是Mercurial和Subversion版本控制系统工具。支持创建、提交、clone、push、pull 和merge等操作。
3.2、Sourcetree相关名称解释
-
克隆(clone):从远程仓库URL加载创建一个与远程仓库一样的本地仓库
-
提交(commit):将暂存文件上传到本地仓库(我们在Finder中对本地仓库做修改后一般都得先提交一次,再推送)
-
检出(checkout):切换不同分支
-
添加(add):添加文件到缓存区
-
移除(remove):移除文件至缓存区
-
暂存(git stash):保存工作现场
-
重置(reset):回到最近添加(add)/提交(commit)状态
-
合并(merge):将多个同名文件合并为一个文件,该文件包含多个同名文件的所有内容,相同内容抵消
-
抓取(fetch):从远程仓库获取信息并同步至本地仓库
-
拉取(pull):从远程仓库获取信息并同步至本地仓库,并且自动执行合并(merge)操作,即 pull=fetch+merge
-
推送(push):将本地仓库同步至远程仓库,一般推送(push)前先拉取(pull)一次,确保一致
-
分支(branch):创建/修改/删除分枝
-
标签(tag):给项目增添标签
-
工作流(Git Flow):团队工作时,每个人创建属于自己的分枝(branch),确定无误后提交到master分枝
-
终端(terminal):可以输入git命令行