1. Git介绍

1.1 版本控制(理解)

无论是代码编写,还是文档编写,我们都会遇到对文档内容反复修改的情况
01_版本控制介绍.pngimage.png

1.2 开发中存在的问题(理解)

  • 程序员小明负责的模块就要完成了,就在即将提交发布之前的一瞬间,电脑突然蓝屏,硬盘光荣下岗!

几个月来的努力付之东流
02_开发中的麻烦.png

  • 老王需要在项目中加入一个很复杂的功能,一边尝试,一边修改代码,就这样摸索了一个星期。可是这被改得面目全非的代码已经回不到从前了。

03_开发中的麻烦.png

  • 小明和老王先后从文件服务器上下载了同一个文件

04_开发中的麻烦.png

  • 因项目中Bug过多,导致项目进度拖延,项目经理老徐因此被骂,但不清楚Bug是手下哪一个程序员写的

05_开发中的麻烦.png

  • 开发中要解决的问题
    • 代码备份
    • 版本控制
    • 协同工作
    • 责任追溯

市面上可供我们选择的工具有SVM和Git。

1.3 SVN版本控制(理解)

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而开发人员工作的时候,用的都是自己的电脑,所以首先要从中央服务器下载最新的版本,然后开发,开发完后,需要把自己开发的代码提交到中央服务器。

  • 服务器单点故障将会导致所有人员无法工作
  • 而服务器硬盘损坏这意味着,你可能失去了该项目的所有历史记录,这是毁灭性的。

06_svn和git的对比.png

1.4 Git版本控制(理解)

Git是在2005年,Linux系统的创建者Linus Torvalds,为了帮助全球的开发者,维护Linux系统内核的开发而开发了自己的开源分布式版本控制工具,分为两种类型的仓库:本地仓库和远程仓库。

  • 每一个客户端都保存了完整的历史记录
  • 服务器的故障,都可以通过客户端的记录得以恢复。

07_svn和git的对比.png

2. Git下载和安装

2.1 Git下载

官网下载地址:https://git-scm.com/downloads
image.png

2.2 Git的安装(应用)

可以修改安装位置;其它一路下一步;最后一步可以取消勾选View Release Notes;安装成功后,在任一文件夹右键会出现下面两个图标,即成功!

  • 对于Git GUI Here是图形化操作工具
  • 对于Git Bash Here是命令行操作工具

13_Git的安装05.pngimage.png
运行Git命令行客户端,使用git —version 命令,可以查看git版本
image.png

2.3 TortoiseGit的下载(可以不装,不学的)

官网下载地址:https://tortoisegit.org/download/
image.png
对于Git提供的图形化管理工具并不强大,所以我们安装一个第三方的图形化工具。

这里的知识了解即可!!! 如果你有了解SVN,我们上面提过,其和Git都是版本控制工具 image.png 会发现其图标是小乌龟。

这个TortoiseGit图标是小乌龟+Git,这似乎说明,其既可以管理SVN(没有验证),又可以管理Git(确定) image.png

2.4 TortoiseGit的安装

更改安装目录;安装完会让你选择语言,但是只有英文,无法选择,因此下一步;选择Git/bin目录;填写邮箱;其它一路下一步即可。
image.pngimage.png
最终任一文件夹下右键:代表成功!!
image.png
下面安装中文包:
依然官网下载:https://tortoisegit.org/download/,往下翻一点点就看到了。
image.png

  1. 安装很简单,也很快,双击下一步马上安装成功。
  2. 然后

image.pngimage.png

  1. 再次右键检查,中文成功!

image.png

3. Git操作入门

3.1 Git基本工作流程(理解)

31_Git基本工作流程.png
工作目录:我们平时写代码的目录就是工作目录。
本地历史仓库:工作目录的代码我们在不断写,就有不同的阶段,也可以说版本,那么就要提交保存,就是保存在这个本地历史仓库。
暂存区:如果你想要将代码从工作目录保存到本地历史仓库,需要经过暂存区。你可能会疑惑,为什么要存在暂存区??百度一下,我暂时没看太懂,就不写了。
对于工作目录到暂存区,再到本地历史仓库中间需要通过Git命令实现。
至于工作目录到本地历史仓库中间没有命令吗??有的,等我们学到了分支的时候再说。
那这些命令是什么呢??下面看

3.2 Git命令行操作(应用)

  • git常用命令 | 命令 | 作用 | | —- | —- | | git init | 初始化,创建 git 仓库 | | git status | 查看 git 状态 (文件是否进行了添加、提交操作) | | git add 文件名 | 添加,将指定文件添加到暂存区 | | git commit -m ‘提交信息’ | 提交,将暂存区文件提交到历史仓库 | | git log | 查看日志( git 提交的历史日志) |

  • 操作步骤

image.png

  • 操作演示
  1. 创建工作目录、初始化本地 git 仓库

其实就是创建一个文件夹(就是工作目录);然后进入文件夹,右键Git Bash Here;输入命令git init;此后看到该文件夹有一个隐藏的.git文件夹。那么这个my_project文件夹就是一个本地的Git仓库了。
image.pngimage.pngimage.png

  1. 新建一个 test.txt 文件(暂不执行添加操作)

image.png

  1. 输入git status查看(红色准确的说是这个文件有修改,但是没有到暂存区)

image.png

  1. Git add test.txt提交,并查看状态。我们可以看到此时资源变成了绿色。

如果你安装了TortoiseGit图形化工具,并且重启电脑,那么这个test.txt文件上会有一个+号,代表已经添加,我的并没有重启,因此没有。
image.png

  1. 使用commit命令,提交到本地历史仓库。注意:git commit命令不需要根任何文件,因为它会把暂存区的所有内容提交到本地仓库,单手后面要加提交信息(就像注释一下,说下你提交的内容)

image.png
此时查看状态,working tree clean(字面意思,clean了),on branch master(这个暂时不需要懂)。
如果你安装了TortoiseGit图形化工具,并且重启电脑。那么test.txt文件上会有一个号。

  1. 使用log命令,查看日志。会看到一个醒目的黄色字段,这个是你该文件在本地仓库的唯一标示。你现在只提交了一次,如果再提交一次,会有第二个唯一标示。

image.png

  1. 修改test.txt文件,添加并提交,并查看日志。如果你修改了文件,并且还是装了TortoiseGit并重启,则此时上面会有一个号。

image.pngimage.png

思考:上面这个版本唯一标示有什么用??假设我们第二个版本修改坏了,想回到第一个版本,那么就可以用这个标示。这个标示不需要记,只需要会查就行。

3.3 Git图形化工具操作(理解,我们后面会把Git集成到IDEA,所有…)

  1. 创建工作目录、初始化本地 git 仓库

image.pngimage.png

  1. 新建一个 test.txt 文件(暂不执行添加操作)
  2. 选中文件右键,选择TortoiseGit,之后选择添加

image.pngimage.png

  1. 空白处右键,Git提交,提交到本地历史仓库

image.pngimage.png

  1. 空白处右键,TortoiseGit,显示日志,可以产看日志信息

image.png

  1. 修改 test.txt 文件 略
  2. 添加并提交,查看日志 略

    4. Git版本管理

    4.1 历史版本切换(理解)

    最初一个Bug,改了一个星期后是五个Bug,我不想面对这五个Bug,想面的一个Bug,怎么回到以前,下面解决。
    44_历史版本切换.png
  • 准备动作
  1. 查看 my_project 的 log 日志
    • git reflog :可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录的操作)[这里我们对分支还不了解,后面讲,至于这个命令会看到唯一标示缩减版,即不会太长]
  2. 增加一次新的修改记录(因为前面只有两个版本,太少了)
  • 需求: 将代码切换到第二次修改的版本指令:git reset —hard 版本唯一索引值

指令:git reset —hard 版本唯一索引值

第一步:
image.pngimage.png
第二步:修改文件,再增加一次修改记录
image.png
第三步:回到最初版本,即第一次提交版本;此时文件里面什么也没有了,因为第一次提交本来就什么也没有。。
image.pngimage.png
第四步:切换到第二次提交
image.pngimage.png
此时如果你查看日志,将会看到其实有5个版本了。只是后面两个唯一标示和前两个是一样的。
image.png

4.2 分支管理介绍

image.png
说分支前:先看下上面这个故事。
有一个程序猿,自学编程,学了一段时间后,领悟了分身技术;于是其幻化分身,让分身学习Pathython,自己学习Java;经过一个月分身学习了50%,自己学习了30%;又共了一个月,两个都学了100%;后来两个合二为一,就掌握了Python和Java两种语言。
其实这个分身和自己学习的过程就是两条分支。

  • 分支
    • 由每次提交的代码,串成的一条时间线
    • 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线
  • 分支的使用场景
    1. 周期较长的模块开发

假设你准备开发一个新功能,但是需要一个月才能完成第一周写了20%的代码,突然发现原来已经写好的功能出现了一个严重的Bug那现在就需要放下手中的新功能,去修复Bug但这20%的代码不能舍弃,并且也担心丢失,这就需要开启一个新的版本控制。

  1. 尝试性的模块开发

业务人员给我们提出了一个需求,经过我们的思考和分析该需求应该可以使用技术手段进行实现。但是我们还不敢确定,我们就可以去创建一个分支基于分支进行尝试性开发。

  • 分支工作流程
    • Master: 指向提交的代码版本
    • Header: 指向当前所使用的的分支

45_分支工作流程介绍.png
下面我们一步一步介绍:

  1. 首先我们创建项目,提交了多次,假设提交了三次,这三次提交的代码,串成的时间线就是一条分支,开始的分支我们称为Master分支;

image.png

  1. 这个Master分支不仅仅代表这条分支,其指向是提交的代码版本,此时指向这条分支你当前指向的版本。

image.png

  1. 除了上面Master指针,还有一个指针是Head指针,指向的是当前你使用的分支,此时自然指向Master分支。

image.png

  1. 现在你想开发一个新的需求,就创建了一个新的分支Dev分支,并且将Head指向你当前使用的分支Dev。

image.png

  1. 然后在这个分支上开发

image.png
下面想要合并分支,你这个Dev分支提交了一次(至于两个球,第一个应该是复制Master分支);
image.png

  1. 执行合并操作,此时Head要指向Master分支

image.png
image.png

  1. 现在我们觉得原来的Dev分支没什么用了,就删除了

image.png
此时我们可以看到其实分支操作无非就四步:创建、切换、合并、删除
image.png

4.3 分支管理操作(应用)

  • 创建和切换

创建命令:git branch 分支名
切换命令:git checkout 分支名

  • 新分支添加文件

查看文件命令:ls
总结:不同分支之间的关系是平行的关系,不会相互影响

  • 合并分支

合并命令:git merge 分支名

  • 删除分支

删除命令:git branch -d 分支名

  • 查看分支列表

查看命令:git branch

演示:演示创建和切换,以及查看文件

  1. 创建和切换分支

image.png

  1. 在xiaoming分支下开发

创建test2.txt文件,并添加和提交。
image.pngimage.png

  1. 我们之前说过分支互不打扰,那么master分支有没有这个文件??

image.png

  1. 切换回xiaoming分支

image.png

演示:合并分支&删除分支
我们可以把master分支的内容合并到其它分支,但是我们一般不这么做,习惯上,还是将其它分支内容合并到master分支上。
首先要确保我们在master分支上,然后在合并xiaoming分支。
image.png
现在xiaoming分支我们不要了,删除
image.png

此时我们就提一下:本地历史仓库和工作目录的命令:就是切换分支,你切换到哪个分支,那么工作目录的内容就是该分支的内容。

image.png

5. 远程仓库

5.1 远程仓库工作流程(理解)

公司本来有一个程序猿,开发了项目保存在本地仓库;后来又来了一个程序媛,其肯定不是从头开发,要拿到程序猿的代码,用U盘吗?不,那怎么办??程序猿就需要把代码提交到远程仓库,然后程序猿从远程仓库获取。
image.png
程序媛clone下代码,即将远程仓库中的内容复制到本地仓库。
image.png
程序媛一通操作增了一个文件,其要先提交到本地,然后再push推送到远程仓库,程序猿想拿到,不需要clone,只需要pull即可。
46_远程仓库.png

5.2 远程仓库平台介绍(理解)

  • GitHub域名:https://github.com介绍:GitHub是全球最大的开源项目托管平台,俗称大型程序员社区化交友网站 各类好玩有趣的开源项目,只有想不到,没有找不到。
  • 码云域名:https://gitee.com介绍:码云是全国最大的开源项目托管平台,良心平台,速度快,提供免费私有库

    5.3 码云的注册(应用)

    注册略!

    5.4 先有本地仓库,远程为空(应用)

  • 步骤

    1. 创建本地仓库
    2. 创建或修改文件,添加(add)文件到暂存区,提交(commit)到本地仓库
    3. 创建远程仓库
    4. 推送到远程仓库
  • 创建远程仓库

操作:

创建远程仓库

1.创建远程仓库
image.png

配置秘钥

2.下面就是将本地仓库内容推送到远程仓库,但是推送之前,我们需要先干一些事情
注意:推送代码之前,需要先配置SSH公钥。如果没有配置,推送的时候会出现一些错误。SSH是协议,我们现在没有学协议,就先不管了,只要知道推送前需要先配置SSH公钥即可。
2.1生成SSH公钥步骤
1.设置Git账户(因为生成SSH公钥时需要Git账户);2.生成SSH公钥(是在本地生成的);3.设置账户公钥(就是配置公钥到远程仓库);4.测试
image.png
2.1.1 设置Git账户(设置git账户前先查看先账户和邮箱,其是我们安装git软件时含有的;然后我们设置一下)

  • git config user.name(查看git账户)
  • git config user.email(查看git邮箱)
  • git config —global user.name “账户名”(设置全局账户名)
  • git config —global user.email “邮箱”(设置全局邮箱)
  • cd ~/.ssh(查看是否生成过SSH公钥,按道理会显示No such fie or directory,可能是我之前用过git吧,这里没有显示)

image.png
image.png
2.1.2 生成公钥ssh-keygen –t rsa –C "邮箱"
image.png
解决方案:上面命令不要复制,要手打。
中间过程:回车即可(应该是3次)。如果需要y/n,则用y。
2.1.3 查看公钥
命令:cat ~/.ssh/id_rsa.pub
image.png
2.2设置公钥到远程仓库
image.pngimage.png
2.3测试
命令:ssh -T git@gitee.com
按道理会出现successful,但我的访问被拒绝,不知为什么!
image.png

推送远程仓库

  • 步骤
    • 为远程仓库的URL(网址),自定义仓库名称(因为太长,不可能写那么长的)
    • 推送
  • 命令
    • git remote add 远程名称 远程仓库URL
    • git push -u 仓库名称 分支名

image.pngimage.png
image.png
按道理,此时远程仓库就有我的代码了,但是由于公钥问题,就没配置成功。

5.5 先有远程仓库,本地为空(应用)

步骤

  1. 将远程仓库的代码,克隆到本地仓库克隆命令:git clone 仓库地址(clone用https或者ssh都可以)
  2. 创建新文件,添加并提交到本地仓库(必须经过添加和提交,才能推送到远程仓库)
  3. 推送至远程仓库 命令:git push -u origin master
  4. 项目拉取更新拉取命令:git pull 远程仓库名 分支名

其实我这里提一下:你推送到远程的,其实是你项目下的文件,不包含项目名字;你clone下来的话,这些文件外面的名字,就是你创建的仓库名字。
image.png
此外,对于拉取
image.png

5.6 代码冲突(应用)

  • 产生原因:

首先,两个程序猿同时从远程仓库拉取最新代码;
两个程序员操作同一个文件,其中一个程序员在修改文件后,push到远程仓库;
另一个程序员应该先pull将最新的代码更新到本地仓库后,在修改代码,之后push到远程仓库
结果他没有先pull将最新的代码更新到本地仓库(因为他和上面的程序猿同时拉取的),而是直接将自己的代码push到远程仓库,这样就可能会导致代码冲突。

那么push的时候就报错了,要你解决代码冲突问题。
62_代码冲突.png
看到出错的文件是test.txt
63_代码冲突.png
这个test.txt文件现在变成了含有<<<<<<<和>>>>>>>的内容
image.png

  1. <<<<<<<和>>>>>>>中间的内容,就是冲突部分
  2. 1. 修改冲突行,保存,即可解决冲突。
  3. 2. 重新add冲突文件并commit到本地仓库,重新push到远程

以后代码push,组好首先是pull一下,解决了冲突,再push。 这句话待考究!!!!

6. IDEA集成Git