课程源码Git操作指南
> 本文章不是Git指南,不会谈及过多Git知识点,只谈如何使用;至于原理,详细操作手段建议百度。
项目:(自我推荐给大家~)
Git 是什么?
首先Git与SVN一样都是版本控制系统;大部分同学应该在学校都听老师说过或者用过,那么把Git当作SVN来用也未尝不可;当然没有用过也无所谓,咱们不一定需要这样的基础。
> Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
>
> Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
>
> Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
简单来说,Git就是版本控制系统,并且不需要服务器支持就可以运转。你可以在自己电脑上安装Git工具,即可建立Git项目,进行Commit提交。同样的把Commit提交的项目拷贝到其他电脑,只要其他电脑也有GIt软件,则就可以读取Commit等一系列记录。
Git 软件
通过官网你可以下载Git的基础软件,通过该软件你就可以建立你的项目了。
市面上的:Github、开源中国的Git、Gitlab都是基于Git进行后续的开发与扩展;而慕课的也是类似。
在前面,我们谈到Git不需要服务器也可以运转,那么为什么需要Github,Gitlab这些网站?
> 这更多的是为了进行多人开发协作,Git不光是可以进行Commit提交,还可以进行合并操作。
>
> 简单来说,小明把代码开发后在自己电脑建立Commit1,小溪开发后在自己电脑建立了Commit2;如果他们开发的是同一份项目,理论来说应该进行同步;那么此时就是Github这些发挥作用的时候,小明把自己的Commit push到服务器上,而小溪先拉取小明的Commit,随后与自己的进行合并,然后push到服务器,那么此时服务器就同时包含了小明、小溪的代码了。
Git Gui
默认的Git都是命令操作的,你在GitHub,慕课上看见的网页操作其实仅仅只是将步骤简化为可视化界面了而已。
这里给大家推荐两个可视化工具:
- Mac:Tower
- Windows:SourceTree
两个平台推荐的是不同的工具,并不是功能有多强大,仅仅只是界面更加人性化,舒服而已。
创建一个项目
git init
进入任意目录你可以将当前目录转变为Git仓库;可以是空目录,也可以是已有项目的目录。
与普通目录相比,在当前目录下会多一个隐藏的**.git**目录,在该目录下包含有所有的Git记录与操作。
所以很多同学,常常是这样复制代码的:
这样复制代码后放到新的电脑上,你如果使用Git可视化界面打开会发现你的所有记录都没有了,这是因为你并没有Copy到Git文件夹,仅仅只是把当前的状态下的快照拷贝了而已。
Ok,这样拷贝则没有问题,因为你Copy的是外部文件夹,默认会把隐藏文件也一起Copy。
配置Git
一般来说主要配置一下自己的账户与邮箱即可:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
其他的,大家可以百度,或者看教程都是不错的选择。下面我们进入正题如何玩转慕课的代码提交。
进入慕课Git仓库
一般来说老师至少建立有一个线上仓库,这里我们进入code仓库。
这里,我们关注3个地方:
- 分支:通过分支我们可以切换到不同的代码进度上,当然一般情况下我们只需要master即可。大部分的慕课老师也是基于master主分支进行开发的。
- 下载:红色箭头部分;点击后可以实现下载当前分支的最后的代码状态。不建议,因为你只能下载当前的快照而不包含提交记录,这跟前面所说的拷贝的原理一样。
- Clone地址:这个强烈建议,通过该地址可以将服务器上的Git仓库完美的同步到电脑上成为本地的仓库项目。
Ok,大家一定要有远程仓库(慕课网上的,Github上的)与本地仓库(自己电脑上的)的概念。
另外顶部有3个按钮可以选择:
- 关注:该选项点击后,当老师更新当前仓库时你可以收到通知
- 点赞:这个就。。。使劲点吧
- Fork:这个的作用相当于把可以在服务器上创建一个私人的副本。具体流程可以简单理解为:
imooc/课程/code -> imooc/私人/code
代码还是在服务器上,但是有一个自己的空间来存储。
> 服务器上主仓库,与私有仓库区别在于:
>
> 1. 主仓库老师具有写入权限push;学生仅有pull读取权限
> 2. 私人仓库自己具有所有权限,可以把本地仓库代码push到自己的私人仓库中。
基础信息:
- 提交记录当前从图片来看是86个提交;我一般是一个课程小节一次提交记录;这样方便同学可以查阅每一次小节课程的对比差异。
- 代码分支:1个;本来有多个,但是为了不混淆大家的视线,所以仅仅是master;以后可能会有一些额外的分支用来做后续的扩展开发。
- 版本发布:13次;这个其实是TAG,我一共打了13个TAG,每个大章节结束后打一次TAG,方便同学能够快速定位大章节。
在本地可视化工具看来就是类似于:
额外Tab介绍
- 代码:这个部分就是预览代码的视图
- Issues:这是有BUG,有意见的时候可以去这儿提交;老师可以看见并且回复。课程答疑区也是可以。
- Pull Request:简称PR,简单来说就是合并请求。前面我们说了同学没有push权限,也就是不能直接推代码到主仓库;但是同学可以fork到自己的私人仓库,私人仓库是允许本地仓库推送文件上去的。那么此时同学可以本地修改好提交到私人仓库,然后从私人仓库提交合并请求到主仓库;当老师合并后你的代码就到主仓库去了。
- Wiki:文档,对于代码的一些注意事项老师可能会写到这里。
- 绿框部分:这就是提交一个Pull Request的地方。
PR示意图:
Clone 到本地仓库
这里需要注意,Clone到本地的文件夹必须是空文件夹,因为远程仓库clone到本地后就是一个本地仓库了;不需要在本地执行 git init
初始化仓库。
HTTPS模式
复制地址后,在点上打开命令输入;随后进入到任意空文件夹。比如我电脑上的demo目录;随后执行 git clone + url
地址的命令
$ cd /Users/qiujuer/Downloads/Doc/demo
$ git clone https://git.imooc.com/coding-286/code.git
在该流程中首次会叫你输入用户名+密码;你可输入慕课的账户邮箱与密码即可。建议在进行本地git初始化工作时设置邮箱为慕课的账户邮箱。
Last login: Sat Dec 22 17:24:06 on ttys000
qiujudeMacBook-Pro:~ qiujuer$ cd /Users/qiujuer/Downloads/Doc/demo
qiujudeMacBook-Pro:demo qiujuer$ git clone https://git.imooc.com/coding-286/code.git
Cloning into 'code'...
remote: Counting objects: 1909, done.
remote: Compressing objects: 100% (510/510), done.
remote: Total 1909 (delta 683), reused 1887 (delta 665)
Receiving objects: 100% (1909/1909), 1.18 MiB | 1.43 MiB/s, done.
Resolving deltas: 100% (683/683), done.
qiujudeMacBook-Pro:demo qiujuer$
当看见出现done的字眼时,恭喜你已经clone一个仓库到本地了。
SSH模式
该模式更适合大文件,大项目传输;当项目中有较大文件,或项目较大时建议使用;一般情况下直接使用HTTPS模式即可。对于SSH模式需要配置本地ssh。
关于本地SSH如何生成流程本身较为繁琐,这里贴上一些链接:
需要注意的是:
- 建立ssh的时候建议使用默认**“id_rsa”命名,并存储在用户/.ssh** 目录中。
- 邮箱使用慕课的账户邮箱,密码也建议使用慕课网站的账户,也可以空密码。
以上做法最主要的是避免clone慕课ssh地址时识别本地ssh文件错误;无法正常拉项目;在Mac上若没有使用默认的id_rsa命名,也可以先进行***touch***操作后再进行拉取操作。
当建立好ssh文件后会得到两份文件:id_rsa、id_rsa.pub ;使用文本打开你的 id_rsa.pub ,当然也有可能是其他命名。
复制好内容后点击网页:用户设置:
点击新增:
随后在密钥内容处粘贴内容,名称一般会自动识别到你的密钥中的邮箱;如果没有回车一下试试;实在没有那就自己把邮箱写上去吧。
进行Clone:
$ cd /Users/qiujuer/Downloads/Doc/demo
$ git clone ssh://git@git.imooc.com:80/coding-286/code.git
箭头输入yes,绿框部分是提示输入本地创建ssh文件的密码,你设置的什么就输入什么;我这个地方3次是因为输入错误了2次。
成功后和上面HTTPS模式类似,本地已经多了一个仓库了。
基础查阅
一般来说我们使用老师的代码clone到本地都是为了方便查阅提交。
Commit查阅
$ git log
往下回车将会查阅更多的历史信息。
第一行中还包含了:当前的文件状态就是指向的当前的最后一次Commit,并且Tag:L12-END也是指向的当前Commit,以及远程仓库的分支等信息。
退出Commit查阅
英文状态下输入Q即可。
差异对比
git diff commit-id commit-id --stat
commit-id为commit记录的唯一标志。;若我们想要对比:**“12-11 前置-简单内存复用与细节优化(四)”与“12-10 简单内存复用与细节优化(三)”**之间的差异则可以执行:
可以看见有1个文件更改,26行新增,47行删除。
加上**—stat**是为了查阅状态,而非具体的内容;如果不加则是:
可以看到具体的删除,更改状态。
其他的一些diff命令:
> git diff 无参数默认比较工作区与暂存区
> git diff --cached 比较暂存区与最新本地版本库最好commit
> git diff HEAD 比较工作区与最新本地版本库HEAD位置
> git diff [commit-id] 比较工作区与指定commit-id的差异
> git diff --cached [commit-id] 比较暂存区与指定commit-id的差异
> git diff [commit-id1]~[commit-id2]比较两个commit-id之间的差异
以上的操作使用可视化工具依然可以,而且更为方便:
至于如何新增一个commit,那对于大家来说就是非常简单的了。
远程仓库
可能你会在本地有一个项目后需要提交到自己的远程仓库中,此时涉及到远程仓库的使用,那么我建议你阅读:Git-基础-远程仓库的使用
这里就不再补充讲解了。
高级操作
在这个部分你将了解到如何把仓库的代码会滚到对应章节,以便自己核对代码。
前景提要
小明正在学习课程并且根据课程一点点敲自己的项目代码;虽然老师的代码步骤很完整,但是小明还是遇到一些问题,运行后与老师的效果有所不同;此时小明想要知道自己的代码哪里有问题。
- 小明学习的章节是:4-1章节
- 目前课程代码HEAD章节:12章节
若小明直接在网站上下载代码后进行对比会发现与课程差异太多了,根本不是老师讲的代码,这不是老师的错;而是快照的锅。小明下载的代码是12章节的快照,自然与前面章节差异较大。小明应该得到的是4-1章节的快照。
简要步骤
- 我们拉取代码到本地
- 将代码基于4-1的提交创建新的分支
- 将HEAD指向新的分支(检出分支)
此时代码已经自动回滚到HEAD指向的Commit记录中;并且步骤2并不是必须,你也可以直接强制将HEAD指向历史的某个Commit记录,但需要保证当前工作区无更改。
$ git reset --hard
qiujudeMacBook-Pro:code qiujuer$ git reset --hard 9d0234f6323cd17c98994c608d1f83eac4fe48a7
HEAD is now at 9d0234f L4 新增实战课程第一小节代码内容
以上是强制指定到某个Commit记录的方案,HEAD则代表当前的工作区。该方案是较为临时的,暴力的方案。
这种方案不利于我们回到最后的提交记录上,所以我们使用分支的方案。
回到最初的指向:
$ git reflog
$ git reset --hard 164f75f
git reflog 得到我们最近的更改记录Commit的变化,然后再次进行指向回去即可。
基于分支的方案
关于什么是分支,我建议查阅:官方的分支介绍
首先我们基于Commit创建分支:
git checkout -b test_4_1 9d0234f
- test_4_1 分支名字
- 9d0234f 4-1章节的Commit记录的前面7位
可以看出,我们创建了分支,并且自动检出了分支;当前的工作区就在当前分支了。
qiujudeMacBook-Pro:code qiujuer$ git branch
master
* test_4_1
qiujudeMacBook-Pro:code qiujuer$
执行git branch
命令可以看出也是OK的。此时我们就是2个分支了,若想回到12章节的状态,我们只需要检出master分支即可。
想要回到4-1,那就再检出test_4_1分支即可。
这种方式是较为健康的优秀的方案。
第一种方案虽然简单快捷,但是有一定的隐患。
意外问题
第一种方案是有隐患的,咱们前面说了,具体是什么隐患;来看看:
我们先强制定位到当前的4-1位置。
此时已经OK,但是你会发现工作区居然有512个更改。这是因为该方式其实就是将工作区目标重定向到历史的某个节点。
而历史的节点与最后的节点之间肯定有非常多的更改,这些更改中可能存在文件新增或者其他更改,对于git可能并不能安全的回滚,所以默认的工具会将这些更改放到未提交的工作区中。
而这些更改我们并不需要,所以直接删除即可:
注意:Windows的字段命名可能不同。
如果发现删除多了文件,比如这种显示D的就是删除了文件,但是该文件本应该再4-1有的文件就会这样显示。我们只需将其直接设置到4-1即可:
此时我们分支是master ,那么选择master即可;你当前的HEAD指向的是什么分支就选择什么分支:
OK,此时工作区已经干净了,此时的代码就是4-1的代码。
4-1 = master = test_4_1
至于旁边显示向下箭头77,那是因为在当前commit之后还有77个提交记录而已。如果你看完代码后,也可以直接通过工具重定向回到最后的更改即可。
只是回到最后的分支时也有可能出现工作区有更改的情况,参照上面的方式直接把文件更改重置即可。
如果你在软件中切换分支则没有那么繁琐,所以先建立分支,随后切换分支的方式是我推荐的方案。
总结
以上就是慕课的Git的一些简单操作,大家可以使用命令;也可以使用可视化工具操作,我建议使用可视化工具查阅代码更改更为方便。
当然你也可以使用命令操作后再使用idea打开项目进行git log查阅这也是非常好的。
最后还是推荐一下我的课程:
IM 通讯课程耗费1年才录制完成,Socket课程总耗时1年半完成;算是难产,但内容绝对超值。
感谢大家阅读全文。
热门评论
大家如果有什么不懂的或者想要了解的可以在评论留言哈,私信容易丢掉;谢谢大家~