Git教程
Git官网:https://git-scm.com/
参考视频:黑马程序员Git全套教程,完整的Git项目管理工具教程,一套精通Git
1. 版本控制
版本管理概念
版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。
版本管理工具概念
版本管理工具,也被称为版本控制工具,是一个用于记录文件内容变化,以便将来查阅特定版本修订情况的系统。它主要用于管理软件开发中的源代码、配置文件和文档等文件的变更。
具体来说,版本管理工具具备以下核心功能:
- 备份文件:每一次的文件变更都会被保存下来,形成一个新的版本,这样即使出现错误或需要回溯,也可以轻松地恢复到之前的版本。
- 记录历史:工具会详细记录每次变更的内容、时间以及执行变更的人员等信息,为团队提供完整的版本历史记录。
- 回到过去:通过版本管理工具,用户可以轻松地恢复到过去的任何一个版本,这对于错误排查、功能回滚等场景非常有用。
- 多端共享:版本管理工具支持在多个设备或平台上访问和更新代码库,使得团队成员可以在不同的工作环境中无缝协作。
- 团队协作:它支持多人同时处理同一份文件,通过合并和冲突解决机制,确保团队成员之间的协作更加高效和准确。
版本管理工具
主流的版本控制软件有:
Git
SVN(Subversion)
CVS(Concurrent Versions System)
VSS(Micorosoft Visual SourceSafe)
TFS(Team Foundation Server)
Visual Studio Online
使用最广泛的是 Git 与 SVN。
版本管理发展简史(维基百科)
1、SVN(SubVersion)
SVN 是集中式版本控制系统,版本库是集中放在中央服务器的。
工作流程如下:
- 从中央服务器远程仓库下载代码
- 修改后将代码提交到中央服务器远程仓库
优点:简单,易操作。
缺点:所有代码必须放在中央服务器。
- 服务器一旦宕机无法提交代码,即容错性较差。
- 离线无法提交代码,无法及时记录我们的提交行为。
SVN 流程图
2、Git
Git 是分布式版本控制系统(Distributed Version Control System,简称 DVCS),分为两种类型的仓库:本地仓库
和 远程仓库
工作流程如下:
- 从远程仓库中克隆或拉取代码到本地仓库 (clone/pull) 。
- 从本地进行代码修改。
- 在提交前先将代码提交到暂存区。
- 提交到本地仓库。本地仓库中保存修改的各个历史版本。
- 修改完成后,需要和团队成员共享代码时,将代码 push 到远程仓库。
总结:Git 和 SVN 的区别
- SVN 是集中式版本控制工具,Git 是分布式版本控制工具
- SVN 不支持离线提交,Git 支持离线提交代码
2. Git 发展简史
Git 起源于2005年,由 Linux 内核的缔造者 Linus Benedict Torvalds 创建。在之前,Linux 内核的维护主要依赖于补丁和存档文件,但随着参与者的增多,这种方式变得低效。尽管当时存在其他版本控制工具,但它们要么是收费的,要么是采用集中式管理方式,无法满足 Linux 内核社区的需求。
2002年,Linux 内核项目开始使用 BitKeeper 这一专有分布式版本控制系统,但2005年,由于商业合作关系的破裂,Linux 内核社区失去了免费使用 BitKeeper 的权力。
这一事件促使 Linus Benedict Torvalds和Linux 开源社区开始开发自己的版本控制系统。他们基于使用 BitKeeper 时的经验,设定了新系统的目标:高速、简单设计、支持非线性开发(允许成千上万个并行分支)、完全分布式,并能有效管理大型项目。
经过两周的开发,Linus Torvalds 用 C 语言写出了 Git 这一分布式版本控制系统。Git自诞生以来,不断发展和完善,成为高度易用且功能强大的版本控制工具,广泛应用于各类软件开发项目中。
Git 的成功不仅在于其技术上的优越性,更在于它符合开源文化和协作精神,为全球开发者提供了一个共同学习和进步的平台,推动了整个软件开发行业的进步。
3. Git 快速入门
3.1 Git概述
Git 是一个免费的,开源的分布式版本控制系统,可以快速高效地处理从小型或大型的各种项目。Git 易于学习,占用空间小,性能快得惊人。
3.2 Git下载与安装
Git 下载
一、Git 下载官网
进入官网后根据自己操作系统的情况下载并进行安装:
二、 如果官网下载太慢,可以使用淘宝镜像下载:Git 镜像下载
进入镜像后,拖至最下方,进入稳定版的下载,然后根据自己操作系统的情况下载并进行安装。
最早 Git 是在 Linux 上开发的,很长一段时间内,Git 也只能在 Linux 和 Unix 系统上跑。不过,慢慢地有人把它移植到了 Windows 上。现在,Git 可以在 Linux、Unix、Mac 和 Windows 这几大平台上正常运行了。由于开发机大多数情况都是 Windows,所以本教程选择相对简单的 Windows 系统软件版本进行下载,此处我们下载 Windows 系统的 2.44.0 版本软件。
Git 安装
安装时使用 “傻瓜式” 安装,无脑下一步即可。PS:注意按自己需求修改安装路径!😏
安装时还可以修改默认编辑器,默认是 Vim 编辑器。比如将默认编辑器修改为 NotePad3,找到 NotePad3 的 exe 文件并选择即可。
如果在安装完成后想要修改默认编辑器,可以使用命令:
1 | 将默认编辑器修改为 vim |
Git 启动测试
安装成功后在开始菜单中会有如下信息:
Git Bash: Unix 与 Linux 风格的命令行(使用最多,推荐使用)
Git CMD: Windows 风格的命令行
Git GUI: 图形界面的 Git,不建议初学者使用,尽量先熟悉常用命令
可以在某一目录中点击右键,点击 “Git Bash Here” 就可以再当前目录下打开 Git Bash。
在Windows桌面空白处,点击鼠标右键,弹出右键菜单:
Git软件安装后,会在右键菜单中增加两个菜单
- Open Git GUI Here
- Open Git Bash Here
此处仅仅是为了验证 Git 软件安装的效果,所以选择 Git Bash Here
菜单, 选择后,Windows 系统弹出 Git 软件的命令行黑窗口:
窗口弹出后,可以输入 Git 软件的操作指令。此时我们使用键盘输入操作指令:git -v
或 git --version
,查看当前 Git 软件的安装版本。
1 | git -v |
输入指令回车后,如果黑窗口中打印出咱们安装的软件版本 2.44.0,Git 软件安装成功了。
3.3 Git基础指令
Git 软件是免费、开源的。最初 Git 软件是为辅助 Linux 内核开发的一套软件,所以在使用时,简单常用的 Linux 系统操作指令是可以直接使用的:
指令 | 含义 | 说明 |
---|---|---|
cd 目录 | change directory | 改变操作目录 |
cd .. | 退回到上一级目录 | |
pwd | Print work directory | 打印工作目录 |
ls | list directory contents | 显示当前目录的文件及子文件目录 |
ll | ls -l 简化版本 | 更详细地显示当前目录的文件及子文件目录 |
mkdir 文件夹名称 | make directory | 新建一个文件夹 |
rm 文件 | remove | 删除文件 |
rm -r 文件夹 | Remove | 删除文件目录 |
touch 文件 | 如果创建的文件不存在,那么创建一个空文件 | |
reset | 清屏 | |
clear | 清屏 | |
exit | 退出终端窗口 |
3.4 Git配置
配置信息
Git 安装目录下的 gitconfig --system
系统级配置文件:Git 安装目录 \etc\gitconfig
只适用于当前登录用户的配置 --global
全局配置文件:C:\Users\ 你的用户名 \ .gitconfig
默认情况下,我们可以通过使用以下命令,查看不同级别的配置信息:
1 | 查看系统 config |
设置名称和邮箱 这很重要!!!
安装完 Git 后首先要做的事情是设置用户名和 email 地址。这非常重要,因为每次 Git 提交都会使用该信息,它被永远的嵌入到了提交中。所以!!!是一定要配置的!!!
否则就会出现如下提示:
此时需要按照下面两个命令来设置用户名🏃和邮箱📧( muyoukule 是我的用户名,your_email@example.com 是邮箱,你需要设置属于你自己的用户名和邮箱)。
1 | git config --global user.name muyoukule |
如果使用了 --global
选项,表示设置了全局的用户名和邮箱。如果希望在一个特定的项目中使用不同的用户名和邮箱,可以在该项目中运行该命令而不添加 –global 选项。总之 --global
为全局配置,不加为某个项目的特定配置。
设置好用户名和邮箱后,此时在操作系统的用户目录 C:\Users\你的用户名
下会产生新的配置文件 .gitconfig
,可以运行 git config --global --list
,就会显示设置的用户名和邮箱,也可以在 C:\Users\你的用户名\.gitconfig
文件中看到设置的信息。
也可以使用命令查看:
1 | git config --global user.name |
为常用指令配置别名(可选)
有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。
1、打开用户目录,创建 .bashrc 文件
部分windows系统不允许用户创建点号开头的文件,可以打开 GitBash,执行 touch ~/.bashrc
1 | 新建 .bashrc 文件 |
执行完成后会在 C:\Users\你的用户名
路径下多出 .bashrc 文件
2、在 .bashrc
文件中输入如下内容:
1 | 用于输出git提交日志 |
3、打开 GitBash,执行 source ~/.bashrc
1 | 重启变量配置 |
4. Git 基本理论
三大区域
Git 本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage 或 Index)、资源库(历史记录区、版本库、本地仓库、History、Repository 或 Git Directory)。如果在加上远程的 Git 仓库(Remote Directory)也可以分为四个工作区域。
文件在这四个区域之间的转换关系如下:
- Working Directory:工作区,平时存放项目代码的地方。
- Stage(Index):暂存区,用于临时存放改动,事实上它只是一个文件,保存即将提交到文件列表信息。
- History:历史记录区,安全存放数据的位置,里面有项目所有版本的数据。
- Remote Directory:远程仓库,托管代码的服务器,可以简单的认为是项目组中用于远程数据交换的一台电脑。
三大区域的另一种图示
本地的三个区域确切的说应该是 Git 仓库中 HEAD 指向的版本:
Directory:使用 Git 管理的一个目录,也就是一个仓库,包含我们的工作空间和 Git 的管理空间。
WorkSpace:需要通过 Git 进行版本控制的目录和文件,这些目录和文件组成了工作空间。
.git:存放 Git 管理信息的目录,初始化仓库的时候自动创建。(一个隐藏文件夹)
Index/Stage:暂存区,或者叫待提交更新区,在提交进入 repo 之前,可以把所有的更新放在暂存区。
Local Repo:本地仓库,一个存放在本地的版本库;HEAD 会只是当前的开发分支(branch)。
Stash:隐藏,是一个工作状态保存栈,用于保存 / 恢复 WorkSpace 中的临时状态。
工作流程
本地仓库:是在开发人员自己电脑上的 Git 仓库,存放我们的代码(.git 隐藏文件夹就是我们的本地仓库)。
远程仓库:是在远程服务器上的 Git 仓库,存放代码(可以是 github.com 或者 gitee.com 上的仓库,或者自己该公司的服务器)。
工作区:我们自己写代码(文档)的地方。
暂存区:在本地仓库中的一个特殊的文件 (index) 叫做暂存区,临时存储我们即将要提交的文件。
Clone:克隆,就是将远程仓库复制到本地仓库。
Push:推送,就是将本地仓库代码上传到远程仓库。
Pull:拉取,就是将远程仓库代码下载到本地仓库,并将代码克隆到本地工作区。
5. Git 本地仓库
要使用 Git 对我们的代码进行版本控制,首先需要获得本地仓库。
获得本地仓库
创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。
创建全新的仓库
在电脑任意位置创建一个空目录(例如在桌面新建 repository 文件夹)作为本地 Git 仓库。
进入这个目录,点击右键点击
Git Bash here
打开窗口在目录执行以下命令创建全新的仓库:
1
2在当前目录新建一个 Git 代码库
git init执行后在当前目录下新增了一个
.git
隐藏目录,当前项目的版本信息和配置信息都会存放在这个目录里。
克隆远程仓库
可以使用以下命令将某个项目克隆(下载)到本地:
1 | 克隆一个项目和它的整个代码历史(版本信息) |
在 GitHub 上选定一个项目进行测试:
6. Git 文件操作
Git 工作目录下对于文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着我们执行 Git 的命令而发生变化。
查看修改的状态(status)
作用:查看的修改的状态(暂存区、工作区)
1 | 查看指定文件状态 |
添加工作区到暂存区(add)
作用:添加工作区一个或多个文件的修改到暂存区
1 | 添加所有文件到暂存区 |
PS:add错了可以使用 git rm --cached 文件名
删除对应的文件
提交暂存区到本地仓库(commit)
作用:提交暂存区内容到本地仓库的当前分支
1 | 提交暂存区中的内容到本地仓库 -m 提交信息 |
查看提交日志(log)
作用:查看提交记录
1 | git log [option] |
options:
空
:查看当前分支版本信息--all
:显示所有分支--pretty=oneline
:将提交信息显示为一行--abbrev-commit
:使得输出的commited更简短--graph
:以图的形式显示
版本回退
作用:版本切换
1 | git reset --hard commitID # commitID 可以使 git log 指令查看 |
查看已经删除的记录
git reflog
可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)。
1 | git reflog |
提交记录过多时,按下 q
可结束浏览。
添加文件至忽略列表
有时不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等,要求忽略这些文件的修改。
在根目录下建立 .gitignore
文件,将需要被忽略的文件名添加到此文件中。
.gitignore
文件内容解析:
以井号
#
开始的行表示注释;可以使用 Linux 通配符。例如:星号
*
代表任意多个字符,问号?
代表一个字符,方括号[]
代表可选字符范围,大括号{}
代表可选的字符串等;如果名称的最前面有一个感叹号
!
,表示例外规则,满足条件的文件不会被忽略;如果名称的最前面是一个路径分隔符
/
,表示要忽略的文件在根目录下;如果名称的最后面是一个路径分隔符
/
,表示要忽略的是此目录下的文件。
1 | *.txt # 忽略所有 .txt 结尾的文件 |
IDEA 中常用的 .gitignore
文件内容:
1 | Compiled class file |
7. 分支
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的 Bug 修改、开发新的功能,以免影响开发主线。
Git 中与分支相关的常用指令
1 | 列出所有本地分支。-a 表示列出所有分支,包括远程分支 |
开发中分支使用原则与流程
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的 Bug 修改、开发新的功能,以免影响开发主线。
在开发中,一般有如下分支使用原则与流程:
- master (生产)分支:线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;
- develop (开发)分支:是从 master 创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到 master 分支,准备上线。
- feature/xxxx 分支:从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完 成后合并到develop分支。
- hotfix/xxxx 分支:从 master 派生的分支,一般作为线上 bug 修复使用,修复完成后需要合并到 master、test、 develop 分支。
还有一些其他分支,在此不再详述,例如 test 分支(用于代码测试)、pre 分支(预上线分支)等等。
8. Git远程仓库
常用的托管服务(远程仓库)
前面我们已经知道了 Git 中存在两种类型的仓库,即本地仓库和远程仓库。那么我们如何搭建Git远程仓库呢?我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有 GitHub、码云(Gitee)、GitLab 等。
GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名GitHub。
码云(Gitee) 是国内的一个代码托管平台,由于服务器在国内,所以相比于 GitHub,码云速度会更快。
GitLab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 Web 服务,一般用于在企业、学校等内部网络搭建 Git 私服。
GitHub 的使用
可以使用 GitHub 作为代码托管平台,尽管 GitHub 的访问速度不佳,但也不选择 Gitee,而在公司中,还可能使用搭建的的 GitLab 服务器。
首先需要注册 GitHub;
为了方便使用,强烈建议 设置本机绑定 SSH 公钥,实现免密码登录;
8.1 配置 SSH 公钥
进入
C:\Users(用户)\你的用户名
目录如果你是第一次设置,在这个目录下看不到.ssh目录
在上述目录下右键打开
“Git Bash Here”
,运行以下命令并生成公钥1
2ssh-keygen -t rsa -C "邮箱或其他描述性文字"
rsa是加密方式运行后无脑下一步即可
对输入的命令以及执行命令后需要输出的情况进行解析
1 | ssh-keygen -t rsa -C "your_email@example.com" |
以上代码省略了 -f 参数,因此运行上面那条命令后会要求输入一个文件名,用于保存刚才生成的 SSH key 代码,如:
1 | Generating public/private rsa key pair. |
也可以不输入文件名,使用默认文件名(推荐),那么就会生成 id_rsa 和 id_rsa.pub 两个秘钥文件。
接着又会提示输入两次密码(该密码是 push 文件的时候要输入的密码,而不是 GitHub 管理者的密码),也可以不输入密码,直接按回车。那么 push 的时候就不需要输入密码,直接提交到 GitHub 上了,如:(我在此直接回车,不输入密码)
1 | Enter passphrase (empty for no passphrase): |
接下来将会显示:
1 | Your identification has been saved in /c/Users/you/.ssh/id_rsa. |
当看到上面这些信息时就说明 SSH key 已经创建成功,接下来将其添加到 GitHub 的 SSH key 上就可以了。
打开 GitHub 并进行登录,点击右上角头像,选择 Settings,进入设置页面后,点击 Access 下的 SSH and GPG keys,之后点击 New SSH key;
打开目录
C:\Users(用户)\你的用户名\.ssh
,将 id_rsa.pub 文件内的内容复制到公钥填写处,点击 “确定”,输入 GitHub 的密码即可添加成功!
PS:id_rsa 存放的是私钥,id_rsa.pub 存放的是公钥,需要复制的是公钥 id_rsa.pub 的内容。
运行 Git Bash,输入命令
ssh -T git@github.com
(如果使用 Gitee,输入ssh -T git@gitee.com
),然后输入 yes。出现以下内容则连接成功:到此,完成 SSH 免密登录的配置。
如果需要新建仓库,点击主界面右上方头像旁的 “+” 然后选择 “New repository” 即可:
8.2 操作远程仓库
执行操作之前要确保此文件夹为 Git 本地仓库。
添加远程仓库
此操作是先初始化本地库,然后与已创建的远程库进行对接。
1 | git remote add <远端名称> <仓库路径> |
- 远端名称,默认填写origin,取决于远端服务器设置
- 仓库路径,从远端服务器获取此URL
查看远程仓库
1 | 列出本地仓库中已配置的远程仓库的名称 |
-v
:查看当前仓库关联的远程服务器地址。
移除本地远程仓库地址
1 | git remote remove <远程仓库别名> |
推送到远程仓库
1 | git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名] ] |
如果远程分支名和本地分支名称相同,则可以只写本地分支
1
git push origin master
-f
表示强制覆盖。--set-upstream
推送到远端的同时并且建立起和远端分支的关联关系。1
git push --set-upstream origin master
如果当前分支已经和远端分支关联,则可以省略分支名和远端名。
1
2将 master 分支推送到已关联的远端分支
git push
9. 在 IDEA 中使用 Git
以下内容适用于 IDEA 2022.2 版本,其他版本仅供参考。
9.1 IDEA 配置 Git
安装好 IntelliJ IDEA 后,如果 Git 安装在默认路径下,那么 IDEA 会自动找到 Git 的位置,如果更改了 Git 的安装位置则需要手动配置下 Git 的路径。按照下面步骤:File — Settings — Version Control — Git — Path to Git executable,在此处配置 Git 安装目录下的 exe 文件。例如:D:\Git\cmd\git.exe,其中 D:\Git 是安装目录。然后可以点击 “Tset”,出现 5 则说明 IDEA 成功识别到 Git 。
还可以选择 Settings — Version Control — GitHub,添加 GitHub 账号到 IDEA 中。
9.2 在 IDEA 中操作 Git
可以使用右上角 IDEA 集成的 Git 按钮进行操作,也可以在 IDEA 中的 Terminal 执行 Git 命令完成操作。
本地仓库与远程仓库绑定
1、初始化本地仓库
右上角工具栏 VCS — Create Git Repository — 选择 Git 仓库目录,默认是当前项目目录 — OK
2、设置远程仓库
初始化本地仓库成功后右上角工具栏会出现 Git 选项,Git — Manage Remotes — 输入远程地址 URL — OK
PS:设置远程仓库时远程仓库需要为空。
3、提交到本地仓库
4、推送到远程仓库
右上角工具栏 Git — Push — Push (Push 的时候需要使用 GitHub 的 token)
6、创建分支
克隆远程仓库到本地成功后在 IDEA 右下角会出现 master 按钮,依次点击 master — New Branch — 输入新分支名 — Create,可以看到右下角的 master 分支名变成了输入的新分支名,即当前在新分支下。
7、切换分支及其他分支相关操作
克隆远程仓库到本地
右上角工具栏 VCS — Get from Version Control — 根据需求自己选择(可以是 URL 地址或者直接将自己的远程仓库拉取下来)
IDEA 项目绑定 Git
IDEA 绑定 Git 后可以在 IDEA 观察到 文件颜色的变化:
红色(或红褐色)
- 表示文件尚未被添加到 Git 版本控制中,即文件还未被
git add
命令添加到暂存区。 - 通常这些文件是新创建的,或者虽然存在但尚未被 Git 跟踪。
绿色
- 表示文件已经被
git add
命令添加到暂存区,但尚未被git commit
命令提交。 - 换句话说,这些文件已经处于待提交状态。
蓝色
- 表示文件已经被 Git 跟踪,并且已经发生了修改,但这些修改尚未被提交(即未被
git commit
)。 - 一旦这些修改被提交,文件颜色可能会变为白色(表示文件已提交且没有进一步修改)。
白色
- 表示文件已经被 Git 跟踪,并且最近的修改已经被提交。
- 这些文件目前没有未提交的修改。
灰色
- 表示文件虽然存在于项目中,但已经被
.gitignore
文件忽略,因此不会被 Git 跟踪。
忽略文件创建
不希望将 IDEA 的配置文件(.idea)push 到远程仓库,在 .gitignore 文件中添加 .idea/
即可。如果当前项目中没有 .gitignore 文件,就需要创建 .gitignore 文件。
两种方式:
复制 .gitignore 文件到项目。
因为 .gitignore 比较固定,几乎很多项目都大差不差,所以可以直接去网上复制
安装使用 .ignore 插件。
点击 IDEA 中左上角 File– Settings,安装 .ignore 插件,安装好在项目右键添加 .gitignore ,使用默认模板即可。
10. 一些操作流程
10.1 推送到远程仓库
将本地未被 Git 管理的代码交由 Git 管理并推送到远程仓库:
1 | 1.初始化 Git 仓库 |
11. 一些问题
在 git push
的时候出现以下错误信息:
1 | error: File: ab6526079f60d1876fb933533dc3e6782a8eXXXX 183.89 MB, exceeds 100.00 MB. |
出现了这个错误,其实就是其中有一个文件太大,超过了100M导致的。
解决方案
1、查看哪个文件超过了100M
有可能错误直接爆出是哪个文件,也有可能只是爆出了该文件的代号。如果是代号需要先使用该语句查询具体是哪个文件:
1 | git rev-list --objects --all | grep ab6526079f60d1876fb933533dc3e6782a8eXXXX |
2、从缓存中删除
1 | git filter-branch --tree-filter 'rm -f path/to/large/files' --tag-name-filter cat -- --all |
PS:上方命令中的 path/to/large/files
是大文件所在的路径,千万不要弄错!
3、再次进行push操作
1 | git push origin master |