这是一个方便互相学习交流的算法竞赛代码仓库。
本仓库大部分的文件都是 AC 代码,因为文件过多且不包含题目,所以通过查阅代码来学习并不方便,建议先阅读参与人员的笔记。
记笔记是个好习惯。
-
为了避免乱码影响阅读,所有文件都应该以英文名开头,可以添加中文后缀解释说明,文件内可以使用中文。
-
为了一致性,文件名最好都使用小写,单词之间用下划线或减号分隔,例如:
book-problem
,19_trails_i.cc
。 -
为了让其他人能更快地上手,应该编写简单易懂的说明文档,可以在文件夹下放置一个
README.md
描述这个文件夹是干什么用的,或是在下面的仓库结构添加文件或文件描述。
-
acw:ACWing 上的题目代码,例如:
acw99.cc
表示 ACWing 上的第 99 题。 -
ch:Contest Hunter 上的题目代码,例如:
ch0101.cc
。 -
cf:CodeForces。
# 该概览由 'tree -L 2' 命令生成,可能不会及时更新
.
├── cyj
| ├── cf
| ├── t.cpp
| ├── 动态规划
| ├── 图论
| ├── 搜索
| ├── 数学
| ├── 数据结构
| ├── 洛谷题单
| ├── 训练
| └── 铜牌题目
├── jax
| ├── 8-23
| ├── classic-经典算法
| ├── codeforces
| ├── competition
| ├── luogu
| ├── misc
| ├── note.md
| ├── template-problems
| ├── templates
| └── training
├── LICENSE
├── lqw
| └── hello.cpp
├── lyb
| └── ccpc_2021_weihai
├── old
| ├── 21-trails-集训队选拔赛
| ├── misc-杂项
| ├── train-训练
| ├── vj
| └── weekly-contest-周赛
├── problem_list.md
├── README.md
├── resource
| ├── 21-03-21-id.png
| ├── 21-03-21-shotcut.png
| ├── clean.ps1
| ├── clean.sh
| └── cpp_operator_priority.png
└── share
├── algorithm-advance-算法进阶指南
└── compare-对拍
directory: 33 file: 11
普通文件不加斜杠,例如:example.txt
;加斜杠表示目录,例如:dir/
。
未列出所有文件或文件夹
Git 是一个用于版本控制的命令行工具,可以很方便地备份和恢复各个时间节点的代码,再加上 GitHub,在不同设备上的同步也变得简单便捷。
!注意,这里的所说的基本使用真的十分基本,甚至你看完后依然会碰到一堆问题,建议在使用过程中熟练运用搜索引擎,如果发现本文有任何失误或一些基本操作没有设计,欢迎纠正和丰富本文内容,这也可以当作使用 Git 的练习。BTW,《Pro Git》是相当好的一本介绍 Git 的书,推荐阅读:https://gitee.com/progit/
Windows 到官网下载无脑下一步。
-
仓库(repository):代码存放的目录,Git 只能操作仓库下的文件。
-
文件的状态:在 Git 里文件大概可以分成四种状态:未跟踪、已修改、已暂存和已提交。
-
未跟踪:顾名思义就是 Git 不管的文件,提交时不会打包到压缩包里。
-
已修改:之前已经提交过的文件后又经过修改的文件。
-
已暂存:使用
git add
后文件的状态,这个状态是为了给提交做准备,提交的时候会将暂存的文件打包进压缩包里。 -
已提交:已经存在之前提交里并没有修改过的文件。
-
-
提交(commit):就是选中文件的备份,Git 会在每次提交的时候将已跟踪的文件打包进一个压缩包,恢复以前代码的原理就是解压之前提交的压缩包。
之前提到,Git 是一款命令行工具,虽然现在各种 IDE 和编辑器(如 VS Code)都提供了 Git 插件支持,但是想要用好 Git 还是需要对命令行有一定的了解,如果只是想要能用的话,真的只需要会敲一点点命令就行。
-
配置 Git 的用户信息
这一步就相当于注册账号时的完善个人信息,因为一个仓库可能有多个人参与,所以 Git 必须要通过用户信息来分辨谁是谁。
# 设置名字和邮箱,只需要设置一次 git config --global user.name "your name" git config --global user.email "your email"
-
初始化一个仓库
Git 的使用是有条件的,就是必须要在仓库下进行,使用
git init
后,Git 会在当前目录下新建一个隐藏目录.git/
表示这是一个仓库,你也可以把.git/
当作版本库。git init
-
克隆一个仓库
克隆就是将别人的仓库复制过来,内容完全一样,并且也拥有所有提交的历史记录。注意是将仓库复制到当前路径,而不是将仓库中的内容复制到当前路径,试一试就知道是什么意思了。
# git clone 后面的是本仓库的链接 git clone [email protected]:chu_ying_jie/acm.git
-
查看仓库的状态
输入后可以看到当前仓库有哪些文件修改过,以及一些提示。
git status
例如(注释是加上去的):
On branch master # 在主分支 Your branch is up to date with 'origin/master'. # 你的分支和远程分支同步 Changes not staged for commit: # 没有暂存的提交 (use "git add <file>..." to update what will be committed) # 告诉你怎么暂存的提示 (use "git restore <file>..." to discard changes in working directory) # 告诉你怎么取消暂存的提示 modified: ../../README.md # 修改的文件 no changes added to commit (use "git add" and/or "git commit -a") # 提示你没有修改被暂存
-
暂存文件
前面
git status
给出的信息已经提示了如何暂存,这里主要就讲一下几个比较方便的变体:git add . # 暂存当前目录下的所有文件,单独一个 . 代表当前目录 git add *.cpp # 暂存当前目录下的所有以 .cpp 结尾的文件,* 表示通配符,可以匹配任意长度任意字符 git add -A # 暂存所有文件,不仅仅是当前文件夹下,-A 表示 All
-
提交
假设你已经知道了文件暂存是什么意思了,那么提交就是将暂存的文件保存到版本库中。
git commit # 不指定提交信息,回车后系统会自动生成一个文件让你输入提交信息 git commit -m 'some message' # 用括号括起来的就是提交信息,系统就不会再生成文件让你输入了
-
推拉
假如你现在已经在你的机器上写好了一份 AC 代码想要和别人分享,那该怎么办呢?很简单,使用
git push
就能将你本地的仓库和远程仓库合并,这样远程仓库里的文件就和你本地的一样了,不过有一点需要注意,就是除了你还可能有别人在你之前修改了仓库,这个时候直接pull
是行不通的,你必须先将别人的修改拉下来(git pull
)再把自己的代码推上去。git pull # 将远程仓库的修改同步到本地仓库 git push # 建议每次推代码上去的时候都先 git pull 一下
-
获取访问权限
很多仓库都是公开的,但不是你的仓库,你可能就没有权限去修改,在 GitHub 或 Gitee 上管理员可以授予成员权限,但 Git 为了让权限被对的人使用就必须知道尝试推代码的人的身份,仅仅使用之前配置过的名字和邮箱是不够的,因为这个很容易伪造。Git 的解决方法有两个:密码和密钥。因为密码访问很简单而且不方便这里就不赘述了,下面我们来简单介绍一下如何使用
SSH 连接
。-
生成密钥对:
# 这条命令会在你的家目录下的 .ssh/ 文件夹下产生两个文件 # 一个是自己保管的私钥,一个是等会要放到服务器上的公钥 # 如果碰到停顿敲回车就好了 ssh-keygen -t ed25519 -C "[email protected]" # 如果您使用的是不支持 Ed25519 算法的旧系统,请使用以下命令: ssh-keygen -t rsa -b 4096 -C "[email protected]"
-
将公钥复制到 Gitee 或 GitHub 上:
这里我们以 Gitee 为例。
-
进入家目录下的
.ssh/
目录找到公钥id_ed25519.pub
或id_rsa.pub
,打开并复制其中的内容。 -
进入 Gitee 的密钥设置页面:https://gitee.com/profile/sshkeys,粘贴提交完事。
-
现在使用
ssh -T [email protected]
查看是否成功:$ ssh -T [email protected] Hi Jax Young! You've successfully authenticated, but GITEE.COM does not provide shell access
-
-
-
使用别名简化使用,例如:
# 设置 git info 为 'git log --pretty=format:"%h - %an, %ar : %s" --graph' 这一长串命令的别名 git config --global alias.info 'log --pretty=format:"%h - %an, %ar : %s" --graph' # 设置好后就可以直接使用查看格式化的 git 日志 git info