【分布式版本控制系统】Git的使用

发布于:2025-07-29 ⋅ 阅读:(22) ⋅ 点赞:(0)

一.什么是Git

1. 什么是 Git

Git 是目前世界上最流行的分布式版本控制系统。它能够记录项目文件的历史版本,支持多人协作开发,并且因为其分布式架构而在速度、安全性和灵活性方面具有显著优势。

Git的特点:

  • 分布式:每台电脑上都是一个完整的仓库,支持离线操作。
  • 轻量高效:提交、分支和合并的速度非常快。
  • 数据安全:采用 SHA-1 哈希算法保证数据不可篡改。
  • 强大的分支管理:分支创建、切换和合并非常高效。

分布式和集中式:
集中式代表工具:SVN(Subversion)、CVS、Perforce

特点

  • 只有一个中央服务器存储完整代码版本,开发者通过客户端连接到服务器获取最新版本。
  • 提交时必须联网,中央服务器宕机会影响所有人
  • 版本历史记录集中存储在服务器,客户端一般只保存当前版本。

2. Git 的安装

Windows

  1. 前往 Git 官方下载地址
  2. 下载 Git for Windows 安装包,默认选项安装即可。
  3. 安装完成后,打开 Git Bash,输入:
git --version

Centos

sudo yum -y install git

Ubuntu

sudo apt-get install git -y

二.Git的基本操作

1. 常用命令

命令 说明
git config --global user.name "你的名字" 配置全局用户名
git config --global user.email "你的邮箱" 配置全局邮箱
git config --list 查看所有 Git 配置信息
git init 初始化本地 Git 仓库
git clone <url> 克隆远程仓库到本地
git status 查看当前工作区状态
git add <file> 添加文件到暂存区
git add . 添加当前目录下的所有改动
git commit -m "说明" 提交暂存区改动
git log 查看提交历史
git log --oneline 单行显示历史提交
git log --graph --oneline --all --decorate 图形化显示分支和提交历史
git branch 查看本地分支
git branch <branch> 创建新分支
git checkout <branch> 切换到指定分支
git checkout -b <branch> 创建并切换到新分支
git merge <branch> 合并分支到当前分支
git branch -d <branch> 删除本地分支
git remote -v 查看远程仓库地址
git remote add origin <url> 添加远程仓库
git push -u origin <branch> 推送本地分支并设置上游
git push origin <branch> 推送指定分支到远端
git pull origin <branch> 拉取远程更新并合并
git fetch 获取远程更新但不合并
git checkout -- <file> 撤销工作区修改
git reset HEAD <file> 取消暂存区文件
git reset --hard <commit-id> 回退到某个提交
git revert <commit-id> 生成一个新提交撤销某次提交
git stash 暂存当前修改
git stash pop 应用并移除最新暂存
git tag <tag> 创建轻量标签
git tag -a <tag> -m "说明" 创建带信息的标签
git push origin <tag> 推送标签到远端
git push origin --delete <branch> 删除远程分支

2. 基本操作

2.1.创建Git本地仓库

首先在一个文件目录下执行git init语句用于创建一个Git本地仓库:
在这里插入图片描述
其中.git目录就是用来管理仓库的,我们不要随意改动其内容。

2.2.配置用户信息

安装完Git之后,紧接着就是配置一下用户名和邮箱信息:

git config [--global] user.name "Your Name" 
git config [--global] user.email "email@example.com"

如果加上全局参数--global表示将名称和邮箱设置成全局的,否则只在当前仓库设置
我们可以使用git config -l查看当前仓库的配置:
在这里插入图片描述

2.3.工作区、暂存区和版本库

在 Git 的版本控制流程中,文件会依次经过 工作区暂存区版本库 三个关键阶段。如图所示:
在这里插入图片描述

  • 工作区就是项目所在的目录,包含你可以直接编辑、添加、删除的文件。
  • 工作区中的文件有两类:
    • 未跟踪:从未被 Git 管理的新文件。
    • 已跟踪:之前提交过,Git 会持续跟踪其状态。

常用命令:

git status      # 查看工作区文件状态
git diff        # 查看工作区与暂存区的差异

暂存区
暂存区是一个中间缓存层,Git 会将 git add 的文件快照存放在这里。

可以将它理解为提交候选区,只有加入到暂存区的文件才会被提交到版本库。

git add <file>  # 将文件添加到暂存区
git diff --cached  # 查看暂存区与版本库的差异

版本库
版本库就是 Git 的 本地数据库,位于 .git 目录下。

使用 git commit 后,Git 会将暂存区的快照永久存储到版本库,并生成一个提交记录用commit id标识。版本库记录了项目的所有历史版本,方便随时回滚或查看历史。

[工作区] -- git add --> [暂存区] -- git commit --> [版本库]

下面我们来介绍一下版本库中的对象库(Object Store)

  • Git 的所有数据都存放在 .git/objects 目录中。
  • 对象库是一个基于键值对的数据库: SHA-1 哈希值(40 位十六进制字符串)来标识和检索对象,确保内容不可篡改。
  • 对象文件会被分为子目录存放:
    例如哈希值 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
    将存放在 .git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

2.3.1 Git 的四类对象

Git 使用四种基本对象来构建整个版本历史:

(1) Blob 对象
  • 用于存储文件内容。
  • 仅保存文件数据,不包含文件名、权限等信息。
  • 每个文件版本都会对应一个唯一的 blob 对象。
(2) Tree 对象
  • 存储 目录结构和文件名
  • 类似于 Linux 文件系统的树结构。
  • 记录文件名、文件模式(权限)以及对应的 blob 对象哈希。
(3) Commit 对象
  • 记录一次提交的信息,包括:
    • 提交者、提交时间
    • 提交说明
    • 指向一个 tree 对象(即提交时的目录快照)
    • 指向父 commit(形成提交历史链条)
(4) Tag 对象
  • 为某个 commit 添加 可读性更强的标签
  • 分为 轻量标签附注标签

2.3.2. 数据组织流程

当执行 git commit 时,Git 会:

  1. 为工作区文件创建 blob 对象(文件内容)。
  2. 生成 tree 对象(记录文件名与 blob 的映射)。
  3. 创建 commit 对象(指向该 tree,并记录提交信息)。
  4. 将这些对象写入 .git/objects

eg:执行git add时,对象库会新增一个Blob 对象,键是该文件内容的哈希,值是文件内容本身。
执行git commit时,会新增一个Commit 对象,键是该提交元信息的哈希,值包含指向 Tree 对象的引用、父提交哈希等信息。

2.4.本地添加文件演示例子

在这里插入图片描述
我们使用指令git log查看提交日志信息中这一大串参数,就是我们这两次提交commit的id
在这里插入图片描述

其中HEAD会指向当前的分支master。
可使用指令git log查看历史提交:
在这里插入图片描述
使用指令git cat-file附上哈希值可以查看提交的具体信息:
在这里插入图片描述
相同的方法我们可以继续查看tree对象:
在这里插入图片描述
接下来我们继续向test文件添加内容后并使用git status查看当前仓库的状态:
在这里插入图片描述
我们还可以使用git diff查看具体的修改:
在这里插入图片描述

2.5.版本回退

命令 作用 场景示例
git log 查看提交历史,找到需要回退的 commit id
git reset --soft <commit_id> 回退到指定版本,但保留工作区和暂存区的修改 回退到某个版本后继续编辑并重新commit
git reset --mixed <commit_id> 回退到指定版本,保留工作区修改,但清空暂存区(默认参数 常用于撤销 git add
git reset --hard <commit_id> 回退到指定版本,同时清空工作区和暂存区修改 彻底回到旧版本(注意不可逆)
git checkout <commit_id> 切换到某个历史版本(分离 HEAD 状态) 仅查看历史版本
git revert <commit_id> 撤销某次提交,但生成一个新的提交 在公共分支上安全回退
git reflog 查看 HEAD 移动的历史记录 用于找回被 reset 的版本
git reset --hard HEAD HEAD^ 表示上一个版本 HEAD^^ 表示上上个版本。

下面是一个git快速版本回退的原理示意图:
在这里插入图片描述

对于工作区并没有add的代码我们使用

git checkout -- [file]

可以让工作区的文件回退到最近一次add或commit的状态:
在这里插入图片描述
对于已经添加到暂存区的情况:
使用git reset --mixed HEAD即可回退暂存区的内容
在这里插入图片描述

如果我们想要删除文件则需要:将工作区和暂存区的文件都删除 并且提交这次修改
在这里插入图片描述

2.6.分支管理

2.6.1.分支介绍

Git 的分支(branch)是版本控制中非常强大的功能。借助分支,我们可以在不影响主干的情况下进行开发、测试或修复,最终通过合并将成果融合到主干中。

2.6.2.什么是分支

分支本质上是一个可移动的指针,指向某个 commit。master是初始化仓库时默认的分支。当我们创建一个新分支时,Git 会创建一个新的指针指向当前 commit。

2.6.3.分支常用操作
命令 说明
git branch 查看本地分支
git branch -a 查看所有分支(包含远程)
git branch 创建新分支
git checkout 切换到指定分支
git checkout -b 创建并切换到新分支
git merge 将指定分支合并到当前分支
git branch -d 删除本地分支(已合并)
git branch -D 强制删除本地分支
git push origin 推送本地分支到远程
git push origin --delete 删除远程分支
git checkout -b origin/ 从远程分支创建并切换到本地分支
git pull origin 拉取远程分支的更新
git fetch 获取远程分支更新(不自动合并)
git rebase 将当前分支变基到指定分支
2.6.4.合并冲突

在这里插入图片描述
在这里插入图片描述
发生合并冲突后 需要我们手动修改代码消除冲突后,再次提交并合并即可。
合并后分支示意图:
在这里插入图片描述

2.6.5.Fast Forward

在 Git 的分支合并中,Fast Forward(快速合并)是一种 不产生新的合并提交的合并方式,它会让目标分支的指针直接移动到指定分支的最新提交。
举例说明:
在这里插入图片描述
如果此时 master 还停留在 B,而 dev 继续在 D 上,没有新的提交分叉,在合并时就会 快速移动 master 的指针 到 D:而不会产生新的merge commit
特点

  • 不会生成新的合并节点(历史记录是直线的)。
  • 提交历史干净,像是没有分支一样。
  • 合并速度快,因为只是移动指针。

但是:

  • 无法保留分支的合并信息(看不出代码是从哪个分支合并来的)。

所以Git是强烈建议我们禁用FastForward模式的:

git merge -m "xxx" --no-ff dev
模式 历史记录特点 优点 缺点
Fast Forward 没有分支合并信息 提交历史干净,指针移动快 看不出分支合并记录
–no-ff 生成新的合并 commit,保留分支信息 合并记录清晰,便于回滚 提交历史会多出一条合并记录
2.6.6.分支管理策略

合理的分支策略可以让团队更加高效的开发测试部署管理项目。
特点

  • 并行开发:不同功能、修复可以在独立分支上同时进行,互不干扰。
  • 版本控制清晰:主干分支保持稳定,用于随时上线
  • 降低风险:开发和测试在独立分支上完成,确认无误后再合并到主干。
  • 可回溯性:通过分支记录功能开发历史,方便追踪和回滚。

下面简单列举几种常见的分支策略:
Git Flow

分支类型 说明
master 存放稳定可发布的版本
develop 日常开发分支,所有功能分支从这里拉出
feature/* 功能分支,用于开发新功能,完成后合并到 develop
release/* 预发布分支,用于上线前测试和修复
hotfix/* 紧急修复分支,用于直接修复 master 的 bug

GitHub Flow
GitHub Flow 是一种简化的分支策略,通常用于持续交付的项目。流程:所有功能从master 拉分支,例如 feature。
功能完成后发起 PR,团队代码审查。审查通过后合并到 master 。master 分支永远保持可部署状态。

2.6.7.多人协作分支

在多人分支协作开发的场景下,我们通常需要保证master分支的稳定,所以一般我们不直接在master上合并其他分支而是先在分支上合并master 解决bug和冲突之后,再在master上合并分支

三.远程仓库与多人协作

3.1. 远程仓库

远程仓库是指托管在网络上的 Git 仓库,比如 GitHub、码云等。通过远程仓库可以实现:

  • 多人协作开发
  • 代码备份和同步
  • 在线代码审查

3.2. 克隆到本地

首先我们在码云中创建一个远程仓库,之后使用指令git clone url克隆到本地:
在这里插入图片描述
或者是在码云gitee中添加了ssh公钥后 使用ssh克隆到本地 也可以:
在这里插入图片描述

3.3. .gitignore文件

.gitignore 文件用于告诉 Git 哪些文件或目录不需要被版本控制。这个文件在创建仓库的时候可以选择自己想要的模板,也可以根据自己的需求去编写:
在这里插入图片描述
如果你想强制添加被.gitignore忽略的文件可以使用指令:git add -f [filename]
也可以使用git check-ignore检查室哪项规则忽略了当前文件:
在这里插入图片描述
在这里插入图片描述
也可以用!+文件名 将特定文件排除在.gitignore的规则之外。

3.4. 给命令取别名

Git 命令有时比较长,我们可以为其设置别名。

git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.cm "commit -m"
git config --global alias.st status

3.5. 标签管理

Git 中的标签是一个指向某次提交(commit)的指针,通常用于标记发布版本,比如:

  • v1.0.0
  • release-2025-07
  • v2.3-beta
git tag [name]

就可以在当前分支上添加一个标签,也可以在后面加上commit id 指定的加上标签。
使用git tag可以查看当前所有的标签。

3.6. 多人协作事项

根据上述知识支持 相信你已经可以基本掌握git的使用了,下面几点git多人协作的注意事项请你知悉:

  • 推送前先拉取远程分支,避免冲突:git pull origin 分支名

  • 使用 git push origin branch-name 推送⾃⼰的修改;

  • 推送失败时先检查是否有更新未拉取

  • 如果合并有冲突,则解决冲突,并在本地提交

  • 删除本地分支前确认已成功合并

  • 尽量避免直接在 master上开发

  • 使用标签标记发布版本便于回滚

  • 设置命令别名提高效率(如 co -> checkout

  • .gitignore 文件应在协作前统一好


网站公告

今日签到

点亮在社区的每一天
去签到