DevOps 入门系列:Git 版本控制 —— 从零开始掌握团队协作的基石
本部分目标
无需任何 Git 基础。学习完成后,你将理解版本控制、Git 核心模型,熟练掌握日常开发中 90% 的 Git 操作,能够独立使用分支、解决代码冲突、完成本地仓库与 GitHub 远程仓库的对接。
一、什么是版本控制?为什么程序员需要它?
1.1 没有版本控制的开发困境
假设独立开发网站项目:
-
今日完成登录功能,代码运行正常;
-
次日开始开发购物车功能,代码改动量大;
-
临时需求:回滚到昨日版本修复登录 Bug。
此时会陷入难题:新旧代码混杂,无法区分不同阶段的修改,只能手动删减代码,不仅耗时,还极易误删内容,导致项目运行异常。
核心问题:没有版本控制,就无法安全、快速地回退到项目任意历史状态。
1.2 版本控制系统(VCS)定义
版本控制系统(Version Control System,简称 VCS)是一款专门记录文件修改轨迹的工具,会为每一次改动生成完整历史记录。依托它可以实现:
-
查看文件任意历史时间点的内容
-
对比不同版本代码的差异
-
撤销错误修改,快速回退版本
-
追溯代码修改人、修改时间与具体改动行
通俗类比:版本控制系统等同于论文的「自动存档 + 无限撤销」功能,无需手动创建 最终版.docx、最终版2.docx 这类冗余文件。
1.3 Git 成为主流的核心原因
Git 是目前行业通用的版本控制系统,绝大多数企业开发团队都在使用,核心优势如下:
-
分布式:每台开发者设备都存有完整代码仓库,脱离中央服务器也可查看历史、提交代码;
-
速度极快:绝大多数操作在本地完成,无需依赖网络;
-
分支轻量化:创建、合并分支开销极小,支持团队多人并行开发。
二、Git 的核心概念:工作区、暂存区、仓库
三大区域是 Git 的底层核心模型,熟练理解后才能灵活使用所有命令。
2.1 工作区(Working Directory)
-
定义:电脑上直观可见的项目文件夹,日常新建、编辑、删除文件都在这个区域完成。
-
类比:书桌,可自由书写、摆放文件。
2.2 暂存区(Staging Area)
-
定义:临时存放代码修改的中转区域,需通过
git add命令将工作区的改动移入暂存区,只有暂存区内容才会参与下一次提交。 -
存在意义:区分不同类型的修改,按需分批提交(例如先提交 Bug 修复代码,再提交新功能代码)。
-
类比:超市购物车,先挑选商品放入购物车,最后统一结算。
2.3 仓库(Repository /.git 文件夹)
-
定义:执行
git commit后,暂存区的内容会被永久归档到本地仓库。仓库对应项目根目录下的隐藏文件夹.git,项目所有历史版本、分支数据、提交记录全部存储于此。 -
类比:档案馆,每一次提交都是一份带时间戳的存档文件,可随时调取查看。
2.4 完整数据流向
工作区 —(git add)—> 暂存区 —(git commit)—> 本地仓库 —(git push)—> 远程仓库(GitHub/GitLab/Gitee)
-
git add/git commit:纯本地操作,无需网络; -
git push/git pull:涉及远程仓库,必须联网。
三、Git 安装与首次配置
3.1 多平台安装方式
Windows
-
官网下载安装包:https://git-scm.com/
-
全程默认选项下一步安装;
-
安装完成后打开 Git Bash,所有 Git 命令均在此终端执行。
macOS
方式 1(系统自带工具):终端输入 git --version,按提示安装命令行工具;
方式 2(Homebrew):
brew install git
Linux(Ubuntu/Debian)
sudo apt update && sudo apt install git
3.2 全局身份配置(必做)
每一次 Git 提交都会记录开发者信息,首次使用必须配置用户名和邮箱。
# 全局配置(当前系统所有 Git 仓库生效)
git config --global user.name "你的昵称/真实姓名"
git config --global user.email "你的邮箱@example.com"
-
去掉
--global:仅对当前单个仓库生效; -
验证配置:
git config --list
执行后能看到 user.name 和 user.email 即代表配置成功。
四、第一次使用 Git:初始化仓库与第一次提交
4.1 创建项目并初始化 Git 仓库
# 新建项目文件夹
mkdir my-first-git-project
# 进入项目目录
cd my-first-git-project
# 初始化空 Git 仓库
git init
输出 Initialized empty Git repository in ... 即为初始化成功,目录内生成隐藏文件夹 .git。
4.2 新建文件 & 查看仓库状态
# 创建测试文件
echo "Hello, Git!" > hello.txt
# 查看文件追踪状态
git status
输出解读:
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present
Untracked files:文件为新增状态,Git 暂未追踪,需要执行 git add 加入暂存区。
4.3 将文件加入暂存区
# 指定单个文件加入暂存区
git add hello.txt
再次执行 git status,文件变为绿色,代表已进入暂存区,等待提交。
常用简写:
-
git add .:将当前目录下所有新增 / 修改 / 删除的文件全部加入暂存区; -
git add *.txt:仅将所有后缀为.txt的文件加入暂存区。
4.4 提交内容到本地仓库
git commit -m "第一次提交:添加 hello.txt"
-
-m:后跟提交描述信息,用于说明本次修改内容; -
规范要求:提交信息必须简洁易懂,禁止使用
update、fix、123等无意义内容。
优质提交信息示例:
-
修复登录按钮移动端点击失效问题
-
新增用户注册接口
-
优化数据库查询,提升接口响应速度
4.5 查看提交历史记录
# 查看完整提交日志
git log
# 精简版日志(单行展示,推荐日常使用)
git log --oneline
五、修改文件与再次提交
5.1 修改文件 & 对比代码差异
编辑 hello.txt 新增内容,执行以下命令查看状态与改动:
# 查看仓库状态
git status
# 查看文件具体修改内容
git diff
-
红色内容:删除的代码;
-
绿色内容:新增的代码;
-
该命令可在提交前核对修改内容,避免误提交。
5.2 重复提交流程
# 改动加入暂存区
git add hello.txt
# 提交到本地仓库
git commit -m "在 hello.txt 中增加第二行内容"
小贴士:初学者建议每次修改都显式执行
git add,不推荐直接使用git commit -a。
六、远程仓库:备份与团队协作
6.1 远程仓库作用
本地仓库仅保存在个人电脑,存在硬盘损坏丢失数据、多人无法协同开发的问题。
远程仓库是托管在公网服务器的 Git 仓库(主流平台:GitHub、GitLab、Gitee),核心用途:
-
云端备份代码;
-
团队多人共享、同步代码。
类比:本地仓库 = 本地笔记本,远程仓库 = 云端网盘。
6.2 GitHub 创建远程仓库
-
注册并登录 GitHub 账号;
-
点击右上角
+→New repository; -
填写仓库名(建议和本地项目名一致);
-
不要勾选
Initialize this repository with a README(本地已有仓库); -
点击
Create repository完成创建。
6.3 关联本地仓库与远程仓库
执行命令关联远程地址(替换为你自己的仓库链接):
git remote add origin https://github.com/你的用户名/my-first-git-project.git
-
origin:远程仓库默认别名(行业通用规范); -
查看已配置的远程仓库:
git remote -v
6.4 推送本地代码到远程仓库
# 首次推送,建立上下游关联
git push -u origin main
-
-u:绑定分支关联,后续直接执行git push即可推送; -
认证说明:GitHub 已废弃账号密码登录,需使用 Personal access tokens 作为密码输入。
推送成功后,刷新 GitHub 页面,即可看到本地上传的文件。
6.5 克隆远程仓库
在其他设备 / 目录下载完整远程仓库(包含所有历史记录):
git clone https://github.com/你的用户名/my-first-git-project.git
七、分支:多人协作的核心能力
7.1 分支的作用
多人并行开发场景下,若所有人都在主分支 main 开发:
-
未完成的半成品代码会影响其他成员;
-
不同功能代码相互混杂,难以拆分维护。
分支解决方案:从主分支拆分独立开发线,每个人在专属分支开发,互不干扰;功能测试完成后,再合并回主分支。
类比:游戏存档副本,在副本中尝试新操作,成功则合并到主存档,失败则直接删除副本。
7.2 分支基础操作
# 1. 查看所有本地分支(* 代表当前所在分支)
git branch
# 2. 创建新分支(不切换)
git branch feature-shopping-cart
# 3. 切换到指定分支
git switch feature-shopping-cart
# 4. 创建分支 + 立即切换(常用简写)
git switch -c feature-shopping-cart
7.3 分支内提交 & 分支合并
-
在新分支完成代码修改、
git add、git commit; -
功能开发完成后,合并回主分支:
# 切换到主分支(接收代码的目标分支)
git switch main
# 合并指定分支到当前分支
git merge feature-shopping-cart
-
快进合并(Fast-forward):主分支无新改动,直接移动分支指针,历史记录为直线;
-
三方合并:主分支已有新提交,Git 会生成一条新的合并记录。
7.4 删除分支 & 推送本地分支到远程
# 安全删除(分支已合并,推荐)
git branch -d feature-shopping-cart
# 强制删除(分支未合并,谨慎使用)
git branch -D feature-shopping-cart
# 将本地新分支推送到远程仓库
git push origin feature-shopping-cart
八、合并冲突:多人修改同一文件的解决方案
8.1 冲突产生条件
当两个分支修改了同一个文件的同一行 / 相邻行,或一个分支删除文件、另一个分支修改该文件时,Git 无法自动判断最终内容,就会触发代码冲突。
补充:仅修改不同文件、同一文件不同区域,Git 可自动合并,不会产生冲突。
8.2 冲突文件标记格式
冲突文件内会出现专属标记,格式如下:
<<<<<<< HEAD
# 当前分支(main)的代码内容
=======
# 待合并分支的代码内容
>>>>>>> 分支名
-
HEAD:指向当前所在分支; -
=======:两个版本内容的分隔线。
8.3 手动解决冲突步骤
-
执行
git status找到标红的冲突文件; -
打开文件,删除所有冲突标记(<<<<<<、=======、>>>>>>>),手动编辑保留最终代码;
-
将解决后的文件加入暂存区:
git add 冲突文件名
- 完成合并提交:
git commit -m "合并分支,解决代码冲突"
- 查看分支合并历史:
git log --oneline --graph
8.4 冲突规避技巧
-
开发期间频繁拉取主分支最新代码,提前化解小冲突;
-
团队分工明确,尽量避免多人同时修改同一文件的同一区域;
-
使用 Pull Request 流程,合并前完成代码评审。
九、SSH 认证:免密连接 GitHub
9.1 SSH 对比 HTTPS
-
HTTPS:每次推送代码都需要输入账号 / 令牌,操作繁琐,部分网络环境会被拦截;
-
SSH:配置密钥后免密认证,连接更稳定,是团队开发首选方式。
9.2 SSH 密钥原理
密钥分为一对:
-
私钥:本地保存,等同于个人身份证,严禁外泄;
-
公钥:上传到 GitHub,等同于身份证复印件,用于身份校验。
连接逻辑:GitHub 用公钥加密信息,本地设备用私钥解密,自动完成身份验证。
9.3 生成本地 SSH 密钥
ssh-keygen -t rsa -b 4096 -C "你的邮箱@example.com"
参数说明:
-
-t rsa:使用 RSA 加密算法; -
-b 4096:密钥长度 4096 位,安全性更高; -
-C:备注信息,一般填写邮箱。
执行后连续回车(默认存储路径、不设置密钥密码),生成两个文件:
-
私钥:
~/.ssh/id_rsa -
公钥:
~/.ssh/id_rsa.pub
9.4 公钥配置到 GitHub
- 查看并复制公钥全部内容:
cat ~/.ssh/id_rsa.pub
-
GitHub 配置路径:头像 →
Settings→SSH and GPG keys→New SSH key; -
粘贴公钥内容,保存即可。
9.5 测试 SSH 连接
ssh -T git@github.com
首次连接输入 yes。
9.6 切换仓库远程地址为 SSH
# 查看当前远程地址
git remote -v
# 替换为 SSH 地址
git remote set-url origin git@github.com:你的用户名/仓库名.git
配置完成后,后续 git push / git pull 无需再输入密码。
十、Git 常用命令速查表(按场景分类)
| 操作场景 | 对应命令 |
|---|---|
| 查看仓库当前状态 | git status |
| 单个文件加入暂存区 | git add 文件名 |
| 所有改动加入暂存区 | git add . |
| 提交代码(带描述) | git commit -m "提交说明" |
| 查看精简提交历史 | git log --oneline |
| 查看所有本地分支 | git branch |
| 切换分支 | git switch 分支名 |
| 创建并切换新分支 | git switch -c 分支名 |
| 合并分支 | 先切目标分支 → git merge 源分支 |
| 安全删除分支 | git branch -d 分支名 |
| 强制删除分支 | git branch -D 分支名 |
| 查看远程仓库信息 | git remote -v |
| 添加远程仓库关联 | git remote add origin 远程地址 |
| 首次推送代码到远程 | git push -u origin main |
| 常规推送代码 | git push |
| 克隆远程仓库 | git clone 远程地址 |
| 生成 SSH 密钥 | ssh-keygen -t rsa -b 4096 -C "邮箱" |
| 测试 GitHub SSH 连接 | ssh -T git@github.com |
| 拉取远程仓库最新代码 | git pull |
| 撤销工作区文件修改(未 add) | git checkout --文件名 |
| 撤销暂存区文件(已 add,未 commit) | git reset HEAD 文件名 |
| 撤销上一次提交(保留代码) | git reset --soft HEAD^ |
| 临时暂存未完成代码 | git stash |
| 恢复暂存的代码 | git stash pop |
| 查看详细提交历史(含文件改动) | git log -p |
| 删除远程仓库分支 | git push origin --delete 远程分支名 |
| 创建本地标签(版本号) | git tag v1.0.0 |
| 推送标签到远程仓库 | git push origin v1.0.0 |
| 强制推送代码(慎用,覆盖远程) | git push -f |
| 同步远程分支信息(清理无效分支) | git fetch --prune |
| 查看当前提交的文件详情 | git show 提交ID |
| 查看工作区 vs 暂存区的代码改动(未 add 的修改) | git diff |
| 查看暂存区 vs 本地仓库的改动(已 add、待 commit) | git diff --cached |
| 查看指定文件的改动 | git diff 文件名 |
| 查看两次提交之间的差异 | git diff 提交ID1 提交ID2 |


被折叠的 条评论
为什么被折叠?



