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

目录

一.什么是Git

1. 什么是 Git

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

Git的特点:

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

分布式和集中式:

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

特点

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

2. Git 的安装

Windows

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

Centos

bash 复制代码
sudo yum -y install git

Ubuntu

bash 复制代码
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之后,紧接着就是配置一下用户名和邮箱信息:

bash 复制代码
git config [--global] user.name "Your Name" 
git config [--global] user.email "email@example.com"

如果加上全局参数--global表示将名称和邮箱设置成全局的 ,否则只在当前仓库设置

我们可以使用git config -l查看当前仓库的配置:

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

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

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

常用命令:

bash 复制代码
git status      # 查看工作区文件状态
git diff        # 查看工作区与暂存区的差异

暂存区

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

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

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

版本库

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

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

bash 复制代码
[工作区] -- 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的代码我们使用

bash 复制代码
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模式的:

bash 复制代码
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 命令有时比较长,我们可以为其设置别名。

bash 复制代码
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
bash 复制代码
git tag [name]

就可以在当前分支上添加一个标签,也可以在后面加上commit id 指定的加上标签。

使用git tag可以查看当前所有的标签。

3.6. 多人协作事项

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

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

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

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

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

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

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

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

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

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

相关推荐
添砖java_8577 小时前
基于RabbitMQ实现的轻量队列测试报告
分布式·rabbitmq
Zhu7588 小时前
使用腾讯CNB构建Hadoop定制容器镜像
大数据·hadoop·分布式
TTBIGDATA9 小时前
【Ambari Plus】13.Spark 安装
大数据·hadoop·分布式·spark·ambari·sqoop·ambari plus
sunxunyong11 小时前
Hadoop租户创建
大数据·hadoop·分布式
得物技术11 小时前
得物 OceanBase 落地实践
数据库·分布式·架构
减瓦12 小时前
Windows 环境使用 Git Bash 最佳实践
windows·git
史呆芬13 小时前
CodeX多仓库提交Skill搭建
git·后端·openai
heimeiyingwang13 小时前
【架构实战】分布式ID生成:从自增ID到雪花算法
分布式·架构
城东14 小时前
Git使用[原意要新建分支提交但是误提交到原来分支恢复办法]
git·原意要新建分支提交·但是误提交到原来分支