Git
第1章 概述
1.1 是什么
-
介绍
-
源代码管理
-
Git 是目前世界上最先进的分布式版本控制系统
-
Git 诞生
-
在Linus Torvalds开发出了Git分布式版本控制系统11年后,BitKeeper宣布在Apache 2.0许可证下开源。Linus 是在BitKeeper停止向开源社区提供免费版本后开发了Git,今天Git和其它自由软件版本控制系统已经统治了编程社区,BitKeeper 变得无关紧要了。BitKeeper 由BitMover公司开发,该公司CEO Larry McVoy与Linus曾是好友,Larry 说服Linus在内核开发中使用BitKeeper。而BitKeeper在免费使用的许可证中加入很多限制条件,惹恼了内核开发者,最终促使Linus开发出了毁灭BitMover的Git。
-
版本控制软件
- 集中式版本控制工具
- CVS、SVN(Subversion)、VSS……
- 分布式版本控制工具
- Git、Mercurial、Bazaar、Darcs……
- 集中式版本控制工具
1.2 能干嘛
-
作用
-
工作机制
-
代码托管中心
代码托管中心负责维护远程库
- 局域网
- Gitlab
- Internet
- GitHub
- gitee
- 局域网
-
集中式版本控制系统
- SWN 是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器下载最新的%本,然后开发代码,写完代码后需要把自己的代码推送到中央服务器。
- 缺点:
- 服务器单点故障
- 容错性差
分布式版本控制系统
- Git 是 分布式版本控制系统(Distributed Version Control System,简称 DVCS)
- 仓库:
- 本地仓库:是在开发人员自己电脑上的Git仓库
- 远程仓库:是在远程服务器上的Git仓库
- 团队内合作
- 跨团队协作
- 操作:
- clone:克隆,就是将远程仓库赋值到本地
- push:推送,就是将本地仓库代码上传到远程仓库
- pull:拉取,就是将远程仓库代码下载到本地仓库
- commit:提交,就是将本地工作区代码上传到本地仓库中
- 优点:
- 容灾能力强
- 本地版本管理
- 异地协作
- 灵活分支
1.3 去哪下
命令行工具
下载地址:Git-2.23.0-bit.exe
https://git-for-windows.github.io/
https://git-scm.com/download
操作系统中可视化工具:TortoiseGit(了解)
下载地址:http://tortoisegit.org/
TortoiseGit 2.8.0-64-bit
第2章 安装、环境搭建
2.1 安装
- Git Bash 安转 其他默认下一步
- 在
Configuring extra
选项中,默认开启文件缓存即可(推荐) - 在
Adjusting your PATH environment
选项中,勾选第二个,支持第三方软件使用git
2.2 设置全局用户签名
Git 是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识——即:用户签名
- 说明
- 签名的作用是区分不同操作者身份。用户签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。
- 注意:这里设置用户签名和将来登录GitHub(或其他代码托管中心)的账号没有任何关系
- 命令:
- git config --global user.name “用户名”
- git config --global user.email “用户邮箱”
- –global 表示全局属性,所有的git项目都会共用属性
- 查看配置信息:git config --list
- 在当前登录的系统用户目录下,生成.getconfig隐含文件,里面可以看到刚刚设置的信息。如果不用命令设置,也可以直接打开文件进行设置。
第3章 相关概念
3.1 理解工作区、版本库、暂存区概念
- 工作区(Workinf Directory):就是你电脑本地硬盘目录,一般是项目当前目录
- 版本库(Repository):工作区有个隐藏目录.git,它就是Git的本地版本库
- 暂存区(stage):一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
- 分支(Branch) : Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
3.2 提交git版本库分两步执行
第一步:git add 把文件纳入Git管理,实际是把本地文件修改添加到暂存区
第二步:git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以commit就是往master分支上提交更改。
可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。一旦提交完后,如果你又没有对工作区做任何修改,那么工作区就是 “干净” 的。即:nothing to commit (working directory clean)。
其他操作
- 用 “git diff HEAD --filename” 命令可以查看工作区和暂存区里面最新版本的区别。
- 新建过撤销未add: git checkout --文件名
- 撤销已add未commit: 先git reset HEAD 文件名,再git checkout --文件名
- 撤销已add已commit: git reset --hard HEAD^
第4章 Git本地库实战
- 常用命令预览:
命令名称 | 命令作用 |
---|---|
git init | 初始化本地仓库 |
git config --global user.name “用户名” | 设置用户签名的用户名部分 |
git config --global user.email “邮箱” | 设置用户签名的邮箱部分 |
git status | 查看本地仓库状态 |
git add 文件名 | 添加到暂存区 |
git commit -m “日志信息” 文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git reset --hard 版本号 | 版本穿梭 |
4.1 实战(初始化版本库)
-
要使用Git对我们的代码进行版本控制,首先需要获取Git仓库,获取Git仓库通常有两种方法:
- 在本地初始化一个Git仓库
- 从远程仓库克隆
-
本地初始化操作步骤:
-
创建目录(用作本地版本库)
-
当前目录打开Git Bash窗口,初始化仓库
-
命令:git init
-
查看当前目录产生.git隐藏文件夹
-
注意:当前的.git是一个隐藏文件夹,需要在电脑上面设置隐藏文件夹显示设置,否则,看不到这个.git目录
-
4.2 实战(新建\提交\状态)
-
新建文件
- 命令:touch a.txt
- 命令:vim a.txt
-
查看文件状态
-
命令:git status
- On branch master:表示主分支
- Untracked files:表示未跟踪状态
-
说明:
-
Git 工具目录下的文件状态信息:
- Untracked 未跟踪(未被纳入版本控制)
- Tracked 已跟踪(被纳入版本控制)
- Unmodified 未修改状态
- Modified 已修改状态
- Staged 已暂存状态
-
这些文件的状态会随着我们执行Git的命令发生变化
-
红色表示新建文件或者新修改的文件,都在工作区
-
绿色表示文件在暂存区
-
新建的文件在工作区,需要添加到暂存区并提交到仓库区
-
-
也可以使用 git status -s 使输出信息更加简洁
-
??:表示未跟踪状态
-
-
-
-
添加到暂存区
-
命令:
-
git add <文件名称>
- 只是增加到栈空间(index文件)中,还没有添加到本地仓库中、初始化时没有这个index文件。这还是一个新文件,需要将栈空间文件提交到本地仓库。
-
git add .
- 添加项目中所有文件
-
git add 未存在文件
- 添加未存在文件会出错:fatal:pathspec ‘未存在文件’ did not match any files
-
-
-
撤销暂存区的文件
- 命令:git reset <文件名称>
- 撤销后,查看文件状态(git status)文件由绿色变为红色
-
将暂存区文件提交到本地仓库
-
命令:
-
git commit
- 执行命令时需要填写提交日志,进入编辑模式(vim)
-
git commit -m “注释内容”
- 直接用 -m 参数指定日志内容,推荐
- commit 会生成一条版本记录,add 只是添加暂存区,不会生成版本记录,建议多次add后,一次性commit,避免每次add都commit产生版本信息爆炸。
-
git commit -am “注释内容”
- 代码编辑完成后即可进行 add 和 commit 操作
- 提示:添加和提交合并命令
-
-
4.3 实战(查看日志)
-
命令:
-
git log
-
git log a.txt
- 查看文件日志(查看所有的日志或某个文件日志)
- q退出
-
git log --pretty=oneline
- 如果日志很多,可在一行显示(只显示当提交版本之前的日志,显示全部哈希id)
-
git reflog
- 查看历史操作(哈希id显示前几位)
-
4.4 实战(回退\穿梭\撤销)
-
回退到历史版本
-
命令:
-
git reset --hard HEAD^
- 一次回退一个版本,一个 ^ 代表一个版本数量
-
git reset --hard HEAD~n
- 回退 n 次版本
-
-
-
版本穿梭
-
命令:
-
git reflog a.txt
- 查看历史操作
-
git reset --hard 版本号
- 回到最新的版本
-
-
-
撤销
-
未 add , 未 commit
-
vim 修改文件,没有 add 和 commit ,进行撤销
-
命令:git checkout – a.txt
- 撤销修改(还原原本的文件)
-
-
补充 git status -s
git status -s 为 git status --short的缩写
用于以简洁的格式显示工作目录的状态,其中每个文件都由两个字符组成。这两个字符分别表示文件的状态和暂存区的状态
??
:未跟踪的文件A
:新增的文件M
:被修改的文件D
:被删除的文件R
:被重命名的文件C
:被复制的文件U
:存在冲突的文件
-
已 add ,未 commit
-
vim 修改文件,添加 add ,但没有 commit ,进行撤销
-
命令:git reset
- 软回退
- 查看文件内容:cat a.txt
- 查看日志:git reflog a.txt
-
-
4.5 实战(删除)
命令:rm 文件名
4.6 实战(分支)
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。Git的master分支并不是一个特殊分支。它跟其它分支没有区别。之所以几乎每一个仓库都有master分支,是因为git init 命令默认创建它,并且大多数人都懒得去改动它。
4.6.1 分支概念
在使用版本控制工具开发的过程中,同时推进多个任务
4.6.2 分支好处
同时并行推进多个功能开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
4.6.3 分支操作
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
4.6.4 分支操作详情
4.7 实战(版本冲突)
冲突产生的原因
合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git无法替我们决定使用哪一个。必须人为决定新代码内容。
冲突解决
- 编辑有冲突的文件,删除特殊符号,决定要使用的内容
- 添加到暂存区,执行提交(注意:git commit 命令时不能带文件名)
避免冲突
- 容易冲突的操作方式
- 多个人同时操作了同一个文件
- 一个人一直写不提交
- 修改之前不更新最新代码
- 提交之前不更新最新代码
- 擅自修改同事代码
- 减少冲突的操作方式
- 养成良好的操作习惯,先
pull
在修改,修改完立即commit
和push
- 一定要确保自己正在修改的文件是最新版本的
- 各自开发各自的模块
- 如果要修改公共文件,一定要先确认有没有人正在修改
- 下班前一定要提交代码,上班第—件事拉取最新代码
- 一定不要擅自修改同事的代码
- 养成良好的操作习惯,先
第5章 GitHub 远程库实战
5.1 Git 代码托管服务
- github:地址:https://github.com/ 是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一版本库格式进行托管,故名github
- 码云:地址:https://gitee.com 是国内的一个代码托管平台,由于服务器在国内,所以相比GitHub,gitee速度会更快
- GitLab:地址:https://about.gitlab.com/ 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务
5.2 GitHub 简介
- 是什么?:github是一个git项目托管网站,主要提供基于git的版本托管服务
- 能干嘛?: github是一个基于git的代码托管平台,Git并不像SVN那样有个中心服务器。目前我们使用到的Git命令都是在本地执行,如果你想通过Git分享你的代码或者与其他开发人员合作。你就需要将数据放到一台其他开发人员能够连接的服务器上。
https://github.com/
5.3 GitHub 实战——团队内协作
-
创建项目,初始化项目,并设置项目账号
-
创建项目 D:\CodeTest\GitStudy\gitHubTest
-
初始化本地仓库:在当前目录下,执行命令 git init 生成 .git 文件夹(本地库 隐藏文件)
-
设置项目账号(局部账号:.git/config),优先生效局部
-
git config user.name “xxxx”
-
git config user.email “xxx@xx.com”
-
如果不设置采用全局账号(~/.gitconfig)
-
-
-
开发代码,并进行提交
- git add .
- git commit -m “xxx”
-
注册GitHub账号,并在github上创建一个远程库
创建了远程库会生成两个url,客户端可以通过url远程访问远程库
-
映射远程库地址,给url定义一个别名,简化操作,push本地库代码到远程库上
git remote add origin https://github.com/GitYunA/gitHubTest.git( origin 是为url起的别名)
git push origin master 将本地的master分支提交到 origin 远程库
根据弹出框提示选择登录账号
查看远程仓库
-
克隆别人的仓库
git clone https://github.com/GitYunA/gitHubTest.git <项目名称> (默认clone的项目名称)
注意:指定克隆仓库路径以及克隆到本地项目自定义名称。可以克隆提交者配置的ur1映射。但是不能克隆提交者的账母(.git/config)。
-
配置账号,不用在初始化仓库了,clone就初始化好了这个仓库
-
修改代码并提交
-
push代码到远程库,需要建立合作伙伴关系,否则不允许push
-
不是合作伙伴会报 403 无权访问库
-
建立合作关系
当同意成为合作伙伴后(需登录github和邮箱查看邀请),再push
-
-
将远程库代码拉取到本地
- git pull <origin> <master>
5.4 GitHub 实战——团队协作冲突
在上传或同步代码时,由于你和他人都改了同一文件的同一位置的代码,版本管理软件无法判断究竟以谁为准,就会报告冲突,需要程序员手工解决。
- git diff:查看不同冲突
- 手动解决冲突
- add
- commit
- push
5.5 GitHub实战——跨团队协作
Fork
- git跨团队协作过程如下:
- B公司将代码fork到自己公司的远程库
- B公司进行内部开发
- B公司将开发好的代码向A公司发起拉取请求 pull request
- A公司审核B公司代码,审核通过合并代码 merge
5.6 解决重复输入密码问题
两种模式:https VS ssh
ssh 模式比 https 模式的一个重要好处就是,每次 push,pull,fetch等操作时不用重复填写用户名密码。
前提是你必须是这个项目的拥有者或合作者,且配好了ssh key
如何配置 ssh key
-
检查电脑家目录下是否已经生成了SSH key,如果有.ssh目录删除即可
-
创建SSH Key : ssh-keygen -t rsa -C GitHub账号名
成功的话(执行命令不需要输入任何内容),会在~/下生成.ssh文件夹,
查看生成两个文件
id_rsa
id_rsa.pub
打开id_rsa.pub,复制里面的内容,到 github 上
-
补充SSH协议支持多种类型的公钥/私钥对,其中比较常见的包括
- RSA: RSA是最常见的密钥类型之一,它可以用于SSH协议的认证和加密。
- DSA: DSA是另一种常见的密钥类型,与RSA类似,用于SSH协议的认证和加密。
- ECDSA: ECDSA是一种基于椭圆曲线的加密算法,它可以提供比RSA和DSA更高效的加密和更短的密钥长度。
- Ed25519: Ed25519是一种基于椭圆曲线的数字签名算法,它可以提供非常高的安全性和性能。
-
登录账户
打开用户设置
点击[SSH and GPG keys]填写Title和Key,点击[Add SSH key]
测试:提交不需要重新输入密码
给远程仓库的ssh url起别名
注意:
一个账户只能设置一个默认密码
如果有多个账号存在的话,只能选择设置其中一个
5.7 配置Git忽略文件
那些文件要忽略
-
Eclipse特定文件
-
IDEA特定文件
-
Maven工程的target目录
为什么要忽略他们
与项目的实际功能无关,不参与服务器上部署运行,把它们忽略掉能够屏蔽IDE工具之间的差异
怎么忽略?
创建忽略规则文件(git.ignore)
这个文件的存放位置原则上在哪都可以,为了方便让~/.gitconfig文件引用,建议也放在用户家目录下
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.project
.settings
target
.idea
*.iml
在.gitconfig文件中引用忽略的规则文件
[user]
name = xxx
email = xxx
[core]
excludesfile = C:/Users/Lenovo/git.ignore
提示
- SpringBoot、Vue等项目在项目根目录下会自动生成git忽略文件
第6章 IDEA集成Git
6.1 定位Git程序
6.2 初始化本地库
6.3 添加到暂存区
6.4 提交到本地库
6.5 创建分支
或者:
6.6 切换分支
6.7 合并分支
在dev分支下,新建代码,并提交
合并分支
6.8 解决冲突
确定后冲突解决,无需再提交
第7章 在IDEA中连接GitHub
7.1 保存GitHub账号
7.2 分享工程到GitHub上
7.3 Clone
7.4 Push
7.5 Pull
第8章 Git工作流
8.1 Git 工作流
简单来说就是,一个项目的成员们在工作中统—使用Git的工作方式。
Gitflow工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。
-
简单分支
-
复杂分支
8.2 分支种类
-
主干分支 master
主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环节完全一致
-
开发分支 develop
主要负责管理正在开发中的代码。一般情况下应该是最新的代码
-
bug修理分支 hotfix
要负责管理生产环境下出现的紧急修复的代码。从主干分支分出,修理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。
-
发布版本分支 release
较大的版本上线时,会从开发分支中分出发布版本分支,进行最后阶段的集成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段稳定后可视情况删除。
-
功能分支 feature
为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支中独立出来。开发完成后会合并到开发分支。
第9章 Gitlab 私服
注意:要使用CentOS7版本安装,CentOS6版本不行
9.1 官网地址
首页:https://about.gitlab.com/
安装说明:https://about.gitlab.com/installation
9.2 提前下载所需rpm
yum安装gitlab-ee(或ce)时,需要联网下载几百M的安装文件,非常耗时,所以应提前把所需RPM包下载并安装好。
下载地址是: https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-13.10.2-ce.0.el7.x86_64.rpm
下载好后上传到Linux系统,习惯上还是放在/opt目录下
9.3 安装步骤
#sudo 是切换到管理员权限 root账号下不需要 ,安装rpm
sudo rpm -ivh /opt/module/gitlab-ce-13.10.2-ce.0.el7.x86_64.rpm
# 联网安装一些所需插件
sudo yum install -y curl policycoreutils-python openssh-server cronie
#sudo yum install lokkit 不报错不用装
sudo lokkit -s http -s ssh
# 安装postfix
sudo yum install -y postfix
#启动服务 sudo systemctl enable postfix.service
sudo service postfix start
# 设置服务开机启动
sudo chkconfig postfix on
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ce
# 当步骤执行完后重启
9.4 Gitlab 服务操作
- 初始化配置
- gitlab-ctl reconfigure
- 启动Gitlab服务
- gitlab-ctl start
- 停止Gitlab服务
- gitlab-ctl stop
9.5 浏览器访问
访问Linux服务器IP地址即可,如果想访问EXTERNAL_URL指定的域名还需要配置域名服务器或本地hosts文件。
初次登录时需要为Gitlab的root用户设置密码
员权限 root账号下不需要 ,安装rpm
sudo rpm -ivh /opt/module/gitlab-ce-13.10.2-ce.0.el7.x86_64.rpm
联网安装一些所需插件
sudo yum install -y curl policycoreutils-python openssh-server cronie
#sudo yum install lokkit 不报错不用装
sudo lokkit -s http -s ssh
安装postfix
sudo yum install -y postfix
#启动服务 sudo systemctl enable postfix.service
sudo service postfix start
设置服务开机启动
sudo chkconfig postfix on
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo EXTERNAL_URL=“http://gitlab.example.com” yum -y install gitlab-ce
当步骤执行完后重启
[外链图片转存中...(img-gmoUF3lo-1690211981817)]
### 9.4 Gitlab 服务操作
- 初始化配置
- gitlab-ctl reconfigure
- 启动Gitlab服务
- gitlab-ctl start
- 停止Gitlab服务
- gitlab-ctl stop
### 9.5 浏览器访问
访问Linux服务器IP地址即可,如果想访问EXTERNAL_URL指定的域名还需要配置域名服务器或本地hosts文件。
初次登录时需要为Gitlab的root用户设置密码