Git 版本控制教程(软件测试人员专用)¶
本教程面向软件测试工程师,聚焦测试日常使用场景:拉取代码、提交自动化脚本、分支管理、协作流程、冲突解决。
前置要求¶
| 项目 | 要求 | 获取方式 |
|---|---|---|
| Linux 基础命令 | 熟悉 cd、ls、cat、pwd 等基本目录和文件操作 | Linux实用教程-软件测试版 |
新手导读¶
Git 对测试人员最重要的不是复杂命令,而是能安全地拉代码、看改动、提交自动化脚本、处理简单冲突。
第一遍先掌握:
git clone:把项目下载到本地。git status:查看当前改动。git diff:看具体改了什么。git add、git commit、git push:提交自己的修改。git pull:同步远程更新。
遇到冲突不要慌,先看冲突文件内容,再决定保留哪一段。不要随便执行 reset --hard,它会丢失本地改动。
1、Git 基础¶
1.1 测试人员为什么要学 Git¶
| 场景 | 用途 |
|---|---|
| 拉取项目代码 | 看代码定位 Bug、了解实现 |
| 提交自动化脚本 | 测试代码版本管理 |
| 查看代码变更 | 了解本次改动范围、判断回归点 |
| 协作开发 | 与团队成员同步代码 |
| 回滚版本 | 发现问题快速回退 |
| 代码评审 | Review 开发提交 |
1.2 版本控制是什么¶
版本控制(Version Control): 记录文件变化历史,便于查看、协作、回滚。
1.3 Git vs SVN¶
| 维度 | Git | SVN |
|---|---|---|
| 类型 | 分布式 | 集中式 |
| 离线工作 | 支持 | 不支持 |
| 速度 | 快 | 慢 |
| 分支 | 轻量、易切 | 重、慢 |
| 学习曲线 | 较陡 | 平缓 |
| 主流程度 | 绝对主流 | 衰落 |
核心概念
Git 是目前事实标准,99% 的公司在用。
1.4 核心概念¶
工作区(Working Directory)
↓ git add
暂存区(Staging Area / Index)
↓ git commit
本地仓库(Local Repository)
↓ git push ↑ git pull
远程仓库(Remote Repository)
- 工作区:你看到的文件目录
- 暂存区:准备提交的快照
- 本地仓库:本地的
.git目录 - 远程仓库:GitHub/GitLab/Gitee 等服务器
2、安装与配置¶
2.1 安装¶
Windows: 官网下载 https://git-scm.com/,安装时全部默认即可(含 Git Bash 终端)
Mac: brew install git
Linux:
验证:
2.2 初始配置¶
第一次使用 Git 必须配置用户信息(提交时使用):
# 全局配置
git config --global user.name "张三"
git config --global user.email "zhangsan@company.com"
# 查看配置
git config --list
# 输出示例:
# user.name=张三
# user.email=zhangsan@company.com
# core.repositoryformatversion=0
# core.filemode=true
# core.quotepath=false
git config user.name
# 输出:张三
# 配置编辑器(可选)
git config --global core.editor "vim"
# 中文文件名不转码
git config --global core.quotepath false
# 命令缩写(可选,方便)
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
# 之后可用 git st 代替 git status
2.3 SSH 密钥配置(推荐)¶
避免每次推送都输密码。SSH 密钥是一对文件:私钥(留给自己,不能泄露)和公钥(上传到 GitHub/GitLab)。推送代码时用私钥证明身份,不需要输密码。
# 1. 生成密钥(一路回车即可。-t 指定算法,-C 是备注通常写邮箱)
ssh-keygen -t ed25519 -C "zhangsan@company.com"
# 老系统不支持 ed25519 时再回退到 rsa:
# ssh-keygen -t rsa -b 4096 -C "zhangsan@company.com"
# 2. 查看公钥
cat ~/.ssh/id_ed25519.pub
# Windows Git Bash 路径:~/.ssh/id_ed25519.pub
# 如果用的是 rsa:cat ~/.ssh/id_rsa.pub
# 3. 复制公钥内容
# 4. 粘贴到平台(注意 ed25519 用 id_ed25519.pub)
# GitHub: Settings → SSH and GPG keys → New SSH key
# GitLab: 头像 → Preferences → SSH Keys
# Gitee: 设置 → 安全设置 → SSH 公钥
# 5. 验证
ssh -T git@github.com
2.4 GUI 客户端推荐¶
| 客户端 | 平台 | 特点 |
|---|---|---|
| Sourcetree | 全平台 | 免费功能全 |
| GitKraken | 全平台 | 界面美观,部分收费 |
| TortoiseGit | Windows | 集成右键菜单 |
| GitHub Desktop | 全平台 | 官方,简洁 |
| VSCode 内置 | 全平台 | 编辑器直接用 |
| IDEA / PyCharm 内置 | 全平台 | JetBrains 系列内置 |
建议
测试人员从命令行学起,配 IDE/编辑器内置 Git 使用足够。
3、基础命令¶
3.1 初始化与克隆¶
# 方式 1:初始化一个新仓库
mkdir myproject
cd myproject
git init
# 当前目录变为 Git 仓库
# 方式 2:克隆已有仓库(最常用)
git clone https://github.com/user/repo.git
git clone git@github.com:user/repo.git # SSH
git clone https://github.com/user/repo.git mydir # 克隆到指定目录
git clone -b dev https://github.com/user/repo.git # 克隆指定分支
git clone 输出示例:
Cloning into 'repo'...
remote: Enumerating objects: 1523, done.
remote: Counting objects: 100% (1523/1523), done.
remote: Compressing objects: 100% (876/876), done.
Receiving objects: 100% (1523/1523), 3.25 MiB | 2.10 MiB/s, done.
Resolving deltas: 100% (612/612), done.
3.2 查看状态¶
输出示例:
3.3 添加到暂存区¶
# 添加单文件
git add file.py
# 添加多个
git add file1.py file2.py
# 添加目录
git add testcases/
# 添加所有变更(含新增、修改、删除)
git add .
git add -A # 等价
# 交互式添加(高级)
git add -p
3.4 提交¶
# 提交(会打开编辑器)
git commit
# 提交并写信息(推荐)
git commit -m "添加登录接口测试用例"
# 跳过暂存区直接提交修改文件
git commit -am "修改用例数据"
# 修改最近一次提交(增改信息或追加变更)
git add forgot.py
git commit --amend
提交信息规范(推荐):
<类型>: <简短描述>
[可选的详细描述]
类型:
- feat: 新功能
- fix: 修复 Bug
- test: 添加/修改测试
- docs: 文档
- refactor: 重构
- chore: 杂项(构建、配置)
- style: 格式(不影响代码)
示例:
test: 添加订单创建接口的边界值测试用例
fix: 修复登录用例中 token 未传递的问题
docs: 更新 README 安装说明
3.5 查看历史¶
# 完整日志
git log
# 简洁单行
git log --oneline
# 输出示例:
# a1b2c3d test: 添加订单创建接口的测试用例
# e4f5g6h fix: 修复登录用例中 token 未传递的问题
# i7j8k9l docs: 更新 README 安装说明
# m0n1o2p feat: 初始项目结构
# 图形化
git log --graph --oneline --all --decorate
| 参数 | 含义 |
| -- | -- |
| `--graph` | 用 ASCII 图形显示分支合并关系 |
| `--oneline` | 每个 commit 只显示一行(简略) |
| `--all` | 显示所有分支(不只是当前分支) |
| `--decorate` | 显示 commit 关联的分支/tag 名称 |
# 最近 N 条
git log -5
git log -n 5
# 按作者
git log --author="张三"
# 按时间
git log --since="2026-06-01" --until="2026-06-07"
# 按关键字
git log --grep="登录"
# 查看某文件历史
git log file.py
git log -p file.py # 含每次差异
3.6 查看差异¶
# 工作区 vs 暂存区
git diff
# 输出示例:
# diff --git a/testcases/test_login.py b/testcases/test_login.py
# index 1a2b3c4..5d6e7f8 100644
# --- a/testcases/test_login.py
# +++ b/testcases/test_login.py
# @@ -10,6 +10,8 @@ def test_login_success():
# response = login_api.post("/login", data)
# assert response.status_code == 200
# + assert response.json()["token"] is not None
# + assert response.json()["expires_in"] > 0
# 暂存区 vs 上次提交
git diff --staged
git diff --cached # 等价
# 工作区 vs 上次提交
git diff HEAD
# 两个提交之间
git diff commit1 commit2
# 两个分支之间
git diff main..dev
# 看某文件的差异
git diff file.py
3.7 删除文件¶
# 从 Git 和文件系统都删除
git rm file.py
git commit -m "删除废弃文件"
# 仅从 Git 删除,保留文件
git rm --cached file.py
# 文件已用 rm 删除,告诉 Git
rm file.py
git rm file.py
# 或
git add -A # 自动识别删除
3.8 重命名/移动¶
4、分支管理¶
4.1 分支是什么¶
分支 让多人并行开发,互不干扰。
4.2 分支基础操作¶
# 查看分支
git branch # 本地分支
# 输出示例:
# develop
# feature/login
# * main ← 当前分支
git branch -r # 远程分支
# 输出示例:
# origin/HEAD -> origin/main
# origin/develop
# origin/feature/login
# origin/main
git branch -a # 所有分支
# 创建分支
git branch feature/new-test
# 切换分支
git checkout feature/new-test
git switch feature/new-test # 新命令(Git 2.23+)
# 创建并切换
git checkout -b feature/new-test
git switch -c feature/new-test
# 删除分支
git branch -d feature/old # 安全删除(未合并会拒绝)
git branch -D feature/old # 强制删除
# 重命名分支
git branch -m old-name new-name
4.3 合并分支¶
# 当前在 main,把 dev 合并进来
git checkout main
git merge dev
# 输出示例(快进合并):
# Updating 4a5b6c7..8d9e0f1
# Fast-forward
# testcases/test_order.py | 45 +++++++++++++++++++++++++++++++++++++++++++++
# 1 file changed, 45 insertions(+)
# 合并时不快进(保留分支历史)
git merge --no-ff dev
Fast-Forward vs No-Fast-Forward:
快进合并(默认,无分叉时):
main ── A ── B → main ── A ── B ── C ── D
\
C ── D
非快进合并(--no-ff,保留分支信息):
main ── A ── B ─────────── M
\ /
C ── D ──────
4.4 Rebase(变基)¶
把当前分支的提交"重放"到目标分支末端,让提交历史变成一条直线。适合功能分支落后于主干时追赶进度,但不要对已推送到共享分支的提交 rebase(会改写历史)。
git rebase参数说明:
参数 含义 checkout feature切换到功能分支(rebase 操作的对象是当前分支) rebase main将当前分支的提交"重放"到 main 分支末端,形成线性历史
Rebase vs Merge:
测试人员注意
rebase 会改写提交历史,已 push 到共享分支的提交不要 rebase。
4.5 分支合并策略¶
| 场景 | 推荐 |
|---|---|
| 个人功能分支合到主干 | merge --no-ff(保留功能边界) |
| 主干更新合到功能分支 | rebase(保持线性) |
| 合并 PR | 通常使用 squash merge |
| 长期开发分支 | 定期 rebase 主干,减少冲突 |
5、远程仓库¶
5.1 关联远程仓库¶
# 查看已关联的远程仓库
git remote -v
# 输出示例:
# origin https://github.com/user/repo.git (fetch)
# origin https://github.com/user/repo.git (push)
# 添加远程仓库
git remote add origin https://github.com/user/repo.git
# 修改远程地址
git remote set-url origin git@github.com:user/repo.git
# 删除远程
git remote remove origin
# 重命名远程
git remote rename origin upstream
提示
origin 是远程仓库的默认名字,可以改成任何名字。
5.2 推送(Push)¶
# 推送当前分支
git push origin main
# 首次推送,关联本地与远程分支
git push -u origin main
# 之后 git push 即可
# 推送所有分支
git push --all
# 推送标签
git push --tags
# 强制推送(危险!)
git push --force
git push -f
危险
强制推送会覆盖远程历史,可能让协作者代码丢失。禁止对 main/master 强制推送。
5.3 拉取(Pull / Fetch)¶
# fetch:仅下载远程,不合并
git fetch origin
git fetch origin main
# pull:fetch + merge
git pull origin main
# pull with rebase
git pull --rebase origin main
Fetch vs Pull:
fetch:安全,只更新本地的远程引用,不动你的工作分支pull:等价于fetch + merge,可能产生冲突
推荐工作流:
# 1. 先 fetch 看看远程有啥新内容
git fetch origin
# 2. 看差异
git log HEAD..origin/main --oneline
# 3. 确认后合并
git merge origin/main
5.4 分支推送/拉取¶
# 推送本地分支到远程
git push origin feature/test
# 推送本地分支到远程不同名分支
git push origin feature/test:feature/test-v2
> **`本地分支:远程分支` 语法:** 冒号左边是本地分支名,右边是推送到远程后的分支名。如果不加 `:远程名`,则远程分支名与本地相同。常用于重命名远程分支或推送本地分支到不同名称的远程分支。
# 关联本地与远程分支
git branch --set-upstream-to=origin/dev dev
# 删除远程分支
git push origin --delete feature/old
git push origin :feature/old # 等价
# 拉取远程分支到本地
git checkout -b dev origin/dev
git checkout --track origin/dev
5.5 同步上游仓库(fork 场景)¶
# 添加上游
git remote add upstream https://github.com/original/repo.git
# 拉上游更新
git fetch upstream
git merge upstream/main
# 推到自己 fork
git push origin main
6、冲突解决¶
6.1 什么时候有冲突¶
两个分支修改了同一文件的同一位置,Git 无法自动合并。
git merge dev
# 输出:
# Auto-merging file.py
# CONFLICT (content): Merge conflict in file.py
# Automatic merge failed; fix conflicts and then commit the result.
6.2 冲突标记¶
打开冲突文件,会看到:
def login():
<<<<<<< HEAD
# 当前分支的版本
return "Login from main"
=======
# 要合并进来的版本
return "Login from dev"
>>>>>>> dev
6.3 解决步骤¶
# 1. 查看冲突文件
git status
# 2. 打开文件,手动编辑
# 删除 <<<<<<<、=======、>>>>>>> 标记
# 保留你想要的内容(可能两边都要、也可能选一边)
# 3. 标记为已解决
git add file.py
# 4. 完成合并
git commit
# 自动生成 Merge Commit 信息
# 中途想放弃合并
git merge --abort
6.4 冲突解决示例¶
修改前:
<<<<<<< HEAD
def login(username, password):
return api.post("/login", {"u": username, "p": password})
=======
def login(username, password, captcha=None):
return api.post("/login", {"username": username, "password": password, "captcha": captcha})
>>>>>>> dev
修改后(保留两边能力,合并):
def login(username, password, captcha=None):
return api.post("/login", {"username": username, "password": password, "captcha": captcha})
6.5 使用工具解决¶
VSCode、PyCharm、Sourcetree 都内置可视化冲突解决界面。
6.6 预防冲突¶
- 频繁同步主干:每天 pull 主干
- 小步提交:变更小,冲突范围小
- 分支生命周期短:功能分支不要存在太久
- 明确分工:避免多人改同一文件
- 沟通先行:大改前先告知团队
7、撤销与回滚¶
7.1 撤销工作区修改¶
# 撤销单个文件的工作区修改(恢复到上次提交状态)
git checkout -- file.py
git restore file.py # 新命令
# 撤销所有工作区修改
git checkout -- .
git restore .
危险
会丢失修改内容,不可恢复。
7.2 撤销暂存区¶
7.3 撤销提交¶
# 撤销最近一次提交,保留修改在暂存区
git reset --soft HEAD~1
# 撤销最近一次提交,保留修改在工作区(暂存区清空)
git reset --mixed HEAD~1
git reset HEAD~1 # 等价(--mixed 是默认)
# 撤销最近一次提交,丢弃所有修改(危险!)
git reset --hard HEAD~1
7.4 reset vs revert¶
reset: 移动 HEAD 指针,改写历史(仅适合本地)
revert: 创建新提交来"反向"撤销(适合已 push 的提交)
7.5 找回丢失的提交(reflog)¶
# 查看所有 HEAD 移动历史
git reflog
# 输出:
# 12ab34c HEAD@{0}: reset: moving to HEAD~1
# 89de56f HEAD@{1}: commit: 添加用例
# ...
# 恢复到某状态
git reset --hard HEAD@{1}
git reset --hard 89de56f
救命的命令
reset --hard 之后只要 30 天内通过 reflog 还能找回。
7.6 暂存修改(stash)¶
工作未完成但要切分支时使用。git stash 把未提交的修改临时"藏起来",工作区恢复干净。之后用 git stash pop 取回。就像把桌上的草稿放进抽屉,腾出空间做别的事。
# 暂存当前修改
git stash
git stash save "调试登录用例"
# 查看暂存列表
git stash list
# 输出示例:
# stash@{0}: On feature/login: 调试登录用例
# stash@{1}: On main: WIP on test_user.py
# 应用最近的暂存
git stash apply
git stash pop # apply + drop
# 应用指定暂存
git stash apply stash@{1}
# 删除暂存
git stash drop
git stash drop stash@{1}
# 清空所有暂存
git stash clear
8、协作流程¶
8.1 Git Flow(经典分支模型)¶
main ─────●─────●─────● 长期稳定,对应生产
│ │ │
release ───┴──● │ │ 发布准备
│ │ │
develop ────────●──●──●──● 开发主干
│ │ │
feature/login ────● │ │ 功能分支
feature/order ────● │
hotfix/critical ● 紧急修复
| 分支 | 用途 |
|---|---|
main / master |
生产环境,每次合入要打 tag |
develop |
开发主干 |
feature/* |
新功能 |
release/* |
发布准备 |
hotfix/* |
紧急修复 |
适合: 中大型团队、版本化发布的项目。
8.2 GitHub Flow(简化)¶
流程: 1. 从 main 拉功能分支 2. 开发 + 提交 3. 推到远程开 PR 4. Code Review 5. 合并到 main 6. 自动部署
适合: Web 项目、持续部署。
8.3 测试人员典型工作流¶
场景:维护接口自动化测试代码
# 1. 早上开始工作,同步主干
git checkout main
git pull origin main
# 2. 新任务,拉个分支
git checkout -b feature/add-order-test
# 3. 写代码
# ...编辑文件...
# 4. 看看改了啥
git status
git diff
# 5. 提交
git add testcases/test_order.py data/order_data.yaml
git commit -m "test: 添加订单创建接口的测试用例"
# 6. 推到远程
git push -u origin feature/add-order-test
# 7. 在 GitLab/GitHub 开 Merge Request / Pull Request
# 8. 评审通过后合并 → 删除本地分支
git checkout main
git pull
git branch -d feature/add-order-test
8.4 代码评审(Code Review)¶
测试人员可能要 Review 别人的代码或被 Review。
Review 要看什么:
- 用例是否覆盖完整
- 断言是否合理
- 代码是否可读、可维护
- 是否有硬编码(账号、URL)
- 是否有冗余、可复用代码
- 是否有破坏现有用例
8.5 .gitignore 文件¶
排除不需要提交的文件:
# .gitignore 示例
__pycache__/
*.pyc
*.pyo
.idea/
.vscode/
venv/
.env
.DS_Store
# 日志和报告
logs/
reports/
*.log
allure-results/
# 敏感信息
config/secret.yaml
.env.local
常见误区
测试人员常犯错误:把测试报告、日志、配置文件(含密码)提交了,污染仓库。
9、常用平台使用¶
9.1 GitHub¶
核心概念:
- Repository(仓库):代码项目
- Fork:复制别人的仓库到自己账号
- Pull Request(PR):申请合并
- Issue:问题/需求追踪
- Actions:CI/CD 自动化
9.2 GitLab¶
国内企业用得多,功能与 GitHub 类似:
- Project:项目
- Merge Request(MR):等同于 PR
- CI/CD Pipeline:内置流水线
9.3 Gitee(国内)¶
国产 Git 平台,速度快,企业版本本地化。
9.4 Pull Request / Merge Request 流程¶
1. fork 仓库(或在分支上开发)
2. 创建分支
3. 提交代码 + push
4. 在平台上点 "New Pull Request"
5. 填写:
- 标题
- 描述(做了什么、为什么、怎么测)
- 关联 Issue
- 指定 Reviewer
6. 等待 Review
7. 根据评论修改
8. 合并
9. 删除分支
PR 描述模板:
## 变更内容
- 添加订单创建接口的 10 条测试用例
- 修复登录用例中 token 未传递的问题
## 影响范围
- testcases/test_order.py(新增)
- data/order_data.yaml(新增)
- apis/login_api.py(修改)
## 测试
- [x] 本地执行通过
- [x] CI 流水线通过
- [x] 关联 Jira:TEST-123
10、测试场景实战¶
10.1 场景一:克隆项目并跑自动化¶
# 1. 克隆
git clone git@gitlab.company.com:test/api-automation.git
cd api-automation
# 2. 看主要分支
git branch -a
# 3. 切到测试分支
git checkout dev
# 4. 安装依赖(项目相关)
pip install -r requirements.txt
# 5. 跑测试
pytest
# 6. 之后每天同步更新
git pull
10.2 场景二:贡献新用例¶
# 1. 拉最新主干
git checkout main && git pull
# 2. 拉功能分支
git checkout -b feature/test-payment
# 3. 写代码 + 验证
# 编辑 testcases/test_payment.py
pytest testcases/test_payment.py
# 4. 提交
git add testcases/test_payment.py data/payment_data.yaml
git commit -m "test: 添加支付接口测试用例(10 条)"
# 5. 推送
git push -u origin feature/test-payment
# 6. 在 GitLab 开 MR
10.3 场景三:紧急修复线上 Bug¶
# 1. 从主干拉 hotfix 分支
git checkout main && git pull
git checkout -b hotfix/critical-fix
# 2. 修复
# ...编辑文件...
# 3. 提交
git commit -am "fix: 修复登录接口偶发 500 错误"
# 4. 推送 + 合并
git push -u origin hotfix/critical-fix
# 创建 MR,加急 review + merge
10.4 场景四:撤回错误提交¶
情况 1:刚 commit,还没 push
情况 2:已 push,但 main 分支
情况 3:误提交了敏感信息(密码/Token)
# 1. 修改文件移除敏感信息
# 2. 提交修复
git commit -m "remove sensitive data"
git push
# 3. ⚠️ 立即修改密码/重置 Token,因为历史中仍然有
# 4. 如必须从历史移除,需用 git filter-repo(高级)
10.5 场景五:解决冲突¶
# 1. 拉主干更新到我的分支
git checkout feature/my-test
git pull origin main
# 输出冲突:
# CONFLICT (content): Merge conflict in testcases/test_user.py
# 2. 查看冲突文件
git status
# 3. 打开 testcases/test_user.py,找到 <<<<<<<
# 4. 手动合并保留正确版本
# 5. 标记解决
git add testcases/test_user.py
# 6. 完成 merge
git commit -m "merge: resolve conflict in test_user.py"
# 7. 推送
git push
10.6 场景六:协作约定¶
团队约定(建议):
| 项 | 规则 |
|---|---|
| 主干分支 | 不直接 push,必须经过 MR |
| 分支命名 | feature/ bugfix/ hotfix/ 前缀 |
| 提交信息 | <类型>: <描述> 格式 |
| 评审 | 至少 1 人通过才能合并 |
| 单 MR 大小 | < 500 行变更 |
| 合并方式 | Squash merge(保持历史清爽) |
11、常见问题排查¶
11.1 push 被拒绝¶
error: failed to push some refs to 'origin'
hint: Updates were rejected because the remote contains work that you do not have locally
原因: 远程有新提交,本地落后。
解决:
11.2 想撤销 git add¶
11.3 误用 git reset --hard 丢失代码¶
11.4 中文文件名乱码¶
11.5 仓库太大,clone 太慢¶
11.6 误把大文件提交了¶
git filter-repo是什么? 专门用来改写 Git 历史的工具(比如删除某个文件、替换敏感信息)。比git filter-branch更安全、更快。使用前需安装:pip install git-filter-repo。
11.7 不小心提交到错误分支¶
# 假设在 main 提交了应该在 dev 的内容
git log --oneline # 找到 commit hash
# 切到 dev,cherry-pick 过去
git checkout dev
git cherry-pick <hash>
# 回到 main,撤销
git checkout main
git reset --hard HEAD~1 # 或 revert
代码块命令说明:
命令 含义 git log --oneline以简略格式查看提交历史(每行一个 commit) git cherry-pick <hash>把指定 commit 的改动"摘"到当前分支(不带历史) git reset --hard HEAD~1回退一个 commit,工作区也一起还原( --hard会丢弃修改)
cherry-pick是什么? 把某个提交"摘下来"放到当前分支。就像从树上摘樱桃,只挑那个特定的提交,不管它原来在哪个分支。
11.8 远程分支已删除,本地还显示¶
11.9 看不懂提交记录是谁改的¶
11.10 想看某个时间点的代码¶
12、最佳实践与速查¶
12.1 提交规范¶
✅ 推荐:
- 一次提交只做一件事
- 提交信息清晰描述意图
- 避免
updatefix bug这种含糊信息 - 不提交临时调试代码
❌ 避免:
- 一次提交几十个文件、几千行
- 提交未测试通过的代码
- 直接 push 到主干
12.2 安全准则¶
- ⚠️ 不要提交密码、Token、私钥
- ⚠️ 不要 force push 共享分支
- ⚠️ 不要 git reset --hard 已 push 的提交
- ⚠️ 重要操作前 backup 分支
12.3 常用命令速查¶
# 日常
git status # 看状态
git add . # 加全部
git commit -m "xxx" # 提交
git push # 推送
git pull # 拉取
git log --oneline # 看日志
# 分支
git branch # 看分支
git checkout -b xxx # 创建并切换
git checkout main # 切换
git merge dev # 合并
git branch -d xxx # 删除
# 撤销
git checkout -- file # 撤销工作区
git reset HEAD file # 撤销暂存
git reset HEAD~1 # 撤销提交
git revert HEAD # 反向提交
# 应急
git stash # 暂存
git stash pop # 恢复
git reflog # 救命日志
# 远程
git remote -v # 看远程
git fetch # 仅下载
git pull --rebase # 拉取 + rebase
12.4 推荐学习资源¶
- 官方教程:
https://git-scm.com/book/zh/v2(免费中文) - 可视化学习:
https://learngitbranching.js.org/?locale=zh_CN - 速查表:
https://education.github.com/git-cheat-sheet-education.pdf - GitHub Skills:
https://skills.github.com/
测试纪律
提交代码前自检:1) 没有密码、Token 等敏感信息;2) 没有大文件(>10MB);3) 没有临时文件、日志、报告;4) 提交信息清晰;5) 本地测试通过。涉及主干分支的操作三思而后行。
推荐下一步¶
根据你的学习进度,选择下一步:
- 如果你想继续学工具:学习 Docker 容器教程,掌握环境搭建
- 如果你想学抓包:学习 Fiddler 抓包教程,掌握请求分析
- 如果你想进入下一阶段:学习 Postman 接口测试,掌握接口调试
通关检查¶
完成本阶段后,使用 第2阶段-工具实战通关 检查是否可以进入下一阶段。