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工作流程

32fcf2ac-acfe-4255-8aee-b57220ad7b7b

  • 本地仓库:开发人员自己电脑上的Git仓库
  • 远程仓库:远程仓库上的Git仓库

Git全局配置

  • 设置用户信息(全局配置,只配置这一次,必须配置
1
2
git config --global user.name "用户名"
git config --global user.email "用户邮箱"
  • 上面设置的user.name和user.email是用户的身份标识,必须需要设置,不然后期的命令操作不了
  • 理论上身份标识可以任意设置,建议还是设置成自己的名字,方便识别是谁提交了代码
  • 查看配置信息:
1
git config --list

Git常用命令

常见的命令主要分为三大类:

  • 本地仓库命令
  • 远程仓库命令
  • 分支命令

本地仓库命令

初始化本地仓库

要使用Git对项目代码进行版本控制,首先需要初始化一个Git仓库。可以通过如下命令操作:

  • 初始化Git仓库:git init
  • 具体操作步骤:
    1. 在任意目录下创建一个空目录
    2. 进入这个空目录,右键鼠标并选择Open Git Bash here打开命令行窗口
    3. 执行命令git init

如果在目录中看到.git文件(隐藏文件)则说明Git仓库创建仓库

本地仓库相关概念

  • 工作区:包含.git文件夹的目录就是工作区,也成为工作目录或工作空间,主要用于存放开发的代码
  • 版本库:.git隐藏文件夹就是版本库,版本库中存储了很多配置信息、日志信息和文件版本信息等
  • 暂存区:.git文件夹中有很多文件,其中有一个index文件就是暂存区,也可以叫stage。暂存区是一个临时保存修改文件的地方

常用命令

8a8d2c2e-55bb-4edc-81d3-ba13a1f5fb80

  • 查看文件状态git status
1
git status

如果是第一次创建文件且没有进行任何操作,会提示:

1
2
3
4
5
6
7
8
9
On branch master

No commits yet

Untracked files:
(use "git add <file>..." to include in what will be committed)
abc.txt

nothing added to commit but untracked files present (use "git add" to track)
  • untracked :未跟踪文件,说明当前文件还没有被git进行版本控制
  • 把新增或修改的文件添加暂存区 git add

    • git add abc.txt 把指定文件添加暂存区
    • git add * 或者 git add . 把当前目录及其子目录下的所有文件都添加暂存区

    提交成功后,再查看文件状态,就会提示:

1
2
3
4
5
6
7
On branch master

No commits yet

Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: abc.txt
  • Changes to be committed :待提交的更改内容,目前文件在暂存区,还未提交到本地仓库
  • 提交暂存区的文件到本地仓库 git commit
    • 提交一个文件:git commit -m "第一次提交abc.txt文件到本地仓库" abc.txt
    • 提交多个文件:git commit -m "第一次提交abc.txt文件到本地仓库" *
1
2
3
4
$ git commit -m "第一次提交abc.txt文件到本地仓库" abc.txt
[master (root-commit) 2d96ffd] 第一次提交abc.txt文件到本地仓库
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 abc.txt

-m选项指定了提交信息(必须携带,需要知道这次提交的说明是什么,要尽可能简洁)

​ 提交到本地仓库成功后,再查看文件状态,就会提示:

1
2
On branch master
nothing to commit, working tree clean

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
2
3
4
5
6
7
8
9
10
11
12
13
14
.git
logs
rebel.xml
target/
!.mvn/wrapper/maven-wrapper.jar
log.path_IS_UNDEFINED
.DS_Store
offline_user.md
*.class

### IntelliJ IDEA ###
.idea
*.iws
*.ipr

项目中需要忽略的文件一般都是固定的,通常直接复制以上内容并进行适当修改即可

命令总结

操作 命令 说明
查看文件状态 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 <版本号> 将当前分支恢复到指定版本,工作区内容也会同步更新

远程仓库命令

远程仓库介绍

aa455435-52c6-400b-a1a2-734723b9ad63

远程仓库的基本使用都是相同的,所以选择哪个远程仓库并不是重点

Gitee操作流程:⁠‍‌‍‍‌‬‍⁠‌‌‬‌‌‌‌‬第2章-项目前置课-代码版本控制Git - 飞书云文档

Snipaste_2025-08-28_17-57-38

Snipaste_2025-08-28_17-59-38

这里的仓库地址后面提交项目时会用到

常用命令

  1. 添加关联的远程仓库:git remote add <shortname> <url>

    • shortname:远程仓库的**别名**,统一叫做origin
    • url:远程仓库的地址
  2. 查看关联的远程仓库:git remote [-v]

    • 如果要查看已经配置的远程仓库服务器,可以执行git remote命令,它会列出每一个远程服务器的简称
    • 如果已经关联了远程仓库,那么至少应该能看到origin,这是Git克隆的仓库服务器的默认名字
    • 本地仓库配置的远程仓库都需要一个简称,后续在和远程仓库交互时会使用到这个简称
    • 可以通过-v选项查看远程仓库更详细的信息
  3. 移除关联的远程仓库:git remote remove <shortname>

    • 删除关联的远程仓库
  4. 往远程仓库推送:git push <shortname> <branch>

    • 当关联到远程仓库后,就可以把本地仓库的代码或文件提交到远程仓库中
    • 注意,git push只能推送已经被submit过的代码或文件
    • 关于<branch>,意思是分支,后续内容会提到
    • 在使用git push命令将本地仓库的文件推送至远程仓库时,如果是第一次操作,需要进行**身份认证**,认证通过才可以推送
  5. 从远程仓库克隆:git clone <url>

    • 克隆成功后,可以在目录中看到一个隐藏的文件夹.git和远程仓库中的所有文件
    • Git克隆的是该Git仓库服务器上的几乎所有数据(包括文件日志信息历史记录等),而且克隆之后,该本地仓库就自动关联该远程仓库
  6. 从远程仓库拉取:git pull <shortname> <branch>

    • git pull的作用是从远程仓库获取最新版本并合并到本地仓库
    • 注意:如果当前仓库不是从远程仓库克隆的,而是本地创建的仓库,并且仓库中存在新文件,此时再从远程仓库拉取文件的时候会报错(fatal:refusing to merge unrelated histories)。可以在git pull命令后加入参数--allow-unrelated-histories

分支及命令

分支概念

  • 分支是Git中一个非常重要的概念。使用分支意味着开发人员可以把工作从开发主线上分离开来,**以免影响开发主线**
  • 同一个仓库可以有多个分支,各个分支相互独立,互不干扰
  • 通过git init命令创建本地仓库时默认会创建一个master分支

2256cbcb-c0c1-48dc-a326-25bf981f0d46

HEAD是一个特殊的引用(reference),它指向当前分支的最新提交(commit)。HEAD标识了当前分支中工作的挤出点,即你最近一次提交的地方

关键步骤流程如下:

  1. 创建分支:从主分支(如master)出发,创建一个新的分支(如v1)。这允许开发者在新的分支上自由地进行代码修改,而不必担心这些修改会立即影响到主分支或其他团队成员的工作
  2. 独立开发:在v1分支上,开发者可以自由地编写代码、测试功能,甚至进行多次提交,所有这些操作都独立于主分支
  3. 合并开发:当v1分支上的开发完成后,开发者可以选择将v1分支的更改合并回主分支。这确保了主分支能够包含所有最新的功能和修复,同时保持了代码的整洁和一致性
  4. 灵活管理:Git的分支机制还允许开发者在需要时轻松地切换分支,比如从v1分支切换到master分支查看或处理其他事务,然后再切换回v1分支继续工作(HEAD的作用)

常见命令

常见的分支操作命令有:

  1. 查询分支
  2. 创建分支
  3. 切换分支
  4. 将分支推送到远程仓库
  5. 合并分支

查询分支

  • git branch:列出所有本地分支
  • git branch -r:列出所有远程分支
  • git branch -a:列出所有本地分支和远程分支

创建分支

  • 创建分支命令格式:git branch 分支名称

Snipaste_2025-08-29_11-38-03

切换分支

一个仓库中可以有多个分支,切换分支命令格式:git checkout 分支名称

推送分支

将本地分支推送到远程仓库中,命令格式:git push <shortname> 分支名称

推送完成后,可以在远程仓库中查看分支是否成功推送:

Snipaste_2025-08-29_11-41-11

合并分支

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

a573b71a-d752-4548-9ee1-4d7a50436b6f

查看master分支的本地仓库中,也出现了b1分支中添加的b1.txt文件

注意:分支合并时需注意合并的方向,如上图所示,在master分支执行操作,结果就是将b1分支合并到master分支。

分支创建规则

在项目开发中,遵守Git分支的创建规则通常是为了提高团队协作效率、代码质量以及版本管理的清晰度。以下是一些常见的Git分支创建规则:

  1. 主分支(master)

主分支是项目的稳定版本,用于发布和部署,只有经过严格测试和代码审核的代码才能被合并到主分支,通常命名为master,master分支以tag标记一个版本,因此master分支上看到的每一个tag都应该对应线上版本

  1. 开发分支(develop/dev)

开发分支是团队进行日常开发的主要分支,包含了项目中最新的功能和代码,通常命名为developdev,每个新功能或任务通常从该分支创建独立的特性分支进行开发

  1. 特性分支(feature)

特性分支用于开发特定的功能,每个新功能或任务都应在develop分支创建feature/xxx形式的特性分支上进行开发和测试,开发完成后合并会develop分支并且删除该feature/xxx分支

  1. 预发布分支(release)

预发布分支用于准备发布新版本,进行最后的测试和调整,develop分支创建以确保代码稳定,命名格式为release/xxx,其中xxx是具体的版本号,创建好release分支后需要对要发布的功能进行最后的测试,如果测试过程中若存在bug需要修复,则直接由开发者在release分支修复并提交。测试完成之后,将release分支合并到masterdevelop分支,此时master为最新代码,用作上线

  1. 修复分支(hotfix/bugfix)

修复分支用于解决线上紧急bug或修复已知问题,master分支创建以确保修复代码直接应用于稳定版本,命名格式为hotfix/xxxbugfix/xxx,完成bug修复后将代码合并到master分支和develop分支,合并完成后可以删除该分支

以上就是在项目中应该出现的分支以及每个分支功能的说明,其中长期稳定存在的分支只有 master 和 develop 分支,别的分支在完成对应的使命之后都会合并到这两个分支然后被删除。简单总结如下:

master 分支: 线上稳定版本分支

develop 分支: 开发分支,衍生出 feature 分支和 release 分支

feature 分支: 功能分支,完成特定功能开发的分支,存在多个,功能合并之后删除

release 分支: 预发布分支,准备待发布版本的分支,存在多个,版本发布之后删除

hotfix 分支: 紧急热修复分支,存在多个,紧急版本发布之后删除

whiteboard_exported_image

版本冲突与解决

冲突产生的情况

  • 多人同时修改同一文件:一个项目是由一个团队开发,如果多个开发人员同时对同一个文件的相同部分进行修改,并尝试提交这些修改时,Git无法自动合并这些更改,从而导致冲突。
  • 合并分支时:当尝试将两个不同的分支合并到一个公共分支(如主分支)或者尝试将其他分支的代码合并到当前分支时,如果这些分支对同一个文件进行了不同的修改,Git在合并这些更改时可能会产生冲突。
  • 重命名或移动文件:如果在一个分支中重命名或移动了文件,而在另一个分支中对原始文件进行了修改,那么在合并这些分支时可能会产生冲突。
  • 删除文件:如果一个分支删除了某个文件,而另一个分支对该文件进行了修改,合并时也会发生冲突。

解决冲突

解决Git冲突通常需要手动干预,为了更好的演示冲突的问题,咱们可以手动制造一个冲突

  • 在master分支中,对abc.txt文件进行修改,在第2行添加内容,然后add commit
  • 切换到b1分支中,对abc.txt文件进行修改,在第2行添加内容(与master不同),然后add commit
  • 执行合并分支的命令:git merge master (从master分支合并到b1分支),冲突就会产生

c400adc7-1d3b-47db-87e6-09796f96b127

以下是一些常用的解决冲突步骤:

  1. 查看冲突:
    • 使用git status命令查看哪些文件存在冲突
    • 使用git diff命令查看冲突文件的差异

aed33427-590d-4a4a-b523-a6fe0b137d09

  1. 手动解决冲突:

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

    84a22156-2462-442f-a99e-fd3f082dc8bb

    • 手动编辑冲突部分,根据需要保留或合并不同的更改

    • 删除Git的冲突标记(<<<<<<<=======>>>>>>>

a895ac34-3406-497b-9eaa-32623c48548e

  1. 标记冲突已解决:
    • 使用git add命令将解决冲突后的文件添加到暂存区,标记为冲突已解决
  2. 提交更改:
    • 使用git commit命令提交解决冲突后的更改。在提交信息中,可以简要描述解决冲突的过程
    • git commit -a -m '解决冲突' 全部提交
    • git commit abc.txt -i -m "解决冲突" 提交部分文件
  3. (可选)继续合并或推送:
    • 如果是在合并分支时产生的冲突,解决冲突后可以继续合并其他分支
    • 如果需要,将更改推送到远程仓库

解决冲突时,需仔细分析原因和上下文,确保选择正确方案。为减少冲突,建议保持良好沟通和协作,避免同时修改同一文件的同一个位置,频繁提交代码和定期合并分支也有助于及时发现和解决冲突

日常开发常见命令总结

200cbb55-5d3c-4f84-bd79-a194a34f2618

命令使用流程

  1. 进入项目团队先找直属领导开通远程仓库Git账号
  2. 使用git clone命令克隆远程仓库的代码到本地的工作空间(首次使用,仅需一次)
  3. 编写完代码后,使用git add命令添加暂存区
  4. 使用git commit命令提交到本地仓库
  5. 使用git pull命令拉取最新的代码,如有冲突需沟通解决
  6. 使用git push推送到远程仓库
  7. 不断重复3-6步

IDEA集成Git

本地初始化仓库

在IDEA中通过如下操作可以在本地初始化一个本地仓库,其实底层就是执行了git init命令。操作过程如下:

Snipaste_2025-08-29_13-07-55

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

Snipaste_2025-08-29_13-32-29

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

Snipaste_2025-08-29_13-35-01

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

远程克隆仓库

Snipaste_2025-08-29_13-39-14

Snipaste_2025-08-29_13-40-59

本地仓库操作

将文件加入缓存区

Snipaste_2025-08-29_13-47-46

也可以右键单个文件或文件夹,用于将指定的文件或文件夹添加到缓存区

成功被添加到缓存区的文件名称会变为绿色

将缓存区的文件提交到版本库

Snipaste_2025-08-29_13-53-35

同样的,也可以对单个文件进行提交,不过选项会变为Git > Commit File

点击后打开提交栏:

Snipaste_2025-08-29_13-55-29

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

Snipaste_2025-08-29_14-02-16

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

查看日志信息

Snipaste_2025-08-29_14-08-55

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

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

0cdb9941-9f10-4eb0-92d9-ffa6744b9a1e

远程仓库操作

远程仓库操作:

  • 查看远程仓库,本质就是执行 git remote 命令
  • 添加远程仓库,本质就是执行 git remote add 命令
  • 推送至远程仓库,本质就是执行 git push 命令
  • 从远程仓库拉取,本质就是执行 git pull 命令

查看和添加远程仓库

右键项目,找到【Git】–>【Manage Remotes…】

Snipaste_2025-08-29_14-14-57

添加远程仓库地址:

Snipaste_2025-08-29_14-16-46

推送本地仓库至远程仓库

Snipaste_2025-08-29_14-24-58

Snipaste_2025-08-29_14-29-24

Snipaste_2025-08-29_14-29-57

从远程仓库拉取代码

Snipaste_2025-08-29_14-33-42

Snipaste_2025-08-29_14-34-42

分支操作

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

创建分支

Snipaste_2025-08-29_14-39-00

Snipaste_2025-08-29_14-41-37

创建完后的效果:

Snipaste_2025-08-29_14-43-22

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

切换分支

Snipaste_2025-08-29_14-45-03

推送分支

Snipaste_2025-08-29_14-46-22

合并分支

Snipaste_2025-08-29_14-47-05

合并分支时,选择其他分支然后再点击Merge xxx into xxx,表示将其他分支合并到当前分支

解决冲突

在IDEA中产生冲突后,可以通过图形界面查看和解决,下图是产生冲突之后的效果展示:

8d952752-a140-4a8c-8023-942d934601eb

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

点击Merge按钮:

563c60f2-4df1-4d41-83a0-0ee0a0d17043