版本控制系统
2019-04-30
0. 前言
本文是我关于 Version Control 的一些基本概念的认识和总结,主要内容如下:
1. 理解 Repository 到底是什么,Remote repo 和 local repo 是什么意思;
2. 如何在本地创建一个 Repo;
3. 集中式版本控制系统和分布式版本控制系统的区别;
1. 关于 Folder,Repository,Git,GitHub
假设有一天,我们在电脑里面创建了一个文件夹(ABC),这个文件夹里面有很多文件。
我们一直在对文件夹 ABC 里面的文件做修改,增加新文件,修改已有文件的内容,删除文件等等。
因为一直在改动文件,我们就产生了一个想法,想要保留对于这个文件夹 ABC 内部文件的所有改动历史,这样如果某天改错了什么东西,还可以 Ctrl-Z 撤销操作。
这个想法可以实现吗?当然可以。只不过,我们需要先在文件夹 ABC 里面加一个 Repository (简称 Repo,仓库),在这个仓库里面,储存着我们对 ABC 的所有操作历史。
怎么在 ABC 里面增加一个 Repo 呢?我们可以用不同的版本控制工具来做,比如 Git 或者 SVN。假设我们决定用 Git 做版本控制,那只要打开 terminal,进入到 ABC 这个文件夹中,然后敲一行命令:
git init
PS:想要显示隐藏文件夹可以使用快捷键 cmd+shift+.
这时,我们的 ABC 中就**有了一个新的隐藏文件夹,叫做.git。**在.git 里面,保存着我们对于文件夹 ABC 里面所有文件的操作历史(从 git init 的那个时候开始,之前的操作历史 git 是不知道的哦~那时候它还没出生呢!)。
需要注意的是,.git 是一个非常被动的孩子,你不能指望他自己很勤快地去主动记录你的操作。唯一能让他干活的方式就是,我们改完东西之后告诉他,我们现在改过东西啦,你赶紧来看一下我们改过什么,然后记下来这些改动(通过使用 git add 和 git commit)。
而且,如果你把.git 这个文件夹删了,那么关于 ABC 的记忆就全部丢失了,你再也无法找回 ABC 的操作历史了(嘤嘤嘤),所以大家千万别去修改.git 文件夹里面的任何东西。
现在我们知道了,其实 Repo 就是这个新加的.git 的文件夹。既然是个文件夹,那么我们可以选择把这个 Repo 放在本地电脑里,这样的 repo 叫做local repo;也可以选择把这个 Repo 放在服务器上,放在服务器上的 Repo 就成了remote repo。
既然 remote repo 是放在服务器上的,我们可以选择在自己搭一个服务器,也可以选择现成的服务器来储存 repo,比如 Github,Gitbucket等等。
References:
https://www.jianshu.com/p/8cf7fa473028
https://en.wikipedia.org/wiki/Software_repository
2. 版本控制系统
由于大部分的开发工作都需要多人协作,我们就需要 Version control system (版本控制系统)来帮忙管理项目的历史记录。
有些版本控制系统是集中化的(Centralized Version Control Systems,CVCS),比如 SVN;还有一些版本控制系统是分布式的(Distributed/Decentralized Version Control System, DVCS),比如 Git。
集中式版本控制系统和分布式版本控制系统的最大区别在于 Repo(历史记录)存放的位置。
- 集中式版本控制系统把 Repo 放在一个单独的服务器上,也就是通过中央服务器来管理文件夹的历史。每个程序员的本地文件夹里面是没有 Repo 的,改完代码之后不能在本地 commit,一定要通过中央服务器来 commit change。由于 Repo 存在中央服务器上,服务器宕机的话,大家就没法 commit,也没法 rollback,因为所有的历史记录都存在服务器上。
- 而分布式版本控制系统把 Repo 存在每个用户的电脑里,大家可以在自己的电脑里面 commit change,然后再通过 push 把改动同步给中央服务器。这样的去中心化设计大大降低了我们对服务器和网络连接的依赖程度。就算服务器宕机了,大家的电脑里也有 Repo,只需要再弄一个服务器把 Repo 同步一下就可以了。
3. 总结
由此看来,集中式版本控制系统对于中央服务器的稳定性要求更高,而且大家要联网才能干活;而分布式版本控制系统把中央服务器的概念弱化了,大家在自己电脑上就可以提交修改,进行 merge,服务器只是起到方便大家同步 Repo 的作用,就算服务器出问题了也可以快速复制一个 Repo。
References:
https://www.lynda.com/Git-tutorials/What-repository/601791/629515-4.html