开发工具之版本控制

Posted _Holon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发工具之版本控制相关的知识,希望对你有一定的参考价值。

【前言】

学习Git的主要的目的是学习版本控制,所以我们应该学习的是版本控制,而非具体某一项工具,如Git。而这里以Git为例只是一个让我们学习版本控制的途径,未来如果有一天你换到了别的版本控制工具,一定要学会举一反三。

几乎所有的命令行式应用都可以通过在命令行输入man 应用程序名(man是manual的缩写)的方式查看官方手册,IT届流行一句话叫RTFM,意思是Read The Fucking Manual,官方手册足够权威,推荐英文基础较好的同学直接阅读官方手册学习。

对于工具类的东西,以及很多计算机知识来说,最快的学习途径就是用,先会用再去研究原理往往能达到事半功倍的效果。如果你上来就研究原理,往往对于那些大神嘴里说的东西不知甚解,不知道为什么这么做,也不知道这么做有什么好处,甚至于讲一些原理,你都不知道这个东西以后该用在什么地方,这会是件很可悲、很浪费时间的事。

这也是很多人都说《Java编程思想》这本书很好但并不适合新手的一部分原因,什么阶段的水平学习什么样的知识,用阶梯式的学习而不是跳跃式的学习往往能减少很多不必要的麻烦,也能减少对自信心的打击。

版本控制Git的学习独立于具体的具体的编程语言和其他知识,属于自称体系的工具类知识,所以即便没有编程基础也可以学习,但因为大多通过Linux命令行交互的方式来用(也有GUI客户端),所以可能需要一些Linux操作相关的知识。

说明:一开始写了很多东西,后来在继续查找相关资料的过程中,发现很多东西都有人写的更透彻,更明了,笔者希望自己能够写出更有价值的东西出来,加上自己目前主要的精力还是不应该放在Git上面,遂萌生了退意,所以附上了不少相关资料的连接,待后续有精力时再做补充。这是笔者第一篇博文,虽然没有完成,但是依然在书写过程中收获了很多。

【相关资料】

Git官方网站:最权威的参考资料

Git手册man git的网页版

Git命令速查手册官方版

相关书籍:《Pro Git, 2nd》Git官方推荐的书籍,中文版

博客:Git的思想和基本工作原理:了解Git底层工作原理

可视化Git命令速查表Git五个分区之间的命令对应图🌟🌟🌟强烈推荐!!!建议初学者学习每个命令时都对照着这个图,思考这个命令发生了什么,能达到事半功倍的学习效果。点击每个区域能显示与该区域有关的命令。

Github教程:一个很详尽的Github教程

猴子都能懂的Git入门:一个通俗易懂的Git入门教程

廖雪峰的git在线教程:个人认为有点乱,扯的有点多,对新手不太友好,容易混乱,但是对着练习一遍会有收获。

【🌟🌟实践速通篇】

头歌教学实践平台:Git从小白到高手 :适合新手认识Git并进行在线练习。

Git在线联系网站:中文版,对新手比较友好,但是容易造成练完一遍仍然感觉不会用。。。

【相关疑问篇】

什么是版本控制系统?
版本控制有什么用?
我为什么要学这个?
Git是什么?
为什么要学习Git
除了Git还有没有其他工具能达到你的目的?

【学习篇】

随着计算机技术的发展,软件的结构变得越来越复杂,规模也越来越大,软件开发中的版本控制、代码托管及协同开发也变得越来越重要。

Git是一个分布式的版本控制系统,它功能强大、操作简单,并且能很好地解决以上问题。目前,熟练地使用Git已经成了一个软件开发从业者必备的技能。同时,其他领域的工作者也可以使用Git进行产品的版本控制。

说明:Git是一个工具,没必要把时间浪费在那些“高级”但几乎永远不会用到的命令上。一旦你真的非用不可了,到时候再自行Google或者请教专家也未迟。合理分配学习精力,没必要过于追求奇技淫巧。

什么是版本控制系统

在写论文的时候,你有没有遇到过这种情况:

我想每一个写过毕业论文或者做过毕设的同学一定有过这种痛的经历吧,虽然现在Word/WPS这些工具已经非常强大,但是生成那么多文档依然够让自己抓狂的。这还只是一个文件,如果是纷繁复杂的代码呢?那么多源代码文件、编译后的文件、配置文件放在一起,想做改动,难道每次都要备份一个吗?光是想想都够让人头大。

如果能有一个软件,可以帮自己管理每次改动,并且给每次版本的迭代打上标签、做好记录,想撤回到那个版本,直接跳到那个时间节点就好,仿佛有了时光回溯一般该多好。

一定要相信,作为互联网原住民,你遇到的问题,有相当大的概率你的前辈们都遇到过并且解决了。 那么前辈们是如何解决这个问题的呢?版本控制应运而生。

集中式 or 分布式

集中式

版本库是集中存放在中央服务器的,干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的成果推送给中央服务器,有点类似于C/S架构。缺点是必须联网才能工作,如果是在局域网还好,如果在互联网上,遇到网速慢的情况,可能提交一个10M的文件就需要5分钟,人生苦短,何必把时间浪费在这上面。

  • 最早的开源且免费的集中式版本控制系统CVS:由于CVS自身设计的问题,会造成提交文件不完整,版本库莫名其妙损坏的情况。
  • 目前用得最多的集中式版本库控制系统SVN:同样是开源且免费,修正了CVS的一些稳定性问题。
  • 收费的集中式版本控制系统,比如IBM的ClearCase(以前是Rational公司的,被IBM收购了):特点是安装比Windows还大,运行比蜗牛还慢,能用ClearCase的一般是世界500强,他们有个共同的特点是财大气粗。
  • 微软自己也有一个集中式版本控制系统叫VSS:集成在Visual Studio中。由于其反人类的设计,连微软自己都不好意思用了。

分布式

每个人的电脑上都有一个完整的版本库,这样,工作的时候就不需要联网了。那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,比如我们大名鼎鼎的GitHub,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

分布式版本控制系统除了Git以及促使Git诞生的BitKeeper外,还有类似GitMercurialBazaar等。这些分布式版本控制系统各有特点,但最快、最简单也最流行的依然是Git

Git是什么

目前世界上最先进的分布式版本控制系统。Git-维基百科(可以了解一下诞生的历史)

安装

在Linux上安装

👉学习linux基础操作

  • 在线安装
    在Debian或Ubantu Linux(Debian类体系结构系统)
    sudo apt-get install git
    
    在老一点的Debian或Ubantu Linux1
    sudo apt-get install git-core
    
    在Fedora或CentOS
    yum install git
    
  • 离线安装
    如果是其他Linux版本或者系统没有接入互联网,Git可以通过源码安装,具体的安装过程请参考Git官网教程或者GithubGit仓库的用户指南。但对于初学用户,还是建议大家直接安装。

在Mac上安装

Mac上安装Git有四种方式:

  • 图形化的Git安装工具,网址图形化Git工具安装地址
  • 通过MacPorts 安装。如果已经装好了MacPorts,请用下面的命令安装 Git
    sudo port install git-core +svn +doc +bash_completion +gitweb
    
  • (推荐) 安装Homebrew,然后通过Homebrew安装Git,具体方法请参考Homebrew的文档。或这篇教程👉Homebrew教程
  • (推荐) 直接从AppStore安装XcodeXcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单"Xcode -> Preferences",在弹出窗口中找到"Downloads",选择"Command Line Tools",点"Install"就可以完成安装了。Xcode是Apple官方IDE,功能非常强大,是开发Mac和ios App的必选装备,而且是免费的!但是体积非常大,如果只想使用Xcode附带的工具包,可以在控制台中输入
     xcode-select --install
    

在Windows上安装

在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。

安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

配置

由于Git是一个分布式的版本控制系统,所以当利用它进行分工协作时,必须区分不同的机器。这一点可以通过配置机器的名字和邮箱完成。Git初始使用时,也会提示进行配置。配置命令如下:

git config --global user.name "Your Name"
git config --global user.email "email@example.com"

在实际的使用过程中,可以将上面命令中"Your Name""email@example"替换为自己实际的名字和邮箱。

注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

五个工作区域

学习Git的过程中,心中要始终有五个工作区域,几乎所有的工作命令都是在这五个工作区域间做操作,它们分别长这样:

关于每个区域的作用,将在后文中逐一介绍,请大家把这五个区域印在脑海中。

创建本地版本库

什么是版本库:

版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

首先,我们需要创建一个目录,做为我们的本地版本库,然后使用git init命令,将其初始化为一个本地版本库,如下:

mkdir /home/repo	#在/home目录下,创建repo目录
cd /home/repo		#进入repo目录
git init			#将repo初始化为一个本地版本库

通过上述命令,即可在/home目录下,创建repo目录,并将其初始化为一个版本库。在实际使用中,可以将上面命令中的/home/repo 换成你自己想用的目录。

细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -al命令就可以看见。
里面可能包含这些文件(不同的操作系统可能会有细微的差异)

把文件添加到暂存区

不少初识Git的同学在学完Git后可能对于暂存区的概念感觉很迷惑,不知道为什么要增加这么一个区域,笔者就是如此。在查阅了多方资料后,得到一个比较能让人接受的论调(未必是对的)。

不少人认为添加暂存区是为了能够将文件分批提交,比如在工作区添加了功能A对应的文件a1文件a2功能B对应的文件b1文件b2,由于CLI操作的局限性,在工作区和本地版本库中间添加一个暂存区能有利于将两个功能的文件分开提交,从而生成两个节点。
但如果只是为了如此,commit命令本身就能完成这种事情。
所以这种说法有一定的道理性,
笔者认为另一部分的原因在于Unix的设计哲学。Unix系统的设计哲学认为,一个程序应该只注重一件事并把这件事做到极致,在提交过程中,选择提交哪个文件提交动作本身显然应该是两个功能,试想一下提交分为把提交所有提交部分选取并提交提交带说明提交并tag提交并push提交并覆盖那么多子功能的话,简直就是个灾难。
提交就应该只做提交的事情,筛选应该交由其它指令来完成。事实上,所谓的提交并覆盖全部提交都是后面给加的脚本功能。

如果实在无法理解的话,可以类比生活中先添加到购物车再下单的场景。

把文件添加到暂存区,需要用到git add命令,git add命令的使用方式如下所示:

#追踪所有文件
git add .
#追踪hello.txt文件
git add hello.txt

如上所示,当需要追踪所有文件时,使用git add .,如果想添加指定文件,只需要像示例中添加hello.txt一样,将文件名做为参数名,传给git add即可。在实际使用中往往用git add .配合.gitignore文件来更方便的控制追踪哪些文件。关于.gitignore文件的内容将在下文介绍。

这样,你便成功追踪到了hello.txt文件,以后对于hello.txt文件的每次修改,Git都会了如指掌。

把文件从暂存区移出

撤销追踪文件,需要用到git checkout [文件名]命令,git checkout [文件名]命令的使用方式如下所示

git checkout hello.txt

这样,你撤销了对于hello.txt文件的追踪。

提交修改到版本库

当我们对一个或多个追踪的文件做了修改,或者新添加了一个或多个追踪的文件,并且已经完成了相应的工作,想要把当前的工作状态保存起来,类似于我们编写文档时候的ctrl/command + s该怎么做呢,这个时候就需要我们把当前的修改保存到版本库,从而形成一个时间回溯点,也类似于角色扮演类游戏中的存档点

把修改添加到版本库,需要用到git commit命令,git commit 命令的使用方式如下:

git commit -m "本次提交的简要说明"

-m参数后面跟的是本次提交内容的简要说明,用来说明你这次的提交,主要是做了哪些修改,这个说明内容是必须的。如果不加-m参数,将会自动进入到一个vim编辑界面,强制要求你编写此次提交的说明,且编写内容不得为空。大概长这样

提交成功后,控制台会这样提示你

[master c6a04a3] 简要说明:提示你这个存档点在master分支,编号的最后七位是c6a04a3简要说明是你在-m参数后面或者vim编辑器里编写的此次提交的说明。
1 file changed, 0 insertions(+), 0 deletions(-):提示你此次相比上次存档点更改了1个文件,文件中插入了0行,删除了0行。
这样,你便将hello.txt文件成功保存到了版本库中,类似于在游戏中进入了下一个存档点,这个存档点相比于上次,多了一个hello.txt文件。

说明:所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。
因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。

查看Git状态

在命令行中输入

git status

将出现以下三种情况:

  1. 当前文件下的所有文件都被追踪,且没有尚未提交的文件,类似于你刚存档完毕。 类似于下面的输出:
  2. 当你创建完helloGit.txt,但没有追踪它时,如果使用git status命令,你会得到类似于下面的输出:
    意思是在所有你追踪的文件中,没有要提交的,但是有未追踪且未忽视的文件出现。
  3. 创建完helloGit.txt,且追踪了这个文件,但是没有提交,你会得到类似于下面的输出:

    意思是你追踪了helloGit.txt文件,但是你没有提交它。类似于游戏数据发生了变化但是没有存档。

未完待续。。。

【🌟🌟🌟实践篇】

未完待续。。。


  1. 1、为什么要使用git-core: 以前有个软件也叫GIT(GNU Interactive Tools),结果Git就只能叫git-core了。由于Git名气实在太大,后来就把GNU Interactive Tools改成gnuitgit-core正式改为git↩︎

以上是关于开发工具之版本控制的主要内容,如果未能解决你的问题,请参考以下文章

如何选择版本控制系统之三

一小时精通SVN版本控制 之 准备工作

版本控制系统之SVN和GIT的区别

Unity3D游戏开发之从Unity3D项目版本号控制说起

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

学习笔记Git版本控制工具之git stash暂存功能