Git 与 Github 入门

git 你可能用不到但是 github 肯定用得到, 因为面对一大堆代码任务, 谁都想去借鉴一下他人优秀的代码.

因此本篇将向萌新们介绍一下版本管理工具 git 与全世界最大的代码托管平台 github 的基本使用方法.

Github

先说 github, 简单粗暴的理解就是, github 是一个专属于代码的云盘, 全世界的人都可以在上面存储自己的代码, 并且可以让大家都来查看自己的代码.

平常如果遇到一些不会的代码问题, 多半用搜索引擎搜出来的都是 CSDN 和博客园或者知乎的内容, 偶尔可以见到一些个人博客比如我这个. 个人博客可能质量稍好, 毕竟是自己经营的, 大概率会认真写点东西放上去, 但是前三者就不一定了, 可能同样的内容都被复制的有包浆了. 因此我们如果想要进一步提升自己的 Coding 水平, 就需要看更高质量的内容, 所以我们把目光投向了 github.

github 的最大宗旨就是开源, 任何人都可以发布自己的代码并且让他人一起协同合作. 得益于此, github 上面有很多经典的大型开源项目可供学习, 并且小项目的完整度和质量也比一众博客高出不少, 是我们借鉴代码的好去处.

github 的官网地址是 https://github.com/, 由于不可抗力, 访问不太稳定, 但是可以通过科学上网解决, 可以参考我前一篇文章解决学习道路上的 "最后 1 KB"快速入门一下. 进去之后就可以像普通的搜索引擎那样使用, 但是是搜索 github 的所有项目仓库 (多用英语搜, 结果会更理想).

Git

gitgithub 长得很像但是完全是两回事, 后者是一个存放代码的地方, 但是前者是一个代码版本管理工具.

罗马不是一天建成的, 代码也不是一天肝完的, 前一天写完的代码, 后一天就会出现 bug, 因此对一份代码不间断的进行修修补补是常事. 如果是毕业论文, 倒还是可以给文件名自己加上一个版本号, 比如 "最终版", "最终版 v2"...... 但是对于代码文件, 这就不太适用了.

一是代码文件将来会修改的次数可能太多, 一份文件动辄十几二十次, 取这么多版本号不太现实, 二是无法很好的对比每一个版本每次的修改变动, 无法让人一目了然每次修改都改了啥.

因此 git 的出现很好解决了上述问题, 下面简要介绍几个常用的 git 命令和基本概念.

安装 Git

首先当然是安装 git, 官网地址 https://git-scm.com/, 点进去直接 "Downloads" 最新版本进行安装, 安装时有一些选项值得注意一下.

vaPitJ.png]

这两个可以勾上, 这样子右键菜单里会加入这两个快捷项, 方便我们随处快速打开 git 终端.

vaPtnf.png

然后是这个, 使用 VS Code 作为 git 的默认文本编辑器. 要求我们安装了 VS Code, 然后勾选这个选项. 这个意思是一旦 git 出现需要我们手动敲一点文本内容的时候, 会弹出来 VS Code 界面作为输入界面. 强烈建议换掉, 一是好看二是省事珍爱生命, 远离 Vim.

vaPTjx.png

然后是这个, 也是建议选下面的, 曾经 git 的主分支默认叫 master, 但是现在大部分新项目都叫 main 了. 不是什么大问题, 但是建议按新的约定来紧随时代潮流.

后面的选项就可以不用太在意了, 直接一路 Next 就行了, 反正之后都还可以自己手动调整设置项.

使用 Git

这里只介绍待会要用到的命令和一些基本概念, 毕竟是入门主要是太懒不想写, 具体的细节可以自己看官方文档或者使用搜索引擎学习.

git init: 初始化一个本地仓库.

想要使用 git 来管理一个项目, 首先需要使用该命令让 git 将一个项目文件夹标记为需要被 git 进行管理的仓库. 运行完成后, 项目文件夹下就会多出来一个 .git 文件夹, 代表这个项目文件夹已经是一个合法的 git 仓库了.

git add <文件>: 临时储存文件变动.

当我们的代码文件发生改动时, 使用该命令进行临时存储, 所谓 "临时", 是指我们还没有完成一次完整的修改, 但是需要临时保存一下已经做过的修改步骤, 让我们在进一步修改时好进行对比.

git commit -m <信息>: 提交一次改动.

当我们已经完成了一次修改, 使用了 add 进行了存储, 并且想要把这次修改确定下来, 形成一次记录时, 需要使用该命令. 其中 "信息" 部分是一个很重要的内容, 是对这一次提交的一个简要说明, 日后我们可以很方便的根据当时提交时填的信息来确定提交的内容, 也可以从大量提交中快速检索与某些特定目的相关的提交.

git log --graph --oneline --all: 使用图形化方式查看所有分支的提交记录.

使用该命令可以查看所有提交记录以及各提交记录的哈希值, 有助于我们迅速了解整个仓库的提交历史记录.

git show <提交 id>: 查看某一次提交的具体内容.

"提交 id" 就是使用 git log 查到的提交记录哈希值, 显示之后会得到文件变动记录以及各文件具体的修改情况.

简单的实践一下

以我们之前曾经创建过的一个 example 项目举例, 来使用 git 对其进行本地版本管理, 项目文件结构如下所示.

1
2
3
example/
env/
main.py

总共两部分, 一个是 env 文件夹, python 的虚拟环境, 另一个是我们的源文件 main.py, 我们的目标是只提交 main.py, 而忽略虚拟环境 env, 因为环境严格来说并不需要记录到整个项目里, 每次使用时可以重新生成. 完整的命令执行记录如图所示.

vaVnBt.png

首先进入 example 文件夹, 然后使用 ls 命令查看了一下文件夹内的内容. 之后便是 init -> add -> commit 的一连串操作.

需要注意的地方是, 第一次使用 commit 时, 会给予我们图上的提示信息, 意思是提交时需要指定作者信息. 也就是对于每次提交, git 必须记录是 "谁" 提交了这次修改, 并且是通过 "邮箱" 和 "用户名" 两个信息来确定身份的. 这里我们直接按照提示信息里说的, 设置一下自己的邮箱和用户名, 然后重新使用 commit 命令进行提交即可.

vaVI8e.png

然后我们使用 logshow 两个命令查看一下刚刚的提交记录, 其中 + 表示文件内新增的行, 而 - 表示删去的行, 一般来说如果是对某一行进行了修改则会是 +- 交替出现, 这里只有 + 是因为提交了一份全新的文件.

使用 Git 管理 Github 上的项目

Git 分支简介

如果 git 的功能仅限于本地管理, 那也就止步于此了, 其最强大的功能还是与 github 结合, 从而实现本地与远程同步的版本管理.

这里需要先介绍一下 git 进行版本管理的一个重要概念 "分支".

当我们使用 git init 命令创建本地仓库时, 其实就有了第一个分支, 也是我们的主分支 main, 名字就是在安装 git 时设定的默认名称.

当我们对仓库进行操作并提交记录时, git 需要知道当前仓库正处于哪一个分支上, 并把提交记录在这个分支上, 形成分支上的一个个节点. 从而很多次提交之后, 这个分支会逐渐变长, 并且上面的节点数变多, 每一个节点就是每一次提交记录.

当你某天想让你的代码形成另外一个版本时, 但是并不想影响主分支上的内容时, 就可以从主分支的某个节点开始, 延伸出另一条新分支, 从而让两个分支上的内容同时存在且互不干扰. 可想而知, 当分支数多了之后, 分支图将会是一个树形结构.

本地仓库是如此, 对于远程仓库来说也是类似的. 当我们需要将本地的代码仓库同步放到 Github 上进行管理时, 则需要添加仓库内的 "远程分支" 信息.

远程分支与本地的分支像并列的关系, 它们之间形成关联并进行追踪, 从而你可以指定本地的某个分支与远程的某个分支进行关联并同步. 最终远程仓库的远程分支就像是本地仓库分支的一份 "备份", 无论是哪一边有改动, 都可以通过 git 指令来进行互相同步.

这里放上一个经典的图形化 git 操作学习网站 Leanr Git Branching, 有助于快速理解 git 的分支概念几乎我所有认识的学长都推荐过.

在 Github 上发布第一个项目

首先, 你得注册一个 Github 账号, 点 Sign up 之后自己琢磨吧.

注册好之后, 你的个人界面网址应该就是 https://github.com/<用户名>/, 并且进去后界面大概长的像下面的样子.

vaLItP.png

但是在创建仓库发布项目之前, 还有一步重要的事情, 往自己的 Github 里添加 ssh 连接公钥, 可能现在你还不清楚是什么但是照着教程做即可, 既可以提高安全性也可以避免一些麻烦. (如果有喜欢尝试的同学可以试一下走 http 协议的方式, Github 已经不推荐并且由于不可抗力网络质量也很差.)

贴上官方的教程, 同时下面也会简要描述一下步骤.

1.生成自己的 ssh 公钥
如果曾经已经生成过的同学可以酌情跳过这一步.
打开 git bash 或者 cmd, 输入以下指令.
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
其中 -C 后面跟的是注释内容, 一般填一个能够标识身份的邮箱地址. 之后一路回车即可.
成功生成之后, 可以使用 lscat 命令查看生成的文件与公钥内容.
所有操作和成功生成后的结果如下图所示.
vwila8.png
2.将公钥添加到 Github
回到 github 的个人主页面, 进入 "Settings" 界面, 在左侧选择 "SSH and GPG Keys", 然后选择 New SSH Key, 并将公钥文件 id_rsa.pub 的内容复制进去, 注意是公钥文件 id_rsa.pub.
vwi2s1.png

继续回到我们的 Github 个人主页面, 点击页面右上角的加号, 选择 "New repository", 创建我们的第一个项目仓库.

v0E9gg.png

如图所示填好必要的信息, 其中选项 public 即代表这是一个公开仓库, 任何人都可以在 github 上访问并查看里面的文件内容.

创建完成后, 会显示三种后续的操作, 在这里我们选择第二种, "将已有的仓库从命令行推送".

进入你的本地仓库, 打开 git bash 并依次执行下面三条命令.

git remote add origin git@github.com:<用户名>/<仓库名>.git: 将远程主机与仓库地址添加到本地仓库配置中, 主机名 origin, 地址为 ssh 地址 git@github.com:<用户名>/<仓库名>.git

git branch -M main: 可选步骤, 将当前分支重命名为 main, 此前我们的分支名已经是 main 了.

git push -u origin main: 将本地分支 main 推送到远程主机 origin, 并且远程分支名与本地相同也为 main.

执行完成后稍等一会刷新一下页面, 就可以看到 github 上已经有本地仓库的内容了.

在本地管理远程项目

这部分主要介绍平常敲代码时常用的命令流.

git pull: 进行写代码时的第一步, 使用该命令可以将远程仓库里的最新记录同步至本地.

git add <文件>: 写代码中途或者写完代码后, 将修改后的文件进行储存.

git commit -m <信息>: 将所有通过 add 存储的内容进行提交, 产生一次记录.

git push: 将本地所有的提交记录同步推送到远程仓库.

在 VS Code 中使用 Git

前面花了很长的篇幅讲解 git 的各种使用, 并且有着非常多的命令, 很容易让人头晕. 但是好在大部分命令都是重复相似的, 因此, 为了省事, 绝大多数开发工具都支持图形化的 git 命令操作, 从而避免了命令行的痛苦. 但是在使用时仍然需要知道每一个按键选项与命令的基本对应关系, 清楚每一步具体做了什么.

VS Code 本身自带对 git 的支持, 且已经能够满足基本使用. 打开我们的 example 项目, 左边切换到 源代码管理 的面板.

v0naB4.png

在这里可以看到本地仓库的所有更改, 我们可以手动切换一下视图模式, 以树形式查看, 方便与资源管理器的视图对应.

可以看到存在两部分变动, 且标记为 U, 意为 "未跟踪", 也就是它是一份新文件, 如果是曾经有过记录则是 M. 点击左侧的文件名, 还可以在右方的窗口里预览文件的每一行更改情况.

我们选择 main.py 一行右侧的 + 号, "暂存更改", 其行为等价于 add 操作.

v0uFrF.png

操作之后 main.py 被放入 "暂存的更改" 中, 此时可以在上方的输入框中键入信息, 然后点提交, 该步骤等价于 git commit 操作.

如果没有暂存的更改, 则所有的更改都将会被提交. 如果提交信息为空, 则会弹出界面让你输入信息.

v0KiWt.png

提交完成后, VS Code 左下角将会如图所示, 有一个双箭头圆圈且有数字标记, 意为本地比远程多一次提交记录, 点击圆圈, VS Code 会将本地仓库与远程仓库进行自动同步, 其操作等价于先进行 pull 再进行 push.

一般来说, 推荐使用命令行创建仓库以及关联远程仓库等初始化操作, 之后再使用图形化界面进行每天的提交和同步操作. 此外, 如果觉得 VS Code 原生支持不够, 还有丰富的插件可以选择, 比如 GitLens 诸如此类.

后记

尽可能的把平常高频使用的内容都写上去了, 虽然感觉写的很长但是仍然很难把每一件事都写的很清楚, 只能是把表面写一写, 内部的细节原理不是这个入门篇能一次性搞定, 还得靠自己平日善用搜索引擎和官方文档.

这里贴一下 gitgithub 的文档地址, https://git-scm.com/docs, https://docs.github.com/cn, 熟能生巧~