1 git简介
2 版本控制是什么
3 常见的两种版本控制工具
3.1 集中式版本控制工具
3.2 分布式版本控制工具
Git是分布式版本控制系统(Distributed Version Control System,简称 DVCS) ,分为两种类型的仓库:
本地仓库和远程仓库
本地仓库:是在开发人员自己电脑上的Git仓库
远程仓库:是在远程服务器上的Git仓库
Clone:克隆,就是将远程仓库复制到本地
Push:推送,就是将本地仓库代码上传到远程仓库
Pull:拉取,就是将远程仓库代码下载到本地仓库
4 Git简史

Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。
到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统Git
5 Git的工作机制
Git分为工作区,暂存区,本地仓库,远程仓库
工作区就是我们操作的文件所在的文件夹
暂存区:临时存储区域
本地仓库:记录文件的所有历史信息(包括历史版本)
远程仓库:一个共同的仓库,各个本地仓库的文件可以推送到这里,本地仓库也可以从远程仓库拉取新的文件。
1.从远程仓库中克隆代码到本地仓库
2.从本地仓库中checkout代码然后进行代码修改
3.在提交前先将代码提交到暂存区
4.提交到本地仓库。本地仓库中保存修改的各个历史版本
5.修改完成后,需要和团队成员共享代码时,将代码push到远程仓库
6 Git安装
6.1 下载
6.2 安装
(简单点的话可以一直next,采用默认的设置安装)
选择 Git 安装位置,要求是非中文并且没有空格的目录,然后下一步。

Git 安装目录名,不用修改,直接点击下一步
Git 的默认编辑器,建议使用默认的 Vim 编辑器,然后点击下一步
默认分支名设置,选择让 Git 决定,分支名默认为 master,下一步
修改 Git 的环境变量,选第一个,不修改环境变量,只在 Git Bash 里使用 Git
选择后台客户端连接协议,选默认值 OpenSSL,然后下一步
配置 Git 文件的行末换行符,Windows 使用 CRLF,Linux 使用 LF,选择第一个自动

选择 Git 终端类型,选择默认的 Git Bash 终端,然后继续下一步
选择 Git pull 合并的模式,选择默认,然后下一步
选择 Git 的凭据管理器,选择默认的跨平台的凭据管理器,然后下一步
其他配置,选择默认设置,然后下一步
点击 Finsh 按钮,Git 安装成功
右键任意位置,在右键菜单里选择 Git Bash Here 即可打开 Git Bash 命令行终端
在 Git Bash 终端里输入 git --version 查看 git 版本,如图所示,说明 Git 安装成功
7 Git 常用命令
7.1 设置用户签名
7.2 初始化本地库


执行成功,在文件夹下看到.git的文件夹生成(默认是隐藏的),勾选隐藏的项目,就可以看到,表示本地库已完成初始化
7.3 查看本地库状态
7.3.1 基本语法
可以看到,它这里显示,有一个文件aaa.txt没有add到暂存区(因为初始化完成后,我创建了一个aaa.txt的文件)
7.4 添加文件到暂存区
7.4.1 基本语法
git add 文件名
7.4.2 示例
执行git add aaa.txt把文件加到暂存区
执行git status查看本地库状态,发现有一个新的文件aaa.txt在暂存区
7.5 提交暂存区文件到本地库
7.5.1 基本语法

7.6 查看历史版本

git log 查看版本详细信息,顺序是从下到上的(最下面的是最早的操作,最上面的是最新的操作)
7.7 版本穿梭

此时bbb.txt只有一行内容"bbbbbb"
加上一行内容
执行git add和git commit把修改的内容提交到本地库
再查看bbb.txt的版本信息,可以看到修改的记录
执行git reset --gard 版本910739a ,这个910739a 就是上面bbb.txt的第一个版本
执行命令cat bbb.txt查看bbb.txt,发现内容只有一行了,退回到bbb.txt最初的版本
同时查看本地工作文件,发现bbb.txt也退回到最初版本
需要注意的是,版本穿梭,针对的是整个本地库,而不是某个文件,所有文件都会回到我们穿梭时候的那个版本的内容。
8 分支操作
8.1 什么是分支

如上图:master分支是主分支,同时它也是线上运行的正式版本。
现在,master-1正在线上运行,而此时我们需要添加两个功能模块,分别是feature-blue和feature-game。为了避免这两个模块的开发对线上运行的代码的影响,也为了避免两个功能模块开发之间的运行,所以创建两个分支,feature-blue和feature-game。此时,master-1、feature-blue-1和feature-game-1这三个分支的内容还是一样的。
同时两个开发团队分别去做feature-blue和feature-game这两个模块。
feature-blue团队在一段时间开发后完成了feature-blue-2版本,发现没有什么问题,就把feature-blue-2合并到master,master就更新到了master2,此时master2就有了feature-blue模块。
feature-game的团队,由于这个模块比较复杂,经过三个版本,一直到feature-game-4这个版本才完成整个模块的功能(在这个期间,master-2发现存在bug,修复了bug,变为了master-3这个版本)。feature-game-4这个版本经过测试,发现没什么问题,就把feature-game-4合并到master,形成了master4这个分支,此时master就具备了feature-game这个功能模块。
通过这个例子我们看到,分支可以有效的将各个功能模块的开发分开来,避免相互影响,同时,又不影响线上正在运行的主分支。在其它分支完成后,把新的内容合并到主分支就好了。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。
8.2 分支操作命令
8.3 创建分支
8.3.1 基本语法

8.4 查看分支

8.5 切换分支

8.6 合并分支
8.6.1 基本语法

2)把qqq提交到本地库
3)切换到master
4)合并baster1到master
发现,新创建的qqq.txt被合并过来了
8.6.3 冲突示例

2)切换到baster1
3)对qqq.txt进行修改
4)切换到master
5)合并baster1到master
MERGING状态代表有冲突,也指出了冲突问价是qqq.txt
6)处理冲突文件vim qqq.txt
我们保留两个分支的修改(也可以只保留某一个分支的修改),保存修改
7)添加qqq.txt到暂存区
8)提交qqq.txt
注意,git commit -m "备注说明" 后面不要文件名,冲突解决。
9)查看
查看qqq.txt,发现三行内容
切换到baster1,查看qqq.txt,两行内容
9 Git代码托管中心
git托管中心常用的有三个,GitLab,GitHub,Gitee
9.1 局域网环境下
GitLab服务器,它是在局域网环境下搭建的,私密性比较强
9.2 外网环境下
GitHub:国外的托管中心,网络影响较大
Gitee(码云),国内的托管中心
10 本地库和代码托管中心远程库交互
10.1 团队内协作
10.2 团队外协作
11 远程仓库操作
使用Github或者Gitee,两者的操作基本一致。
国内使用gitee会更舒服点,使用Git经常因为网络操作失败
11.1 网址
11.2 创建一个远程仓库(gitee)

11.3 远程仓库操作相关命令
11.4 在本地git添加远程库地址别名
11.4.1 基本语法

新增远程地址别名,别名为gittest
查看远程地址别名:发现有两个gittest别名,分别对应拉取和推送
11.5 推送代码到远程仓库
11.5.1 基本语法

操作后,发现本地仓库的文件已经推送到了远程仓库
11.6 演示团队协作-添加团队成员
11.6.1 创建一个新的gitee账号
11.6.2 把新的账号加入到我们的项目的团队中来
管理-仓库成员管理-开发者-邀请(可以发送链接要求,也可以直接通过对方用户名添加)
完成添加后,团队中就有两个账号了
11.7 clone代码
作为一个新的成员,要一期开发gittest这个项目,首先要把远程仓库的代码clone到本地仓库
11.7.1 基本语法


2)克隆远程仓库到本地仓库
git clone 远程地址,这里不能使用别名,只能用地址,这个地址使用新账号的远程仓库的地址
操作完成,发现远程仓库文件已经克隆到了本地仓库
11.8 使用新对本地仓库代码修改后push到远程仓库
11.8.1 由于我是在同一个电脑上操作的,所以先要修改凭证管理器



操作成功后我们修改的内容就被push到远程仓库了

11.9 pull拉取更新的内容
11.9.1 我们回到原先的本地仓库gittest
11.9.2 凭据管理器改为原来的账号
11.9.3 基本语法
git pull 远程仓库别名(地址) 分支名称
11.9.4 示例
发现1个文件发生了改变,就是aaa.txt,改变的内容被拉取下来了
