什么是 Git?
Git 的目前最流行的分布式版本控制软件,可以帮助我们高效敏捷的处理任何项目。
版本管理
要理解 Git 我们首先要理解版本管理。
版本管理就是开发过程中用于管理对文件、目录或者工程等内容的修改历史,可以让我们方便的查看历史记录,备份和恢复以前版本的软件工程技术。
作用
有了版本控制可以做到什么呢?下面来看一下它的应用场景:
- 实现跨区域的多人合作开发:我们可以将代码保存到本地仓库,不需要连接服务器就能实现修改,并且通过远程仓库实现跨区域开发。
- 追踪和记载一个或者多个文件的历史记录,方便我们查看这个版本的修改内容。
- 组织和保护源代码和源文档
- 统计工作量、实现并行开发、提高开发效率
- 追踪记录整个软件的开发过程
- 减轻开发人员负担,节省时间,同时降低人为引发的错误,通过回滚我们可以快速的返回上个版本,来降低损失。
版本控制的分类
- 本地版本控制:记录文件每次的更新,对每个版本做一个快照,或者是记录补丁文档,适合个人使用
- 集中式版本控制:将版本数据存储在服务器上,协同开发的人员从服务器上同步更新和上传自己的修改,用户本地只有之前同步的版本,不联网的话就无法得到历史版本。集中式版本控制数据都存储在单一的服务器上,一旦这个服务器损坏就有极大的风险,需要定期备份。
分布式版本控制
- 所有版本信息的仓库全都存储到本地的每个用户。
- 可以在本地查看所有的版本历史,可以离线在本地提交,只需要联网的适合 push 到响应的服务器。
- 每个用户保存了所有的版本信息,换言之每个用户的本地数据都是一个仓库
- 不会因为服务器出现问题就导致工作停滞的情况
它的代表软件就是今天要说的 Git
Git 的下载与安装
Git 官网:https://git-scm.com/
安装
- 一直下一步即可,建议安装到非系统盘
- 安装的路径不要带中文、空格、特殊字符
常用资料
Git 大全:https://gitee.com/all-about-git
Git 互动学习:https://oschina.gitee.io/learn-git-branching/
Git 基本配置
常用指令
- 设置用户名和邮箱:使用 Git 前需要设置用户名和邮箱,每次提交的时候都会使用到这个信息
git config --global user.name "Your Name"
git config --global user.email "YourEmali"
- 查看配置的指令
# 查看所有配置
git config -l
# 查看当前用户的配置
git config --global -l
# 查看系统配置
git config --system -l
Git 的配置文件
- System 配置文件:位于 Git 安装目录下的 .gitconfig
- Global 全局文件:位于 C 盘下的 .gitConfig 只适用于当前用户的配置
Git 的工作原理(重点)
Git 的四个工作区域
Git 在本地有三个工作区域:工作目录、暂存区、资源库,再加上远程的 git 仓库就可以分为四个工作区域,文件在这四个区域之间转换关系如下
- Working Directory:工作目录,平时存放项目代码的地方
- Stage(Index):暂存区,用于暂时存放你的改动,事实上它只是一个文件,保存即将提交的文件的列表信息。
- Repository:仓库区(也可以叫本地仓库),就是安全存放数据的位置,这里有所有版本的数据,其中 Head 指向最新放入仓库的版本。
- Remote Directory:远程仓库,用户托管代码的服务器,比如 GitHub 或者 Gitee,可以简单的认为是远程存放数据的用户。
Git 的工作流程
- 在工作目录中对文件进行修改操作
- 将需要进行版本管理的文件放入暂存区域
- 将暂存区域的文件提交到本地的 Git 仓库
由上面的三个步骤,Git 管理的文件有三种状态:已修改、已暂存和已提交
Git 仓库的创建
创建工作目录的常用指令
工作目录一般就是你希望 Git 来管理的文件夹,可以是项目的目录,可以是空目录,但注意不要有中文。
创建本地仓库
这里来演示使用一个空文件夹作为我们的本地仓库
- 在本地创建一个空目录,在目录下点击右键,选择显示更多选项
- 执行 git-init 命令,执行后会发现目录中多出了一个 .git 目录,关于版本等的信息都在这个目录里面。需要注意的是这个目录默认是隐藏的,需要打开显示隐藏的项目这个选项。
- 这样我们就在本地创建了一个仓库,并且将其交给 git 管理
克隆远程仓库
- 执行代码 git clone [url],可以将远程服务器上的仓库完全镜像复制一份到本地。
- 以 Gitee 平台为例,点击克隆即可获取 url 地址。
Git 文件管理
我们上面说的三种状态是 Git 管理的文件的状态,与这里说的文件做区分
Git 仓库下文件的四种文件状态
- Untracked:此文件在目录中,但是没有加入到 Git 库,不参与版本的控制,通过
git add
可以将它的状态变为 Staged。 - Unmodify:文件已经入库,但是没有被修改过,也就是和本库中文件的快照内容完全一致,这些文件有两种处理方式:如果他被修改就会变为 Modified,我们可以使用
git rm
将其移出版本库,这时候他就会编程 Untracked。 - Modified:文件已经修改,但还未对其执行任何 Git 的操作,这种文件也有两种去处:通过
git add
将其变为 Stage 状态,使用git checkout
从库中取出文件覆盖掉当前的修改,退回到 Unmodify。 - Stage:暂存状态,执行
git commit
将其同步到库中,这时候库中的文件和本地的文件变为一致,这些文件退回 Unmodify 状态,我们也可以使用
git reset HEAD filename
将这个文件取消暂存,文件的状态为 Modify。
文件操作指令
# 产看文件的状态,去掉文件名就是查看所有文件的状态
git status [filename]
# 添加文件到暂存区,去掉文件名就是所有文件
git add [filename]
# 提交暂存区中的内容到本地仓库
git commit -m
忽略文件
既然版本控制这么方便,为什么我们还要让一些文件被忽略呢?
我们来看一些不需要被纳入版本控制的文件,比如数据库文件、临时文件、设计文件,这些是不需要进行版本控制的,可以被忽略。
来看一下具体的实现:
- 在主目录下面创建 .gitignore,此文件的默认执行规则为:忽略文件中的空行或者 # 开始的行
- 支持 Linux 通配符,比如 * 代表任意多个字符,?代表一个字符,方括号 [abc] 标识可选的字符范围,大括号 {string1, string2, …} 表示可选的字符串
- 如果名称前面有感叹号,标识除了 xxx 以外,这个 xxx 将不会被忽略
- 如果名称前面是一个路径分隔符,表示忽略 .gitignore 文件所在的目录下的文件
对于这些我们只需要记住一些常用的,其他查看文档即可
# 忽略所有以 java 结尾的文档
*.java
# my.java 除外
!my.java
利用 Gitee 创建代码仓库
创建仓库
Gitee 官网:https://gitee.com/
注册好后我们就可以创建我们的仓库了
绑定密钥
一般来说我们开发项目都是私密项目,这时候我们执行一些操作的时候就需要登录 Gitee 来验证我们的身份,可以通过给本机绑定 SSH 公钥的操作实现免密登录。
- 打开 C:\Users\lenovo.ssh 文件,没有就手动创建该文件夹
- 检查文件夹中是否有这两个文件:
如果有的话可以先删除,通过在本文件下执行 ssh-keygen 即可(一直回车就行) - 将公钥的信息添加到 Gitee 账户,在设置中找到公钥选项
- 将 id_rsa.pub 中的信息复制到文本框即可
IDEA 集成 Git
需求
将我们刚刚创建好的仓库拉到本地的用 IDEA进行编辑
操作
- 新建文件中可以选择来自版本控制的项目
输入正确的地址,这时候就可以将代码拉取到本地了,同时我们也绑定了这个远程仓库,可以在有权向的情况下将我们的代码提交到远程仓库了。- 新建一个模块来测试 Git 的提交
这里我们使用提交就可以将代码提交到本地的仓库,其实执行的就是git commit -m
指令
如果只点击提交那就是提交到本地仓库,如果是提交并推送的话就会同时推送到远程仓库,这时候我们再去看远程仓库的界面就会发现多了这个文件
Git 分支管理
分支
在 Git 中,分支是指向 Git 仓库中某个提交对象的可变指针。每个分支都是一个引用,指向你项目中的某个提交。默认情况下,新创建的仓库会有一个主分支,通常叫做 master,指向最新的提交。你可以创建新的分支,并在这些分支上进行工作,而不影响主分支。
分支的作用
- 并行开发: 分支使得团队成员可以在不互相干扰的情况下并行工作。每个开发者都可以在自己的分支上进行修改,而不会影响到主分支或其他开发者的工作。
- 特性开发: 分支可以用来开发新的特性或功能。你可以创建一个新分支,专门用于实现某个特定的功能,而不会影响主分支上的其他代码。一旦新特性完成,你可以将其合并回主分支。
- 版本控制: 每个分支代表着项目的一个不同状态。通过创建不同的分支,你可以在不同的分支上进行不同的修改和实验,从而更好地控制项目的版本。
- Bug 修复: 如果在主分支上发现了 bug,你可以创建一个新分支来进行修复,而不会干扰正在进行的其他工作。修复完成后,可以将修复合并回主分支。
- 实验性工作: 有时候,你可能想要尝试一些实验性的修改,但不确定是否应该将其合并到主分支。通过在新分支上进行实验,你可以更轻松地决定是否保留这些修改。
分支合并
- 分支可以有多个(根据业务需求)
- 如果各分支没有交集就会始终平行发展
- 如果两个分支需要合并,就执行 merge 操作
Git 分支指令
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 列出所有本地和远程分支
git branch -a
# 新建一个分支,但仍停留在当前分支
git branch [branch-name]
# 新建一个分支,并且切换到该分支
git checkout -b [branch]
# 新建一个分支,指向指定的 commit
git branch [branch] [commit]
# 新建一个分支,与指定的远程分支建立追踪挂你先
git branch --track [branch] [remote-branch]
# 切换到指定分支并更新工作区
git checkout [branch-name]
# 切换到上一个分支
git checkout -
# 在现有的分支和远程分支之间建立追踪关系
git branch --set-upstream [branch] [remote-branch]
# 合并分支到当前分支
git merge [branch]
# 选择一个 commit,合并进当前分支
git cherry-pick [commit]
# 删除分支
git branch -d [branch]
# 删除远程分支
git push origin --delete [branch]
git branch -dr [branch]