技术背景
Gitee是一款国内的git托管服务,对于国内用户较为友好,用户可以访问Gitee地址来创建自己的帐号和项目,并托管在Gitee平台上。既然是git的托管服务,那我们就可以先看看git的一些基本用法:
[dechin@dechin-manjaro~]$git--help用法:git[--version][--help][-C<路径>][-c<名称>=<取值>][--exec-path[=<路径>]][--html-path][--man-path][--info-path][-p|--paginate|-P|--no-pager][--no-replace-objects][--bare][--git-dir=<路径>][--work-tree=<路径>][--namespace=<名称>]<命令>[<参数>]这些是各种场合常见的Git命令:开始一个工作区(参见:githelptutorial)clone克隆仓库到一个新目录init创建一个空的Git仓库或重新初始化一个已存在的仓库在当前变更上工作(参见:githelpeveryday)add添加文件内容至索引mv移动或重命名一个文件、目录或符号链接restore恢复工作区文件rm从工作区和索引中删除文件sparse-checkout初始化及修改稀疏检出检查历史和状态(参见:githelprevisions)bisect通过二分查找定位引入bug的提交diff显示提交之间、提交和工作区之间等的差异grep输出和模式匹配的行log显示提交日志show显示各种类型的对象status显示工作区状态扩展、标记和调校您的历史记录branch列出、创建或删除分支commit记录变更到仓库merge合并两个或更多开发历史rebase在另一个分支上重新应用提交reset重置当前HEAD到指定状态switch切换分支tag创建、列出、删除或校验一个GPG签名的标签对象协同(参见:githelpworkflows)fetch从另外一个仓库下载对象和引用pull获取并整合另外的仓库或一个本地分支push更新远程引用和相关的对象命令'githelp-a'和'githelp-g'显示可用的子命令和一些概念帮助。查看'githelp<命令>'或'githelp<概念>'以获取给定子命令或概念的帮助。有关系统的概述,查看'githelpgit'。
如果git安装成功,就会有上述的执行反馈。我们可以在git命令行上进行操作,比如执行代码的提交等任务。
首先我们在Gitee上面创建好一个项目,或者我们可以查看其他已经创建好的项目的首页,一般是如下的形式:
我们可以点击这里的Fork,将该仓库fork到自己的帐号下。一般如果我们没有原仓库的developer权限的话,只能通过提交PullRequest来进行代码提交。因此操作逻辑变成了:先把代码仓Fork到自己的帐号下,在自己的帐号下进行修改,将Fork仓库的代码更新到源仓库代码中。Fork成功后可以在自己的帐号下看到这样的一个项目:
拉取仓库
在通过上一章节的方法拷贝了仓库到自己的帐号下之后,我们可以将该仓库下载到本地进行操作,使用gitclone即可:
[dechin@dechin-manjaro2021-quantum]$gitclonehttps://gitee.com/dechin/your_library.git正克隆到'your_library'...Usernamefor'https://gitee.com':dechinPasswordfor'https://dechin@gitee.com':remote:Enumeratingobjects:200,done.remote:Countingobjects:100%(200/200),done.remote:Compressingobjects:100%(113/113),done.remote:Total200(delta85),reused200(delta85),pack-reused0接收对象中:100%(200/200),2.01MiB|433.00KiB/s,完成.处理delta中:100%(85/85),完成.
下载仓库完成后,可以看到本地新建了一个名为your_library的目录,点击进去就是我们下载下来的仓库代码。
这里我们顺带介绍一下在本地用vim操作的一些简单技巧,比如显示行号及其效果图片:
:setnu
取消行号显示及其效果图片:
:setnonu
提交更新
在上一章节中我们介绍了如何将代码下载到本地,下载到本地之后我们可以使用各种的编辑器和IDE进行代码增加修改与测试。比如完成了某一项任务之后,修改了一个名为_circuit_level_count_test.py的文件,那我们就可以将这个代码文件用gitadd提交到远程仓库:
[dechin@dechin-manjarotests]$gitadd_circuit_level_count_test.py
为了使得代码库的历史更加明了,我们最好规范一下提交信息,比如下述示例介绍了一个案例,修复了#i3CDFM这个Issue,那么我们就可以将提交信息按照如下写法进行编写:
[dechin@dechin-manjarotests]$gitcommit-m'Fixissue#i3CDFM'作者身份未知***请告诉我你是谁。运行gitconfig--globaluser.email"you@example.com"gitconfig--globaluser.name"YourName"来设置您账号的缺省身份标识。如果仅在本仓库设置身份标识,则省略--global参数。fatal:无法自动探测邮件地址(得到'dechin@dechin-manjaro.(none)')
一开始任务进行得不太顺利,按照提示中的说法,是因为我们没有配置帐号和邮箱,这里我们可以用提示的指令进行配置:
[dechin@dechin-manjarotests]$gitconfig--globaluser.email"your_email@gmail.com"[dechin@dechin-manjarotests]$gitconfig--globaluser.name"dechin"
配置完基本信息之后,我们再次尝试代码提交信息的编写:
[dechin@dechin-manjarotests]$gitcommit-m'Fixissue#i3CDFM'[master591f9cf]Fixissue#i3CDFM1filechanged,2insertions(+),5deletions(-)
在上述信息出现之后,就表示执行成功了,那么我们就可以进行远程代码提交了:
[dechin@dechin-manjarotests]$gitpushUsernamefor'https://gitee.com':dechinPasswordfor'https://dechin@gitee.com':枚举对象中:7,完成.对象计数中:100%(7/7),完成.使用8个线程进行压缩压缩对象中:100%(4/4),完成.写入对象中:100%(4/4),411字节|411.00KiB/s,完成.总共4(差异3),复用0(差异0),包复用0remote:PoweredbyGITEE.COM[GNK-5.0]Tohttps://gitee.com/dechin/your_library.git6e345ad..591f9cfmaster->master
提交过程中有可能要求我们输入Gitee平台的用户名和密码,我们按照提示进行输入即可。需要注意的是,如果提交的不是默认分支,最好可以指定一个分支进行提交,比如gitpushoriginmaster。
多次提交
一般在一次特性提交的过程中,会涉及到不止一次的提交,我们也可以将这些提交同步刷新到同一个分支下,相关的操作都在上一章节中介绍过,这里我们仅简单展示一下这个流程:
[dechin@dechin-manjarodrivers]$gitadd_save_molecule.py[dechin@dechin-manjarodrivers]$gitcommit-m'Fixissue'[masterbff0b02]Fixissue1filechanged,3insertions(+),6deletions(-)[dechin@dechin-manjarodrivers]$gitpushUsernamefor'https://gitee.com':dechinPasswordfor'https://dechin@gitee.com':枚举对象中:11,完成.对象计数中:100%(11/11),完成.使用8个线程进行压缩压缩对象中:100%(5/5),完成.写入对象中:100%(6/6),526字节|526.00KiB/s,完成.总共6(差异4),复用0(差异0),包复用0remote:PoweredbyGITEE.COM[GNK-5.0]Tohttps://gitee.com/dechin/your_library.git591f9cf..bff0b02master->master
提交成功2次之后,我们可以用如下指令查看历史提交信息,这里的-n5表示我们只查询最近的5条提交信息:
[dechin@dechin-manjaro2021-quantum]$gitclonehttps://gitee.com/dechin/your_library.git正克隆到'your_library'...Usernamefor'https://gitee.com':dechinPasswordfor'https://dechin@gitee.com':remote:Enumeratingobjects:200,done.remote:Countingobjects:100%(200/200),done.remote:Compressingobjects:100%(113/113),done.remote:Total200(delta85),reused200(delta85),pack-reused0接收对象中:100%(200/200),2.01MiB|433.00KiB/s,完成.处理delta中:100%(85/85),完成.0
这里编号bff0b02和编号591f9cf的commit就是我们刚才所更新的两条,我们还可以在这里看到commit的信息。
变基
在上一章节中,我们可以看到过往的2条commit实际上是在执行同一个任务,比如修复某一个issue。但是这里的commit信息却有2条,因为我们是分了2次来提交的,这显得提交的信息和内容非常的不简洁,变基(rebase)就是优化这个commit信息显示的方案,我们可以将过往的2条相同的提交记录合并成1条:
[dechin@dechin-manjaro2021-quantum]$gitclonehttps://gitee.com/dechin/your_library.git正克隆到'your_library'...Usernamefor'https://gitee.com':dechinPasswordfor'https://dechin@gitee.com':remote:Enumeratingobjects:200,done.remote:Countingobjects:100%(200/200),done.remote:Compressingobjects:100%(113/113),done.remote:Total200(delta85),reused200(delta85),pack-reused0接收对象中:100%(200/200),2.01MiB|433.00KiB/s,完成.处理delta中:100%(85/85),完成.1
这里省略了一些编辑的流程,实际上我们要进入到一个rebase的编辑界面,我们pick需要保留的commit。对于不需要保留的commit信息,我们可以直接将前面的pick改成fixup,然后删除后面的commit信息。变基执行完毕之后,需要强行push:
[dechin@dechin-manjaro2021-quantum]$gitclonehttps://gitee.com/dechin/your_library.git正克隆到'your_library'...Usernamefor'https://gitee.com':dechinPasswordfor'https://dechin@gitee.com':remote:Enumeratingobjects:200,done.remote:Countingobjects:100%(200/200),done.remote:Compressingobjects:100%(113/113),done.remote:Total200(delta85),reused200(delta85),pack-reused0接收对象中:100%(200/200),2.01MiB|433.00KiB/s,完成.处理delta中:100%(85/85),完成.2
远程链接
我们可以使用gitremote-v查看当前仓库的远程链接状态,如果要从我们Fork的仓库向原始仓库提交PR的话,就需要创建两者的链接。如果是链接未建立的情况,该命令的返回结果如下:
[dechin@dechin-manjaro2021-quantum]$gitclonehttps://gitee.com/dechin/your_library.git正克隆到'your_library'...Usernamefor'https://gitee.com':dechinPasswordfor'https://dechin@gitee.com':remote:Enumeratingobjects:200,done.remote:Countingobjects:100%(200/200),done.remote:Compressingobjects:100%(113/113),done.remote:Total200(delta85),reused200(delta85),pack-reused0接收对象中:100%(200/200),2.01MiB|433.00KiB/s,完成.处理delta中:100%(85/85),完成.3
这里只显示了Fork之后的仓库的地址,说明我们还没有跟原始仓库建立起链接,这时候需要执行upstream指令:
[dechin@dechin-manjaro2021-quantum]$gitclonehttps://gitee.com/dechin/your_library.git正克隆到'your_library'...Usernamefor'https://gitee.com':dechinPasswordfor'https://dechin@gitee.com':remote:Enumeratingobjects:200,done.remote:Countingobjects:100%(200/200),done.remote:Compressingobjects:100%(113/113),done.remote:Total200(delta85),reused200(delta85),pack-reused0接收对象中:100%(200/200),2.01MiB|433.00KiB/s,完成.处理delta中:100%(85/85),完成.4
此时再运行gitremote-v,我们就可以看到新的远程链接:
[dechin@dechin-manjaro2021-quantum]$gitclonehttps://gitee.com/dechin/your_library.git正克隆到'your_library'...Usernamefor'https://gitee.com':dechinPasswordfor'https://dechin@gitee.com':remote:Enumeratingobjects:200,done.remote:Countingobjects:100%(200/200),done.remote:Compressingobjects:100%(113/113),done.remote:Total200(delta85),reused200(delta85),pack-reused0接收对象中:100%(200/200),2.01MiB|433.00KiB/s,完成.处理delta中:100%(85/85),完成.3upstreamhttps://gitee.com/origin_library.git(fetch)upstreamhttps://gitee.com/origin_library.git(push)
提交PR
在上述操作流程都结束后,我们可以准备在Gitee界面上直接提交PullRequest了。首先找到我们Fork过来的仓库:
点击新建PullRequest,选择源分支为我们Fork过来的分支,目标分支选择原始仓库中的目标分支,然后往下拉可以看到我们提交的更新内容,这里我们所有的提交内容被压成了一个commit:
最后提交PR,等待审批人审批即可。
补充示例
前面我们说到修改pick为fixup,但是缺少了一个示例图,这里重新再提交一个新的commit,来展示这个过程。首先我们执行rebase的时候会弹出这样的一个命令行界面:
这里可以直接编辑,因此我们将第二行,也就是我们需要合并的提交,修改为fixup,并且去掉了后面的commit信息:
最后同样的提交上去,我们可以在PR里面看到commit仍然只有一条信息,但是代码修改是有同步的。
这里也需要额外说明一下,在同一条PR未关闭的情况下,所有在源分支上的提交都会被同步到这个PR里面来。
修改编辑器
在上一章节中我们看到了一个很奇怪的编辑器,这是因为git默认的编辑器不是vim,但是我们可以手动将其配置为本地的vim编辑器。执行vim~/.gitconfig编辑git的配置文件,我们发现在这个文件中已经有我们此前配置过的部分信息:
[dechin@dechin-manjaro2021-quantum]$gitclonehttps://gitee.com/dechin/your_library.git正克隆到'your_library'...Usernamefor'https://gitee.com':dechinPasswordfor'https://dechin@gitee.com':remote:Enumeratingobjects:200,done.remote:Countingobjects:100%(200/200),done.remote:Compressingobjects:100%(113/113),done.remote:Total200(delta85),reused200(delta85),pack-reused0接收对象中:100%(200/200),2.01MiB|433.00KiB/s,完成.处理delta中:100%(85/85),完成.6
这里我们增加一个editor的配置即可使用vim来编辑git执行中的指令:
[dechin@dechin-manjaro2021-quantum]$gitclonehttps://gitee.com/dechin/your_library.git正克隆到'your_library'...Usernamefor'https://gitee.com':dechinPasswordfor'https://dechin@gitee.com':remote:Enumeratingobjects:200,done.remote:Countingobjects:100%(200/200),done.remote:Compressingobjects:100%(113/113),done.remote:Total200(delta85),reused200(delta85),pack-reused0接收对象中:100%(200/200),2.01MiB|433.00KiB/s,完成.处理delta中:100%(85/85),完成.6[core]editor=/usr/bin/vim
如果坚持要使用原本的编辑器,那么在编辑结束之后,需要执行ctrl+X退出,选择Y选项保存修改,最后回车退出修改状态,同样也是可以的,只是使用vim对于大部分人来说会更加的顺手。
总结概要
在本文中我们通过一个实例来介绍了Git的基本用法,包括提交代码、远程链接以及变基等,这使得我们可以更美观更简洁的去维护我们自己的开源代码仓库。