@0 一些废话

据说现在有不少人在试着用C++写游戏,或者写一点小程序(就像我)。这时如果你写到一半没有写完,或还想存着继续更新,你就需要一个地方来保存代码。

有些大佬直接扔洛谷剪切板里,大部分人都放在百度网盘上,还有一些人放一些奇怪的地方里(比如压缩在图片中发到sm.ms上)

然而如果有多人开发,那么你就会需要一个优秀的版本控制系统和代码托管处了。这时,你就会开始使用起下面这个软件了。

git

@\frac1221 Linus和git

众所周知,Linus是一位dalao,曾因为无聊而随便开发了linux系统,然后被CCF用去魔改成NOI Linux。而这种天才级的人物,自然也是随手开发了git管理系统。

其中开发的过程太过神奇,这里就转载一下廖雪峰官网的故事

很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。

Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?

事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!

你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。

不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。

安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。

Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:

Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。

Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。

历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。

从这个故事里,我们可以得到两点:

1. CVS、SVN、BitKeeper、Mercurial等版本控制管理工具都比手动修改要差

2. git比手动修改要好

总结一下,就是:git吊打其他版本控制系统

@1 入门

0x01 安装

Windows:下载

下载完之后运行,然后一直点Next就好了

MacOS X:下载 or 使用brew安装brew install git

Linux:使用git --version查看是否有安装,默认系统自带,没有用以下指令安装

Linux (Ubuntu,Debian):sudo apt-get install git

Linux (CentOS,Red Hat,Fedora):sudo yum install git

注意:接下来所有操作都是使用linux的指令,windows用户可以在任意的地方右键,点击Git Bash Here来使用接近linux的终端

现在新建一个文件夹,开始让让git管理它:

mkdir test
git init test
cd test

0x02 新建文件

新建一个README.md,向里面写入以下内容:

Hello World!

我们先要使用git add指令来添加文件到缓存库:

git add README.md

但这时候我们还没有真正的把README.md真正添加的版本仓库里。我们还要用git commit来把当前缓存的文件添加到仓库里。

git commit -m "make a README.md"

这里-m后面跟的是简单说明,可以直接写"XXX",但为了以后修改方便,建议填写有意义的说明

然而大部分刚用git的小伙伴们会说:“哎,怎么报错了?”

*** Please tell me who you are.

Run

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

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'Admin@XIAOLIN-PC.(none)')

这其实是正常现象,你只要输入下面的指令,以后就不会报错了。(把you@example.com替换成你的邮箱,Your Name替换成你的名字)

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

0x03 修改文件

修改README.md为以下内容:

Hello World!
a+b=?

这时输入git status,会显示当前文件夹内和缓存区的信息。例如下图所示

1.png

我们可以看到README.md的更改还没添加到缓存区中。

这时我们把README.md添加到缓存区中

git add README.md

当然,如果你想删除文件,也是有办法的,那就是使用git rm一键删除,又快又方便

这时再输入git status,就会发现现在README.md在缓存区中被修改过了,将要提交到版本库里,如下图

2.png

这时我们用git commit -m "add a+b problem"来把它提交到版本库里

0x04 一些补充

有些时候我们可能会需要更深入地了解两个文件之间的改变。

这时,我们可以使用git diff指令来查看文件的改变

git diff filename是把文件和暂存区中的比较。

git diff HEAD filename是把文件和当前版本库中的比较。

git diff --staged filename是把暂存区中的和当前版本库中的比较。

效果大概如下图:

3.png

@2 托管

上面只是一些git的入门操作,如果想知道所有的操作可以上git官网(然而真的很全面很无聊)

接下来我才开始正式讲如何把代码保存到服务器上

0x01 git服务器

定义:git服务器是专门用来共享和储存代码的

你完全可以自己搭建一个git服务器,只要你有钱,你甚至可以实现千兆光纤接入并且配有128个高速节点的cdn分布式储存git服务器。

然而这并没有太大的必要,因为这只是为了编写一个C++小游戏而已(还整天被memset0大佬D),现在世界上有很多免费的git仓库托管服务,完全不用你自己搭建

国内的有:腾讯云开发者平台(coding),码云

国外的有:githubgitlabbitbucket

本文就以腾讯云开发者平台作为实例,其他的代码托管网站的操作类似。

在https://dev.tencent.com 上注册,然后进入控制台,可以看到右边的项目,这里我们就新建一个新的项目。

这里我们就新建一个test项目,就不设置README.md了,源代码也不公开了(免得被别人嘲笑)

这样你就有了一个自己的在网络上的代码仓库了,QAQ(我好像被cz感染了)

0x02 ssh协议

在本地把代码上传至代码托管的地方,肯定是需要身份验证的。而git又对ssh有着很好的支持,所以我们多半都用ssh协议来加密传输。

在本地终端运行这个命令来生成本地的ssh密钥

ssh-keygen -t rsa -C "youremail@example.com"

中间的过程如果没有特殊需要,一直按回车就可以了。

但我们还要把公钥上传到腾讯云开发者平台,这样它才知道这时你的密钥。

生成的公钥默认保存在~/.ssh/id_rsa.pub里,你可以用vim打开并将其全部复制

来到开发者平台的控制台界面,移到头像上,来到个人设置,选择SSH公钥。

然后新建公钥,把你刚刚复制的公钥全部粘贴进去,选择永久有效。

最后在本地运行ssh -T git@git.dev.tencent.com来验证是否有效。

4.png

像上图这样显示的就是添加公钥成功了。

0x03 推送拉取克隆

看到这里,我们还是没有建立本地代码仓库和服务器之间的联系,目前在本地的任何操作都和服务器无关。在这一节,你就可以学到与此有关的知识。

首先去你在开发者平台上的项目哪里,点击代码浏览,这时,你可能会看到下面两种情况。

4.png

5.png

复制完仓库的git地址之后,就在本地仓库中输入下面这条指令

git remote add origin 你刚刚复制的地址

这样,你就添加了一个名为origin的远程仓库了(这里的origin可以改为其他的名字,但最好是默认的origin)

同样的,你可以用下面这条指令把origin远程仓库删除(当然你不要删,这个远程仓库以后还要用)

git remote remove origin

这时,我们想要把本地仓库的东西推送到远程仓库上,就可以使用下面这条指令一键完成。

git push origin master

警告:如果远程仓库一开始是初始化过,会因为历史的问题出错,这时建议把你的仓库给清空一遍。然后你的东西全没了

黑科技:在上面这条指令后面加上-u,git就会帮你把origin/master与本地的master分支关联,这样以后你只需要用git push就可以推送了

反过来git pull就可以把服务器上的新更改都拉到本地,(然后发现你团队的另一个开发者把你的代码全删了)

奖励:终极黑科技git clone

其实这篇文章上面的所有操作都是不需要的,你只要使用下面这个指令,就会帮你自动新建本地代码仓库,并添加远程仓库,同时与远程仓库的主分支关联

git clone 你很久以前复制的地址

@3 无限回退

这是一个悲哀的故事《毒瘤的诞生》:

1994年,西南交通大学段凡丁提出了SPFA算法。

一位开发者的开发项目中需要用最短路算法,他就把所有最短路的部分从Dijkstra改成SPFA。

2018年,在NOI2018上,他发现一个事实:关于 SPFA,它死了

然后他发现,24年前Dijkstra版本的代码已经不见了

之后他的这个开发项目就被疯狂卡卡卡卡卡卡卡

在有着对出题人无限的恶意之下,他也变成了一个新的毒瘤