Git/Github 快速入门
Github 快速入门
本篇文档意在使没有接触过Git 和 Github 的同学快速上手参与团队项目协作,不涉及 Git 的原理和 Github 的高级用法。
一些用词并不严谨,只是方便入门理解本篇不含换源、代理等内容,如遇网络问题请自行解决。
什么是 Git 和 Github
git 是一个版本控制系统,可以记录文件(代码)的修改历史。
Github 是一个基于 git 的代码托管平台,是一个网站(可以粗浅的这么理解),可以方便的进行团队分享项目代码,共享开发进度。
我为什么要用git
- 你可以在本地记录你的代码修改历史,方便回滚到之前的版本。(例如:还是用第一版方案吧)
- 防止手欠,不小心把代码删了,可以从git上恢复。(例如:我代码呢?)
- 开启分支(branch)来开发不同功能,不同分支之间不会相互影响。(例如:我要开发一个新功能,但是我不想影响到别人开发的功能)
大体用法如上述,更多用法请自行百度。
我为什么要用Github
- 开启一个网络备份,防止本地代码丢失。
- 方便团队协作,可以看到别人的代码修改,可以方便的进行代码合并。
git是本地的,Github是网络的,我可以在git上面记录我的代码变更,但为了同步他人的代码变更,我需要Github上。
git的安装
下载git安装包
下载地址:Git
大部分人应该是使用Windows系统来第一次接触git,所以这里以Windows为例。直接点击下载安装包,然后运行exe即可。

运行后进入安装配置,配置很多但一般没用,直接默认下一步即可。或者见参考文章
检查git是否安装成功
命令行输入:
1 | PS whatever> git -v |
如果出现版本号则安装成功。
1 | git version 2.41.0.windows.1 |
当然如果提示git不是内部或外部命令,可以检查环境变量是否配置正确。或者直接重启电脑(环境变量修改需要重启生效)。
下载Github Desktop
我们暂时不需要刚刚安装的gitbash,因为gitbash是一个命令行工具,也不使用gitGUI,因为做的太丑了。
GitHub Desktop基本可以看作承接gitGUI的工作,而且推送GitHub更加方便。
下载链接:GitHub Desktop
这就是一个软件,各位应该会安装,不再赘述。
实在不行参考Github Desktop 纯萌新入门教程
安装后需要登录你的Github账号,如果没有请自行注册。
Github Desktop的使用(git基本概念介绍)
这一段我不知道该怎么开始,一般的教程会从创建仓库开始,但是我不想。。。
我们先介绍一些概念,然后直接开抄开始复制别人(项目组)的项目
仓库(Repository/repo)
仓库是存放代码的地方,可以理解你的项目文件夹。你的代码文件应该包括在里面
分支(Branch)
不同的分支可以存放不同的代码,也不会互相影响。但是分支之间可以进行代码合并(merge),也就是为什么我们不去建立多个仓库,而是建立多个分支。
从实践上讲,我们一般会建立两个分支,一个是主分支(master),一个是开发分支(dev)。两个分支主体是相同的,我们在dev测试新功能的时候,不会影响到master的稳定性。当dev的功能测试完成后,我们会把dev的代码合并到master,这样master就有了新功能。
一般遵循一个功能一个分支,每个分支的改动尽可能小,这样方便合并。
分支合并后就可以删除了(但也不是必须的,看个人是否有强迫症)
gitignore
.gitignore
文件是用来忽略一些文件的,例如一些IDE生成的文件,或者一些不需要上传的文件。
这个功能很重要,能避免一个脏的仓库(包含一些临时文件、ide的配置文件等等)
但我们大多数时候并不需要手动去写这个文件,我们会复制github上的ignore模板。
当然我们可能会手动添加一些规则,比如忽略掉图片文件夹
1 | /images/* |
或者某个文件或某种类型的文件
1 | password.txt |
开抄!!(Clone/Fork)
clone和fork的功能都是获取别人的代码,但是clone是获取别人的代码到本地,fork是获取别人的代码到自己的仓库。
如果需要进行二次开发的话,建议fork,如果只是想看看别人的代码,建议clone(clone的仓库没有权限更改)。
下面介绍如何fork一个仓库(github网站上操作)
以这个仓库为例:Qianmoxsn/gittutorial
因为我不能fork自己的仓库,所以下面截图我使用了其他的仓库
点击fork按钮,在配置界面取消勾选仅main,然后点击create fork即可。


等待加载完成,你就获得了一个和上游仓库一模一样的,但是你有权限更改的仓库了(挂在你名下)。

本地仓库(Local Repository)
现在在你的GitHub网站上会出现一个和上游仓库一模一样的仓库,你也可以在网站上修改了(但不建议)。
下面我们要把这个仓库clone到本地,然后在本地使用ide来更优雅的进行修改。
打开GitHub Desktop,点击File->Clone Repository,选择你刚刚fork的仓库,点击clone即可。
当然也可以在网站发起这个请求。


这里两个选项的区别注释说明的很清楚了,我们选择为上游贡献,当然这无所谓,我们并不使用软件提起pr。

整理一下
好吧我承认前面的概念有些杂,我们好像搞出了很多一样的仓库,但不要慌,我尽可能用一张图让你理解这些概念。

首先我们要区分一下,我们的本地仓库和远程仓库(GitHub网站上的仓库)。我们刚才进行的操作也可以在图中表示出来
更改与贡献 (Commit/Push/PR)
我先给出一张图来解释一些的概念

!!注意!! 我们在提交前要先下一节所说的所有同步操作,避免后续代码冲突。
一些代码更改(changed file)
当我们进行了代码更改后,git会探测到这些更改,并且标记现在的文件为changed file。
例如我们新建并修改了main.c文件,git会标记这个文件为changed file。当我们需要git记下这些更改时,我们需要commit。
提交(commit)
我们需要写一些有意义的message。来表示我们做出了什么样的改动,例如我们实现了了main.c的主逻辑,这是一个新功能(feature/feat)。
一些message的规范可以参考这里
点击Commit to <branch>
,我们就完成了一次提交。

之后我们可以从提交记录中看到我们的更改,同时也提醒我们这些更改只是在本地(GitHub页面上不会出现),我们需要 push
到远程仓库。

push
后我们可以在GitHub中查看到这些记录。

向上游仓库提交PR (PR/pull request)
接下来是如何向上游仓库提交我们的功能 (PR/pull request),我们在GitHub网站中进行操作。
首先我们需要我们的(Remote)仓库与上游(upstream)仓存在不同的commit记录
进入 Pull requests
页面,点击 New pull request

选择好base和compare,点击 Create pull request

和commit message一样,填写好PR title和PR description,点击 Create pull request

之后,上有仓库的管理员会负责合并这些代码。

获取他人的更改 (Sync/Fetch/Pull)

!!注意!! 我们在提交前要先进行本节所说的所有同步操作,避免后续代码冲突。
有些时候我们需要跟进上游仓库的功能更改,那么我们就需要进行同步操作。
只要我们的仓库是fork的,那么我们就会看到一行同步栏,我们通过 Update branch
来同步上游更改。

就像我们本地的更改不会自动同步到远端仓库一样,我们刚刚进行的远端更改也需要手动同步到本地仓库。这个操作叫做 pull
。
至于 fetch
是什么,我们可以理解成本地仓库向远端发起的刷新请求,寻找是否有新的更改可以 pull
。

先
fetch
再pull
是一个好文明
建立分支 - 一个避免炸仓的操作 (Branch)
前面说过,我们要通过建立分支来实现一个尽可能小的功能,这对防止代码合并冲突有着很大的帮助。
假如现在我们已经 Sync
(Fork
) 了上游仓库的更改,并且已经 Pull
到了本地,我们需要在这个基础上实现一个新功能。
处于保护主分支的原则,我们从最新commit上建立新分支(根据实际情况可以从任意commit建立分支)
在Github Desktop中操作如下:
选中commit,右键,点击 Create branch from commit
从该条commit建立新分支

在弹出的对话框中,填写新分支的名字(最好与这个分支要进行的功能相关),点击 Create branch

之后我们就可以在分支栏中看到我们新建的分支了,点击 Current branch
可以切换分支,点击 Publish branch
可以将分支推送到远端仓库。

我们在新分支上进行的更改不会影响到主分支,也不会影响到其他分支,这样就可以避免炸仓了。
在提交PR时,我们也可以选择新分支作为compare来提交功能。
合并代码 (Merge)
这一部分是仓库的管理员需要做的事情。