版本控制系统(Version Control System,VCS)可以分为集中式(Centralized Version Control System,CVCS)与分布式(Distributed Version Control System,DVCS)两大类。
它们的区别主要在于版本管理数据库存在的位置。
如图所示:
集中式的版本数据库只存在于服务器上,而个人这里仅仅只有一份文件。
而分布式的版本数据库则存在于每一台电脑上:
而且每个版本数据库都是同等的,没有主副之分。服务器上有时只有版本数据库而没有实际文件。
Git就是一个非常热门的分布式版本控制系统。
它和众所周知的Github有什么区别呢?
Github是基于Git的,它的额外作用主要有两个,一是提供了服务器让所有用户可以在其上存放Git的数据,二是提供了GUI的网页端/PC端方便进行一些操作。
如果你的需求特别特别的简单,Github的GUI就能满足的话,那你没有必要学Git,也没有必要看下去了。但是如果你的需求稍复杂一些,GUI就不够用了,这时候就需要使用Git命令行操作。
安装
推荐还是通过Github客户端来使用Git比较方便。
Windows:
安装完Github客户端后,还会“附赠”一个Git Shell,相当好用。
macOS:
安装完Github客户端之后,在软件的偏好设置(Preference)中
然后就可以在Terminal或者第三方的iTerm2中使用了。
我另外有一篇关于zsh、iTerm2的文章,可以让你得到一个非常棒的命令行环境,有兴趣的可以去看看。
Config
虽然现在还不用配置config文件,但是先简单介绍一下。
Git的config文件一共有三个等级:
1. 系统级的config文件在/etc/gitconfig 当你使用git config –system时,它会读写该文件。它对整个系统生效。
2. 全局级的config文件在~/.gitconfig或~/.config/git/config 当你使用git config –global时,它会读写该文件。它对当前用户生效。
3. 目录级的config文件在git目录下.git/config 你的所有的使用了git的目录下都会有一个。当你直接使用git config时,会读写该文件,仅对当前git目录生效。
在windows系统上,全局级的一般在C:\Users$USER.gitconfig
系统级的位置不定,我的PC上在C:\Users$USER\AppData\Local\GitHub\PortableGit_f02737a78695063deace08e96d5042710d3e32db\mingw32\etc
另外,作用域越大,优先级越低。也就是说系统级<全局级<目录级。当某项配置在各级config中重复出现时,将使用优先级高的文件中的。
你可以使用
git config --list
来显示当前所在目录的配置情况,它会显示各级config文件在当前目录中叠加后的效果。
创建
那么如何创建一个git仓库呢?
这里我们先假设你需要用Git进行多人协作,也就是需要在服务器上建立仓库,如果只是本地使用的话可以更简单(git init即可)。
首先你需要在Github网站上(或者其他类似网站,之后均用Github为例)新建一个库,然后它会提示如下信息:
记作图1。
然后我们分场景讨论:
1. 从一个空的工程开始
1.1 图1中第一条点击一下即可,它会直接打开客户端进行clone,你直接在客户端中也能找到clone的按钮。
1.2 使用clone命令
git clone <url> <your_name>
即Github给出的地址,是用来指定将要创建的目录的名称,你可以省略它,Git将使用仓库名作为目录名称。
1.3 图1中第二条也是从空的工程开始,但是它就看起来比较复杂了,它的具体含义我们留到后面再讲(大概在第四章左右吧),这边就注意一下git init命令,在你的文件夹根目录下使用该命令就可以让它成为git工程。你只要在命令行中先mkdir xxx,再cd xxx,然后按照上面的依次输入命令就可以了。
以上方法的效果都是一样的。还是先使用1.1或者1.2这种简单的吧。
2. 从一个本地已有的工程开始
2.1 一个简单的方法是你可以按照1.的步骤创建一个空的工程,然后把你本地的文件拷贝进去。
2.2 用命令行也可以,上面图1中的第三条的命令要成功需要两个前提条件,一是本地已有的工程已经是一个git工程(根目录下拥有.git文件夹),二是它的git remote中不含有origin这个remote。一般不能满足这两个条件。
所以如果你本地的工程还不是一个git工程,应该使用如下命令
cd 根目录
git init
git add .
git commit -m "first commit"
git remote add origin <url>
git push -u origin master
其实跟上面图1中第二条的命令差不多,只不过这里上传了所有文件,如果你已有的工程大小很大的话不要用这句:
git add .
不然上传要很久,还是先换成老样子
echo "# README">>README.md
git add README.md
等学了.gitignore相关的内容后再来上传吧。
3. 从一个网络上的工程开始
其实(1)也可以算是网络上的工程,这里我们不考虑自己的工程(直接按1.1或1.2 clone即可)。我们考虑Github上一个别人的工程的情况。
如果该工程你只是想本地使用,那也只要简单地clone下来即可。
但是如果你想要进行多人协作,或者说上传到Github,那么:
3.1 使用fork:
它将拷贝一份一样的代码到你的Github空间中。然后你再clone自己空间中的工程即可。
3.2 还有一种比较繁琐的方法:
先clone到本地,然后在自己的Github上创建一个空的工程,然后
git remote add mygithub <url>
git push -u mygithub master
其实这跟前面图中的第三条道理是一样的。它的好处是可以把原地址也加到git remote , 方便更新(后面章节会有一个本方法的使用例子)
如果你到这已经看晕了,不要担心,只要会1.1、1.2、2.1、3.1这些即可,剩下的不妨回头看或者不看了…