@0 一些废话
据说现在有不少人在试着用C++写游戏,或者写一点小程序(就像我)。这时如果你写到一半没有写完,或还想存着继续更新,你就需要一个地方来保存代码。
有些大佬直接扔洛谷剪切板里,大部分人都放在百度网盘上,还有一些人放一些奇怪的地方里(比如压缩在图片中发到sm.ms上)
然而如果有多人开发,那么你就会需要一个优秀的版本控制系统和代码托管处了。这时,你就会开始使用起下面这个软件了。
@\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
,会显示当前文件夹内和缓存区的信息。例如下图所示
我们可以看到README.md的更改还没添加到缓存区中。
这时我们把README.md添加到缓存区中
git add README.md
当然,如果你想删除文件,也是有办法的,那就是使用
git rm
一键删除,又快又方便
这时再输入git status
,就会发现现在README.md在缓存区中被修改过了,将要提交到版本库里,如下图
这时我们用git commit -m "add a+b problem"
来把它提交到版本库里
0x04 一些补充
有些时候我们可能会需要更深入地了解两个文件之间的改变。
这时,我们可以使用git diff
指令来查看文件的改变
git diff filename
是把文件和暂存区中的比较。
git diff HEAD filename
是把文件和当前版本库中的比较。
git diff --staged filename
是把暂存区中的和当前版本库中的比较。
效果大概如下图:
@2 托管
上面只是一些git的入门操作,如果想知道所有的操作可以上git官网(然而真的很全面很无聊)
接下来我才开始正式讲如何把代码保存到服务器上
0x01 git服务器
定义:git服务器是专门用来共享和储存代码的
你完全可以自己搭建一个git服务器,只要你有钱,你甚至可以实现千兆光纤接入并且配有128个高速节点的cdn分布式储存git服务器。
然而这并没有太大的必要,因为这只是为了编写一个C++小游戏而已(还整天被memset0大佬D),现在世界上有很多免费的git仓库托管服务,完全不用你自己搭建
本文就以腾讯云开发者平台
作为实例,其他的代码托管网站的操作类似。
在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
来验证是否有效。
像上图这样显示的就是添加公钥成功了。
0x03 推送拉取克隆
看到这里,我们还是没有建立本地代码仓库和服务器之间的联系,目前在本地的任何操作都和服务器无关。在这一节,你就可以学到与此有关的知识。
首先去你在开发者平台上的项目哪里,点击代码浏览
,这时,你可能会看到下面两种情况。
复制完仓库的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版本的代码已经不见了
之后他的这个开发项目就被疯狂卡卡卡卡卡卡卡
在有着对出题人无限的恶意之下,他也变成了一个新的毒瘤
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现