git宣讲
1 git介绍
Git是一种分布式版本控制系统,下面说下什么是版本控制以及分布式,git和github有什么区别
1.1 版本控制
在座的各位大一的居多
就拿c语言课设举例吧:
比如你爆肝一天一夜,整出来了一个图书馆系统v1.0,
之后又写了一天一夜搞出来了一个图书馆系统v1.1,
但是很不巧,你新加的功能似乎会导致系统的崩溃,
而这个功能似乎无关紧要,
这里在你不了解git的情况下
有两条if线
你很巧用上了百度网盘这种极为先进的存档方式(可以视作一种版本控制),这里你就可以满心欢喜的回退到v1.0
或者你干脆把功能全删了(如果你的Ctrl+Z还有用的话就更简单了),但是在删功能的时候又引出了新的bug,
系统又挂了!
这时候就显示出版本控制的优势了(不一定是git),可以帮助你无痛回溯
说句题外话
vscode其实内置了一个及其迷你的小型版本控制系统—时间线
这个系统就可以满足小范围的版本控制需求了,离你们最近的版本控制软件
1.2 集中式vs分布式
下面摘录自https://www.liaoxuefeng.com/wiki/896043488029600/896202780297248
Linus一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?
先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
1.3 git和github有什么区别
Git是一个版本控制系统,可以帮助我们管理代码的变更。提供了跟踪变更、与他人协作并撤销错误的功能。Git可以在本地计算机上或远程服务器上使用。
另一方面,GitHub是一个基于Web的平台,它为Git仓库提供托管。它允许您与他人分享代码、协作并管理项目。GitHub提供了各种功能,使得与Git一起工作变得容易,包括拉取请求、问题跟踪和代码审查。
Git是提供版本控制功能的基础技术,而GitHub是一个平台,提供了一个用户友好的界面,用于处理Git仓库以及一系列附加的协作和项目管理功能。
Git更像一个人手一个的智能管家机器人,而github就是挂着这个管家记忆芯片的大仓库
2 准备开始
由于git的对于初学者配置过于复杂了
有兴趣可以打开https://www.liaoxuefeng.com/wiki/896043488029600这个网站快速了解git及其配置
包括一系列政策原因,git及其资源包下载缓慢
也为了不过早的消磨各位的好奇心
打开https://learngitbranching.js.org/?locale=zh_CN这个网站,这里将git的主要命令以可视化的形式展示出来了,开盒即用,就不用配环境了
为了减轻大家的输入负担,这里我做了一个简易的解析:http://git.xytong.top,访问该网址和访问上面的网站是一样的
直接点进入沙盒开始我们的学习,当然,这个网站提供的关卡也可以帮助你帮助快速了解git
3 git的快速使用
分为前置知识的讲解和快速使用
3.1 前置知识
3.1.1 四个工作区域
四个工作区域可以分为工作区,暂存区,版本库,远程仓库,图中的命令可以在那个网站上试试看
3.1.1.1 工作区
存放代码文件的地方,就是文件系统,平时你对文件的保存操作就是对工作区的直接操作
3.1.1.2 暂存区
顾名思义,就是暂存代码的地方,比如说你写了一小点代码,但是不希望提交,但是又希望有个地方去临时保存文件的改动
3.1.1.3 版本库
就是你代码最终被保存的地方,也就是上文所说的百度网盘”本地版”
3.1.1.4 远程仓库
就是上传你版本库的地方,github,gitee等平台就是在起这个作用
3.1.2 git工作方式
git实际储存的是文件之间的差异,所以不能在git里提交二进制文件(.exe/.zip/.jpg),这种在文本编辑器会乱码的东西,这会导致你的git仓库非常大
3.1.3 分支
在Git中,分支(branch)是指将代码库(repository)的一份拷贝从当前的代码状态(或某个指定的提交)分离出来,使得这个分支上的代码可以独立于其他分支进行修改和提交,而不会影响到主分支(通常是master分支)上的代码。
分支可以用于多人协作开发或者个人开发中实现不同的功能或特性的并行开发。在分支上进行修改不会影响主分支上的代码,可以避免直接修改主分支带来的风险。
当分支上的代码稳定后,可以将分支合并回主分支,使得分支上的修改成为主分支的一部分。
在Git中,每个分支都有一个名称,并且可以在任何时间点创建、修改、删除和合并。通常情况下,一个Git仓库都会有一个默认的主分支(通常是master分支),而其他分支则根据需要进行创建和管理。
3.2 快速开始
上面的网站给大家提供了一个非常方便的git环境,这个环境里面的有些步骤为了学习方便是跳过的,跳过的步骤我会特殊说明
3.2.1 配置git全局用户设置
没预装git的同学可以跳过该环节
在终端(一个广泛的的概念,gitbash/vscode ctrl+`呼出的powershell/从Win+R呼出的cmd|powershell)
输入以下命令,name建议为英文且不带空格
git config --global user.name "Your Name"
git config --
g
lobal user.email "email@example.com"
3.2.2 创建git仓库
没预装git的同学可以跳过该环节
打开你想要创建仓库的文件夹,以vscode举例
打开文件夹win/linux/mac均为cd命令,左边出现完整地址即为成功
3.2.3 提交
任意创建一个txt文件
git add .
git commit .-m 提交信息
如果很不幸输入了gitcommit且没加任何东西,且安装的时候选了vim,下面教下vim使用
下面的讲解为了节省时间
就直接使用该网站
在这个网站上输入gitcommit就可以直接提交一份虚假的提交记录,这包含了上述的步骤
3.2.3.1 vim使用
没预装git的同学可以跳过该环节
这是个巨坑,大概讲下怎么使用,首先疯狂点esc,再点i就能输入了,再疯狂点esc,输入”:wq”(冒号要输入,一共三个ascii字符!),该命令代表保存修改
3.2.4 回溯
3.2.4.1 回到过去
git reset–hard HEAD^
回退至上一个版本(HEAD是指向当前版本的指针,HEAD^表示上个版本,HEAD^^表示上上个版本,HEAD)
或者
git reset–hard 版本号
这里使用hard更符合直觉,这样自己电脑里的文件也会跟着改变,文件做了个时光机回到了过去
警告!请确保工作区文件已提交至版本库,否则当前未被git保存的工作区内容就会被丢弃
或者替换成–soft,工作区的内容,暂存区内容不会被修改
其他命令不详细展开了
3.2.4.2 返回未来
当你回到过去的时候,你的提交记录实际上是有被记录保存的
git reflog
找到命令历史记录
那个网站不支持这个命令,它把所有能展示的都展示了(
找到未来的版本号
然后使用
git reset–hard 版本号返回未来
3.2.5 查看修改
这是因为是git管理修改的,当然可以比较修改
提交后,用
git diffHEAD – 文件名
命令可以查看工作区和版本库里面最新版本的区别
3.2.6 还原修改
你打开了一个写好的程序,但是你不小心在某一个文件里删掉/添加了一些不必要的功能,可以使用
git checkout– 文件名
可以将该文件还原至上次提交/暂存的状态
3.2.7 克隆远程仓库
我们在github上看到一个足够优秀的项目,想要下载电脑上
这时候就要使用clone命令了
在这个网站第二页练习中有关于远程仓库的演示
用法:
git clonehttps://github.com/用户名/仓库名
3.2.8 查看提交记录
git log–oneline –graph –all
这样一条命令是打印出仅有一行的图形化的提交记录
上下键翻页,按q退出该模式,练习网站不支持
4 git进阶
各位可以在线下自行尝试命令行
这一部分以那个网站教学为主
4.1 分支
git分支特性也是保证git具有多人协作特点的特点
好比这里有一辆车
但是这辆车现在已经量产了
不好对已经量产的商品进行修改,这时候引出了分支这个概念
已经量产的车处于主分支
工程师a想要给这个车装个尾翼,那么他就可以新建一个”尾翼”分支
工程师b想要给这个车装个新发动机,那么他就可以新建一个”新发动机”分支
在经过总工程师的质量评审后,最终这两个分支会被合并到主分支上
这就是分支给我们带来的便利
4.1.1 创建切换分支
首先使用
gitbranch分支名
创建一个新分支
再使用
git checkout分支名
切换至指定分支
上述当然有快捷方式就是
git checkout-b 分支名
这个命令会创建一个新分支并切换至该分支
4.1.2 查看分支
git branch
该命令会列举出所有的分支
4.1.3 合并分支
git merge分支名
将另外一条分支的东西合并到该分支上
4.1.3.1 fast forward
在某些情况会触发git的fastforward模式
建议使用参数屏蔽掉这个模式
它会在合并分支时直接把当前分支指针移动到目标分支的最新提交
而不会在提交历史中创建新的合并提交
练习网站默认是不会触发这个模式的
要想不触发这个模式
要在后面加 –no-ff这个参数
git merge–no-ff 分支名
4.2 远程仓库相关
单机版的git不好玩?那么就来试试远程仓库吧
4.2.1 远程分支
远程引用是对远程仓库的引用(指针),包括分支、标签等等。
你可以通过 gitls-remote <remote>
来显式地获得远程引用的完整列表,
或者通过 git remoteshow <remote>
获得远程分支的更多信息。
然而,一个更常见的做法是利用远程跟踪分支。
4.2.2 克隆远程仓库
在3.2.7已做详细讲解,这里不再展开
4.2.3 拉取远程仓库
一般我们会用到pull命令
完整使用说明如下
git pull<远程主机名><远程分支名>:<本地分支名>
一般我们为了使用方便只会打
git pull
这条命令省略了origin这个远程主机名,同时也省略了具体的分支名
4.2.4 推送代码至远程仓库
一般我们会用到push命令
完整使用说明如下
git push<远程主机名><远程分支名>:<本地分支名>
一般我们为了使用方便只会打
git push
这条命令省略了origin这个远程主机名,同时也省略了具体的分支名
4.2.4.1 强制推送
在前期熟悉git的过程中难免会遇到,远程仓库与本地仓库冲突的情况,在这个项目只有你自己一个人开发的情况下,你可以使用强制推送,将远程仓库覆写为本地仓库的样子,多人仓库就不建议这样做,需要先pull解决冲突,再进行push操作
5 小问题合集
5.1 推送代码步骤
建议执行commit->pull->push的顺序
单人开发也可选择pull->commit->push
你需要先pull(拉取)远程代码,才能进行push(推送)操作
5.2 .gitignore文件
用于说明不需要被git记录的文件,比如二进制文件,密钥文件等
这里只介绍基础用法
1 |
|
gitignore注释用’#’,*表示匹配0个或多个任意字符,所以上面的模式就是要忽略所有的xml文件,log文件和apk文件。
如果我们意外的将想要忽略的文件添加到缓存中去了,我们可以使用rm命令将其从中移除:
git rm–cached test.js