git
git是什么?维基百科上的解释是这样的:
git是分布式版本控制软件,最初由Linus创作。
通俗来说它是一个 “月光宝盒”,有版本回溯和创建平行时空的能力:
-
每次修改代码都有记录,可以方便地回退
-
可以从主干中创建分支,修改分支后与主干合并
-
本地修改可以推送到云端,这样方便保存和拉取代码
总而言之,git方便了程序员去管理代码和团队协作。
最小化使用git
git这个软件是开源的,但需要一个存储代码的云端,知名的代码托管平台是 github, gitlab 和 gitee。
gitee 网址:https://markdown.com.cn
注册之后,需要在"设置->邮箱管理"里绑定一个邮箱,系统会发送一个验证的邮件,点击链接验证。
为了保护隐私,务必把下面的选项勾上:

点击右上角+号,可以新建一个仓库。请记住,一个仓库下载到本地就是的一个文件夹,文件夹名称就是你设置的仓库名。因此第一次取名时要慎重。
远端新建好了一个仓库,那怎么往上面传代码?
git的基础工作流是这样:
-
选一个文件夹初始化git
-
添加和修改代码,add,commit保存记录
-
push推送到远端
一些git命令:
-
初始化git文件夹
git init:在当前文件夹下新键.git文件夹,git开始追踪文件夹下的文件。首次配置时使用。 -
添加一次修改记录
git add .:添加文件夹下所有文件至暂存区。git commit -m "First commit":生成一次修改记录,记录add的文件。 -
推送至远端
git push:把commit的修改同步至远端。 -
从远端同步
git pull:从远端拉取。 -
切换分支
git checkout -b branchname:创建并切换至一个新的分支。 -
查看当前分支
git branch项目有一个默认的主干,为
master或main,修改这个branch时要慎重。一般的做法是,checkout签出一个新分支,在这个新分支上修改代码,测试后再合并到主干。 -
首次推送新分支
git push -u origin 分支名:新创建的分支无法直接git push,需首次在远端指定 -
删除分支
git branch -d 分支名:分支合并后,不需要了可以在本地删除。git push origin --delete 分支名:上面的命令只是删除本地分支,这个命令删除远程分支。
其他:
-
配置用户名和邮箱
1 2git config user.name "你的用户名" git config user.email "你的邮箱" -
查看git状态
git status -
删除远程文件,本地不删除
1 2git rm --cached 文件名 git rm -r --cached 文件夹
用git管理OpenGL项目
个人认为,即便是完成计算机图形学的课程作业,使用git来管理 opengl 的代码是有必要的。
特别是对于小组多人协作,你永远无法想象别人会把头文件放在什么位置。这就导致代码发给别人,无法直接运行。
相比于VSCode,VS2022最方便的点在于,可以直接点开 .sln 文件,就会自动加载整个解决方案,里面的多个项目可以直接运行。git可以充分利用这个优势,让小组成员开发代码的效率堪比火箭。
使用git来管理opengl项目,应该要做到以下几点:
-
大家共用相同的头文件和类,并且在源代码的导入路径一致。
-
第三方lib每个人不一样,但也应当放在相同的文件夹。这样在项目里指定的文件夹保持一致。
-
每个人有自己的解决方案的文件夹,自己的项目全放在下面。别人打开自己的
.sln,稍加设置后也能运行。
项目结构
opengl最难管理的就是各种库,包括头文件include,和lib等,以及自己写的类。
项目结构如下:
|
|
VS每个项目都要指定项目属性,包括头文件的路径,依赖库的路径,这些都可以用一个props文件来配置,每个项目新建时和运行别人的项目时导入即可。
一个props文件示例:
|
|
最好是所有人共用一个props,某个项目有特殊配置,单独写一个props。
VS的许多导入机制不是简单的复制文件,而是引用。原文件一旦修改,引用这个文件的部分也会生效。
工作流程
-
签出分支
所有人一定要保证主分支的干净,不要让多余的文件提交到仓库! 下面几种情形,一定要创建并切换到新的分支进行:
-
我要运行和调试代码(无论别人的还是自己的),并加入新的依赖。
-
我要写新的类,需要新增
.h和.cpp文件 -
我要使用新的模型文件
-
-
新增项目
在自己的解决方案文件夹里新建项目,每个项目导入
props文件,一键配置好依赖。新写的类在自己的项目里测试,完成后放到公共的include文件夹。 -
运行别人的项目
直接点开
.sln文件,可能要配置props,运行 -
增加依赖库
不用编译的头文件直接放
include文件夹,根据自己电脑编译出来的产物放thirdLibrary。 -
推送分支
把分支提交到远程,发起 pull request
类的实现文件
类的实现文件 .cpp,.c文件放在src文件夹下,在每个项目的解决方案视图里的头文件里添加现有项。
`.cpp`文件不能向头文件那样直接指定目录,需要在VS里导入,在编译期才会参加编译。
大体积资源文件
opengl项目涉及的纹理、贴图、模型的文件体积都较大,glb 文件更是动辄几种兆。大文件 不适宜使用git管理,不要把它们提交到仓库。幸运的是,这些文件整理好能使用之后,不会再次修改(没有建模的实力)。
在和gpt一番智斗后,有了下面的思路:
|
|
可以用一个json文件保存文件信息,包含文件名,类型,最重要的下载链接。脚本读取到json文件后,按url索取模型文件,放在同级目录里。又一番跟AI智斗后,它给了一个自动遍历json文件,自动下载的python脚本。