代码版本控制-Git
Git概述
Git是一个分布式版本控制工具,主要用于管理开发过程中的源代码文件(Java文件、yml文件、xml文件等),在软件开发过程中被广泛使用
核心作用如下:
- 远程备份: Git允许你将代码库备份到远程服务器,以防止数据丢失。常见的远程备份方式包括使用GitHub、GitLab、Gitee等代码托管服务
- 多人协作: Git允许多个开发者在同一个代码库上协同工作。开发者可以共享代码、合并变更、解决冲突等
- 代码回溯: 代码回溯是指在Git中返回到先前的代码状态或版本。对于修复错误或者恢复不小心删除的代码非常有用
- 版本切换: 在Git中,你可以通过切换分支或检出不同的提交来切换代码的版本。
Git安装
官网下载地址:Git - Downloading Package
Windows系统中使用Git-版本号-64-bit.exe这个应用程序用于安装Git,并且安装中不建议切换默认的安装路径(Git本体很小,且便于IDEA扫描Git所在位置)
安装完成后在任意目录点击鼠标右键,点击Open Git Bash here即可通过命令行打开Git
Git工作流程

- 本地仓库:开发人员自己电脑上的Git仓库
- 远程仓库:远程仓库上的Git仓库
Git全局配置
- 设置用户信息(全局配置,只配置这一次,必须配置)
1 | git config --global user.name "用户名" |
- 上面设置的user.name和user.email是用户的身份标识,必须需要设置,不然后期的命令操作不了
- 理论上身份标识可以任意设置,建议还是设置成自己的名字,方便识别是谁提交了代码
- 查看配置信息:
1 | git config --list |
Git常用命令
常见的命令主要分为三大类:
- 本地仓库命令
- 远程仓库命令
- 分支命令
本地仓库命令
初始化本地仓库
要使用Git对项目代码进行版本控制,首先需要初始化一个Git仓库。可以通过如下命令操作:
- 初始化Git仓库:
git init - 具体操作步骤:
- 在任意目录下创建一个空目录
- 进入这个空目录,右键鼠标并选择
Open Git Bash here打开命令行窗口 - 执行命令
git init
如果在目录中看到.git文件(隐藏文件)则说明Git仓库创建仓库
本地仓库相关概念
- 工作区:包含
.git文件夹的目录就是工作区,也成为工作目录或工作空间,主要用于存放开发的代码 - 版本库:
.git隐藏文件夹就是版本库,版本库中存储了很多配置信息、日志信息和文件版本信息等 - 暂存区:
.git文件夹中有很多文件,其中有一个index文件就是暂存区,也可以叫stage。暂存区是一个临时保存修改文件的地方
常用命令

- 查看文件状态
git status:
1 | git status |
如果是第一次创建文件且没有进行任何操作,会提示:
1 | On branch master |
- untracked :未跟踪文件,说明当前文件还没有被git进行版本控制
把新增或修改的文件添加暂存区
git add:git add abc.txt把指定文件添加暂存区git add *或者git add .把当前目录及其子目录下的所有文件都添加暂存区
提交成功后,再查看文件状态,就会提示:
1 | On branch master |
- Changes to be committed :待提交的更改内容,目前文件在暂存区,还未提交到本地仓库
- 提交暂存区的文件到本地仓库
git commit:- 提交一个文件:
git commit -m "第一次提交abc.txt文件到本地仓库" abc.txt - 提交多个文件:
git commit -m "第一次提交abc.txt文件到本地仓库" *
- 提交一个文件:
1 | $ git commit -m "第一次提交abc.txt文件到本地仓库" abc.txt |
-m选项指定了提交信息(必须携带,需要知道这次提交的说明是什么,要尽可能简洁)
提交到本地仓库成功后,再查看文件状态,就会提示:
1 | On branch master |
nothing to commit, working tree clean:没有需要提交的更改,工作目录是干净的(提交完成的效果)
查看详细的提交日志
git log查看简洁的日志:
git reflog将暂存区取消暂存或切换到指定版本:
git reset将暂存区文件取消暂存
- 再本地仓库中新建一个
123.txt文件,然后执行命令git add将他提交到暂存区,可以使用git reset取消暂存
- 再本地仓库中新建一个
切换到指定版本
- 可以先把abc.txt文件添加点内容,并且可以多提交几次到本地仓库,比如下面对abc.txt文件进行了三次提交
1
2
3- 第一次提交内容为空
- 第二次提交内容为:11111111
- 第三次提交内容为:22222222- 查看历史版本,执行
git log,其中commit xxxxxxxxx这一行很长的一串就是唯一版本号
1
commit 2d96ffde80c6a913823637839063be1f97cc3dda
- 将abc.txt恢复到某一个指定版本:
1
git reset --hard 2d96ffde80c6a913823637839063be1f97cc3dda
- 上面这条命令,
--hard是指提交日志中的唯一版本号,执行成功后文件就会恢复到某个指定版本
忽略文件
- 忽略文件:项目代码中不需要纳入版本控制系统的文件,通常是一些**编译文件**和临时的缓存文件,把它们纳入版本控制系统中毫无意义
- 忽略文件列表被存放在项目根目录中一个被称为**.gitignore**的文件中
- 忽略文件规则:
- 忽略一个特定的文件:
path/file.ext - 忽略项目下所有这个名字的文件:
filename.ext - 忽略项目下所有这个类型的文件:
*.class - 忽略一个特定目录下的所有文件:
target/*
- 忽略一个特定的文件:
- 示例:
1 | .git |
项目中需要忽略的文件一般都是固定的,通常直接复制以上内容并进行适当修改即可
命令总结
| 操作 | 命令 | 说明 |
|---|---|---|
| 查看文件状态 | git status |
显示工作区和暂存区的状态,包括未跟踪、已修改、已暂存等文件 |
| 添加文件到暂存区 | git add <file> |
将指定文件添加到暂存区 |
| 添加所有文件到暂存区 | git add . 或 git add * |
将当前目录及其子目录下的所有文件添加到暂存区 |
| 提交文件到本地仓库 | git commit -m "提交信息" <file> |
将暂存区的文件提交到本地仓库,并附带提交说明 |
| 提交所有暂存文件 | git commit -m "提交信息" * |
提交所有暂存区中的文件到本地仓库 |
| 查看详细提交日志 | git log |
显示详细的提交历史记录,包括提交人、时间、信息和版本号 |
| 查看简洁提交日志 | git reflog |
显示简洁的提交历史记录,便于快速查看操作历史 |
| 取消暂存或切换版本 | git reset <选项> <版本号> |
可用于取消暂存文件或将代码恢复到指定版本 |
| 取消暂存文件 | git reset |
将暂存区的文件移出暂存区,但保留工作区的更改 |
| 切换到指定版本 | git reset --hard <版本号> |
将当前分支恢复到指定版本,工作区内容也会同步更新 |
远程仓库命令
远程仓库介绍

远程仓库的基本使用都是相同的,所以选择哪个远程仓库并不是重点
Gitee操作流程:第2章-项目前置课-代码版本控制Git - 飞书云文档


这里的仓库地址后面提交项目时会用到
常用命令
添加关联的远程仓库:
git remote add <shortname> <url>- shortname:远程仓库的**别名**,统一叫做
origin - url:远程仓库的地址
- shortname:远程仓库的**别名**,统一叫做
查看关联的远程仓库:
git remote [-v]- 如果要查看已经配置的远程仓库服务器,可以执行
git remote命令,它会列出每一个远程服务器的简称 - 如果已经关联了远程仓库,那么至少应该能看到origin,这是Git克隆的仓库服务器的默认名字
- 本地仓库配置的远程仓库都需要一个简称,后续在和远程仓库交互时会使用到这个简称
- 可以通过
-v选项查看远程仓库更详细的信息
- 如果要查看已经配置的远程仓库服务器,可以执行
移除关联的远程仓库:
git remote remove <shortname>- 删除关联的远程仓库
往远程仓库推送:
git push <shortname> <branch>- 当关联到远程仓库后,就可以把本地仓库的代码或文件提交到远程仓库中
- 注意,
git push只能推送已经被submit过的代码或文件 - 关于
<branch>,意思是分支,后续内容会提到 - 在使用
git push命令将本地仓库的文件推送至远程仓库时,如果是第一次操作,需要进行**身份认证**,认证通过才可以推送
从远程仓库克隆:
git clone <url>- 克隆成功后,可以在目录中看到一个隐藏的文件夹
.git和远程仓库中的所有文件 - Git克隆的是该Git仓库服务器上的几乎所有数据(包括文件、日志信息、历史记录等),而且克隆之后,该本地仓库就自动关联该远程仓库
- 克隆成功后,可以在目录中看到一个隐藏的文件夹
从远程仓库拉取:
git pull <shortname> <branch>- git pull的作用是从远程仓库获取最新版本并合并到本地仓库
- 注意:如果当前仓库不是从远程仓库克隆的,而是本地创建的仓库,并且仓库中存在新文件,此时再从远程仓库拉取文件的时候会报错(fatal:refusing to merge unrelated histories)。可以在
git pull命令后加入参数--allow-unrelated-histories
分支及命令
分支概念
- 分支是Git中一个非常重要的概念。使用分支意味着开发人员可以把工作从开发主线上分离开来,**以免影响开发主线**
- 同一个仓库可以有多个分支,各个分支相互独立,互不干扰
- 通过
git init命令创建本地仓库时默认会创建一个master分支

HEAD是一个特殊的引用(reference),它指向当前分支的最新提交(commit)。HEAD标识了当前分支中工作的挤出点,即你最近一次提交的地方
关键步骤流程如下:
- 创建分支:从主分支(如master)出发,创建一个新的分支(如v1)。这允许开发者在新的分支上自由地进行代码修改,而不必担心这些修改会立即影响到主分支或其他团队成员的工作
- 独立开发:在v1分支上,开发者可以自由地编写代码、测试功能,甚至进行多次提交,所有这些操作都独立于主分支
- 合并开发:当v1分支上的开发完成后,开发者可以选择将v1分支的更改合并回主分支。这确保了主分支能够包含所有最新的功能和修复,同时保持了代码的整洁和一致性
- 灵活管理:Git的分支机制还允许开发者在需要时轻松地切换分支,比如从v1分支切换到master分支查看或处理其他事务,然后再切换回v1分支继续工作(HEAD的作用)
常见命令
常见的分支操作命令有:
- 查询分支
- 创建分支
- 切换分支
- 将分支推送到远程仓库
- 合并分支
查询分支
git branch:列出所有本地分支git branch -r:列出所有远程分支git branch -a:列出所有本地分支和远程分支
创建分支
- 创建分支命令格式:
git branch 分支名称

切换分支
一个仓库中可以有多个分支,切换分支命令格式:git checkout 分支名称
推送分支
将本地分支推送到远程仓库中,命令格式:git push <shortname> 分支名称
推送完成后,可以在远程仓库中查看分支是否成功推送:

合并分支
合并分支就是将两个分支的文件进行合并处理,命令格式:git merge 分支命令

查看master分支的本地仓库中,也出现了b1分支中添加的b1.txt文件
注意:分支合并时需注意合并的方向,如上图所示,在master分支执行操作,结果就是将b1分支合并到master分支。
分支创建规则
在项目开发中,遵守Git分支的创建规则通常是为了提高团队协作效率、代码质量以及版本管理的清晰度。以下是一些常见的Git分支创建规则:
- 主分支(master)
主分支是项目的稳定版本,用于发布和部署,只有经过严格测试和代码审核的代码才能被合并到主分支,通常命名为master,master分支以tag标记一个版本,因此master分支上看到的每一个tag都应该对应线上版本
- 开发分支(develop/dev)
开发分支是团队进行日常开发的主要分支,包含了项目中最新的功能和代码,通常命名为develop或dev,每个新功能或任务通常从该分支创建独立的特性分支进行开发
- 特性分支(feature)
特性分支用于开发特定的功能,每个新功能或任务都应在从develop分支创建的feature/xxx形式的特性分支上进行开发和测试,开发完成后合并会develop分支并且删除该feature/xxx分支
- 预发布分支(release)
预发布分支用于准备发布新版本,进行最后的测试和调整,从develop分支创建以确保代码稳定,命名格式为release/xxx,其中xxx是具体的版本号,创建好release分支后需要对要发布的功能进行最后的测试,如果测试过程中若存在bug需要修复,则直接由开发者在release分支修复并提交。测试完成之后,将release分支合并到master和develop分支,此时master为最新代码,用作上线
- 修复分支(hotfix/bugfix)
修复分支用于解决线上紧急bug或修复已知问题,从master分支创建以确保修复代码直接应用于稳定版本,命名格式为hotfix/xxx或bugfix/xxx,完成bug修复后将代码合并到master分支和develop分支,合并完成后可以删除该分支
以上就是在项目中应该出现的分支以及每个分支功能的说明,其中长期稳定存在的分支只有 master 和 develop 分支,别的分支在完成对应的使命之后都会合并到这两个分支然后被删除。简单总结如下:
master 分支: 线上稳定版本分支
develop 分支: 开发分支,衍生出 feature 分支和 release 分支
feature 分支: 功能分支,完成特定功能开发的分支,存在多个,功能合并之后删除
release 分支: 预发布分支,准备待发布版本的分支,存在多个,版本发布之后删除
hotfix 分支: 紧急热修复分支,存在多个,紧急版本发布之后删除

版本冲突与解决
冲突产生的情况
- 多人同时修改同一文件:一个项目是由一个团队开发,如果多个开发人员同时对同一个文件的相同部分进行修改,并尝试提交这些修改时,Git无法自动合并这些更改,从而导致冲突。
- 合并分支时:当尝试将两个不同的分支合并到一个公共分支(如主分支)或者尝试将其他分支的代码合并到当前分支时,如果这些分支对同一个文件进行了不同的修改,Git在合并这些更改时可能会产生冲突。
- 重命名或移动文件:如果在一个分支中重命名或移动了文件,而在另一个分支中对原始文件进行了修改,那么在合并这些分支时可能会产生冲突。
- 删除文件:如果一个分支删除了某个文件,而另一个分支对该文件进行了修改,合并时也会发生冲突。
解决冲突
解决Git冲突通常需要手动干预,为了更好的演示冲突的问题,咱们可以手动制造一个冲突
- 在master分支中,对abc.txt文件进行修改,在第2行添加内容,然后add commit
- 切换到b1分支中,对abc.txt文件进行修改,在第2行添加内容(与master不同),然后add commit
- 执行合并分支的命令:git merge master (从master分支合并到b1分支),冲突就会产生

以下是一些常用的解决冲突步骤:
- 查看冲突:
- 使用
git status命令查看哪些文件存在冲突 - 使用
git diff命令查看冲突文件的差异
- 使用

手动解决冲突:
- 打开冲突文件,找到被Git标记的冲突部分。通常,Git会用
<<<<<<<、=======和>>>>>>>这样的标记来指示冲突的开始、当前分支的更改、另一个分支的更改和冲突的结束

手动编辑冲突部分,根据需要保留或合并不同的更改
删除Git的冲突标记(
<<<<<<<、=======、>>>>>>>)
- 打开冲突文件,找到被Git标记的冲突部分。通常,Git会用

- 标记冲突已解决:
- 使用
git add命令将解决冲突后的文件添加到暂存区,标记为冲突已解决
- 使用
- 提交更改:
- 使用
git commit命令提交解决冲突后的更改。在提交信息中,可以简要描述解决冲突的过程 git commit -a -m '解决冲突'全部提交git commit abc.txt -i -m "解决冲突"提交部分文件
- 使用
- (可选)继续合并或推送:
- 如果是在合并分支时产生的冲突,解决冲突后可以继续合并其他分支
- 如果需要,将更改推送到远程仓库
解决冲突时,需仔细分析原因和上下文,确保选择正确方案。为减少冲突,建议保持良好沟通和协作,避免同时修改同一文件的同一个位置,频繁提交代码和定期合并分支也有助于及时发现和解决冲突
日常开发常见命令总结

命令使用流程
- 进入项目团队先找直属领导开通远程仓库Git账号
- 使用git clone命令克隆远程仓库的代码到本地的工作空间(首次使用,仅需一次)
- 编写完代码后,使用git add命令添加暂存区
- 使用git commit命令提交到本地仓库
- 使用git pull命令拉取最新的代码,如有冲突需沟通解决
- 使用git push推送到远程仓库
- 不断重复3-6步
IDEA集成Git
本地初始化仓库
在IDEA中通过如下操作可以在本地初始化一个本地仓库,其实底层就是执行了git init命令。操作过程如下:

如果IDEA没有检测到Git,可以在设置中指定Git的可执行文件:

初始化完毕后,如果项目中的文件颜色发生改变,并且version control变为了master就标识初始化成功:

虽然初始化成功了,但是在IDEA中无法直接看到
.git文件,可以进入资源管理器中查看
远程克隆仓库


本地仓库操作
将文件加入缓存区

也可以右键单个文件或文件夹,用于将指定的文件或文件夹添加到缓存区
成功被添加到缓存区的文件名称会变为绿色
将缓存区的文件提交到版本库

同样的,也可以对单个文件进行提交,不过选项会变为
Git > Commit File
点击后打开提交栏:

也可以通过IDEA的工具类打开提交栏:

在IDEA中,如果对文件进行过add后,当修改这个文件后,在提交栏中选择这个文件就可以点击
commit按钮了,底层会自动执行add>commit这个流程
查看日志信息

右键项目时,查看的是整个项目的提交日志
右键文件时,查看的是具体文件的提交日志

远程仓库操作
远程仓库操作:
- 查看远程仓库,本质就是执行 git remote 命令
- 添加远程仓库,本质就是执行 git remote add 命令
- 推送至远程仓库,本质就是执行 git push 命令
- 从远程仓库拉取,本质就是执行 git pull 命令
查看和添加远程仓库
右键项目,找到【Git】–>【Manage Remotes…】

添加远程仓库地址:

推送本地仓库至远程仓库



从远程仓库拉取代码


分支操作
- 查看分支,本质就是执行
git branch命令 - 创建分支,本质就是执行
git branch 分支名命令 - 切换分支,本质就是执行
git checkout命令 - 将分支推送到远程仓库,本质就是执行
git push命令 - 合并分支,本质就是执行
git merge命令
创建分支


创建完后的效果:

前面有书签符号的分支就是当前所在的分支
切换分支

推送分支

合并分支

合并分支时,选择其他分支然后再点击
Merge xxx into xxx,表示将其他分支合并到当前分支
解决冲突
在IDEA中产生冲突后,可以通过图形界面查看和解决,下图是产生冲突之后的效果展示:

- accept yours:这意味着在解决冲突时,你选择了保留你自己的更改,而忽略了他人的更改。换句话说,你决定使用你自己的代码版本,而不是合并其他人的更改。
- accept theirs:这与”accept yours”相反,意味着你选择了接受他人的更改,而忽略了你自己的更改。在这个选项下,你决定采用他人的代码版本,而不是你自己的。
- merge:这通常意味着你尝试手动解决冲突,将你和他人的更改结合起来。需要打开代码文件查看代码的不同部分,决定哪些更改应该保留,哪些应该丢弃,或者可能需要编写新的代码来融合两个版本。(推荐使用)
点击Merge按钮:
