一.什么是Git
1. 什么是 Git
Git 是目前世界上最流行的分布式版本控制系统。它能够记录项目文件的历史版本,支持多人协作开发,并且因为其分布式架构而在速度、安全性和灵活性方面具有显著优势。
Git的特点:
- 分布式:每台电脑上都是一个完整的仓库,支持离线操作。
- 轻量高效:提交、分支和合并的速度非常快。
- 数据安全:采用 SHA-1 哈希算法保证数据不可篡改。
- 强大的分支管理:分支创建、切换和合并非常高效。
分布式和集中式:
集中式代表工具:SVN(Subversion)、CVS、Perforce
特点:
- 只有一个中央服务器存储完整代码版本,开发者通过客户端连接到服务器获取最新版本。
- 提交时必须联网,中央服务器宕机会影响所有人。
- 版本历史记录集中存储在服务器,客户端一般只保存当前版本。
2. Git 的安装
Windows:
- 前往 Git 官方下载地址。
- 下载
Git for Windows
安装包,默认选项安装即可。 - 安装完成后,打开
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 会:
- 为工作区文件创建 blob 对象(文件内容)。
- 生成 tree 对象(记录文件名与 blob 的映射)。
- 创建 commit 对象(指向该 tree,并记录提交信息)。
- 将这些对象写入
.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
文件应在协作前统一好