Git

什么是Git

Git是一个开源的、分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目

Git易于学习,占地面积小,性能极快,它具有廉价的本地库,方便的暂存区域和多个工作流分支

简介

版本控制

什么是版本控制

版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统

版本控制最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换

为什么需要分布式版本控制

个人开发过渡到团队合作

相对于集中式版本控制,分布式版本控制在断网的情况下也可以进行开发(因为版本控制是在本地进行的),每个客户端保存的也都是整个完整的项目(包含历史记录)

工作机制

image-20230310141705286

当我们的代码在工作区和暂存区时,管理员是看不到我们的代码的,我们可以对这时的代码进行删除或者修改操作,当我们提交到本地库后,git会帮我们生成一个历史版本,此时的代码是无法删除和修改的

代码托管中心

代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库

  • 局域网远程库:GitLab
  • 互联网远程库:GitHub、Gitee

Git的常用命令

image-20230310142630971

初用Git要先设置用户签名和用户的邮箱使用命令

1
2
git config --global user.name XXX
git config --global user.email XXX@XX.com

在我们的本地C盘用户目录下我们可以看到一个文件 .gitconfig

image-20230310143241288

初始化本地库

git init

我们创建一个文件夹后,若先用git进行版本控制首先要进行git初始化

进入该文件夹后打开git bash 然后输入命令 git init

image-20230310144022051

会在我们的文件夹下生成

image-20230310144042589

查询本地库状态

git status

image-20230310144655688

其中输出的日志表示为:在master分支下,并没有可提交的文件,但是有一个未被追踪的文件(hello.txt),现在没有任何除了违背追踪的文件要被添加提交(使用“git add”去追踪)

此处的add即为从工作区添加到暂存区,表示为暂存区没有文件要被提交

添加暂存区

git add

我们将 hello.txt添加到暂存区,警告可忽视

image-20230310145210006

这时我们在看本地库的状态

image-20230310145301271

我们可以发现原先未被追踪的hello.txt变成了绿色,这里表示为暂存区追踪到了hello.txt,且 git有提示,可以使用“git rm –cached 文件名”去进行暂存区删除

image-20230310145552748

文件提交本地库

git commit -m “日志信息” 文件名

左红框为版本号,右红框为我们输入的日志信息

image-20230310145935573

这时我们再去查看状态,相比较于之前已经没有了 No commits yet 说明我们已经提交过了。下面的一句nothing to commit ,working tree clean意思是没有东西修改过,工作树是空的

image-20230310150211249

我们对hello.txt文件进行内容的修改然后再次提交后,添加了其他日志信息,那怎么去看提交的日志信息呢?

git reflog

image-20230310150913578

如何去细致的看日志信息呢

git log

image-20230310151025795

在这里我们可以看到完整版的版本号,和提交者的用户签名还有邮箱签名 以及提交时间和提交日志

版本穿梭

git reset –hard 版本号

image-20230310151919471

日志中可以看到这个操作

image-20230310152116026

倘若我们回到最初的hello.txt中,此时

image-20230310152226351

倘若我们回到 最新的 hello.txt中

image-20230310152324256

我们还可以在初始化时生成的git文件中查询到当前处于那个分支的哪个版本下

打开文件夹打开HEAD我们可以发现image-20230310152604192

再打开HEAD 文件中的路径我们可以发现image-20230310152712144

我们当前处于此版本号版本下 我们去查看得知正是该版本

image-20230310152820360

分支

什么是分支

可以这么理解分支,本人呢学习忍术多年,终于有一天学会了禁术——多重影分身之术,我非常开心,可以让这么多分身去学其他的技术,陆陆续续的有影分身(分支)回到了我本来的身体中,他学会了RabbitMQ,所以我也学会了RabbitMQ,还有的影分身学会了Zookeeper,学会了Redis。。。。。。。。所以我都学会了,但是回来一个影分身告诉我他没学会编译原理(因为是真特么难),我摸摸头告诉他没事。对我个人而言并不影响我自己继续生活学习,但同时我学会了这么多知识,这就是分支

分支可以使得各个部门同时进行开发各个组件,而不影响主业务的开发

分支操作

image-20230310204814675

查看分支

git branch -v

image-20230310210316703

​ 当前分支为 master 版本为ocd62f3 日志为 是真的帅

创建分支

git branch 分支名

image-20230310210550553

我们不难发现,创建的分支除了分支名和当前分支不一样,版本号和日志都一样

切换分支

git checkout 分支名

image-20230310210935549

该命令行中日志输出为已切换到分支hot-fix,当查看节点时hot-fix节点变为绿色,也说明当前分支为hot-fix

image-20230310211337855

分支合并

git merge 分支名

表示为将指定的分支与当前分支合并,以两个列表(列表中的元素相同但所处对应位置不同也不算等价列表)表示两个节点的不同文件,倘若 本节点的改文件包含于或被包含于另一个文件,则这两个文件就可以合并成功,该节点的文件内容

分支合并冲突

分支合并冲突是一件非常有意思的事情,当我们合并时 节点A 的文件1相较于原文件有了至少一出修改(已提交),正好节点B对文件1也进行了修改并与节点A修改了同一处位置,但内容不同,这时二者合并时就会出现问题?

同时修改的那基础到底如何合并,是保留A节点此处内容还是保留B节点此处内容。当合并时直接报错,出现如下图的内容

image-20230311003836367

这种报错即为 分支合并冲突

当出现分支合并冲突时,我们需要对该文件进行修改,确保保留的是哪个分支上的内容

Git团队协作机制

团队内协作

image-20230311131236992

团队协作的大致流程:

岳不群是华山派掌门人,他创建了华山剑法,推送(git push)到托管中心,恰好令狐冲是他的徒弟,此时的令狐冲并不会剑法(本地无源码),需要学习剑法,

所以需要获取那本书(git clone),令狐冲天资聪慧是练武奇才,不仅学会了华山剑法,还在基础上创建了新的招式,于是也加入到华山剑法中返回(git push)给托管中心,岳不群大悦(本地有源文件),于是将托管中心的书拿过来(pull)看了看,也学习了一下新招式

跨团队协作

image-20230311132738238

跨团队协作流程:

岳不群认为自己的华山剑法不够强劲,所以去找其他派的人来帮忙升级斧正一下,于是找到了日月教派CEO东方不败,东方不败同意后

①东方不败在岳不群的远程库中把华山剑法fork到了自己的远程库中,然后

②放到本地,一顿改正后,华山剑法改为了辟邪剑法,然后

③放到自己的远程库,

④又由自己的远程库向岳不群的远程库提出pull request

⑤岳不群在看完辟邪剑法后感觉非常的不错,质量很高(用法除外)

⑥将原先的华山剑法和现在的辟邪剑法进行合并merge

7 岳不群大悦pro,赶紧把远程库中的辟邪剑法拉到自己的本地库中,顺便问了问令狐冲要不要一起练

Github实战

远程仓库操作

image-20230311134617484

创建远程仓库别名

git remote -v 查看当前所有远程地址别名

git remote add 别名 远程地址

image-20230311134839495

本地库的分支推送

git push 链接(别名) 分支

image-20230311164148163

远程库的分支拉取

git pull 链接(别名) 分支

image-20230311170146163

远程库的克隆

git clone 链接(别名)

团队内协作

邀请其他用户一起完成项目

首先进入github 首页,然后进入设置(setting),而后点进仓库(Repositories),然后点入

image-20230311171328228

image-20230311171349168

image-20230311171526834

复制下来然后将连接发给他,好有在接受连接后直接进入链接,同意加入,即可称为团队内成员