Git 版本控制与协作实战教程

自己在网站学的

比较形象一点:

  • 基础
    git commit(创建并指向新的子节点) 与 parent节点, git branch, git checkout(换*),简洁版本(git checkout -b ),
    git merge(差不多把对面分支连到自己身上,)
    git rebase 对面(把自己搞个副本作为对面子级)

  • 进阶:
    分离head:head,直接checkout目前分支所指的记录,head就指过去了
    相对引用:checkout 目标^(把目标移动到目标的父级,或者~1),感觉有点单向链表,结构体指针的味道,分支是命名指针,head是指向指针的指针,commit链就是单向链表
    git branch -f(force) main HEAD3 main强制指向 (head的父级上3个单位),(不需要换过去分支,便捷)
    git reset head
    1 ,回到父级,但是子级还在但是未加入暂存区,对于远程无效
    git revert head(当前*), 一个新的提交,引入了更改,状态与上上级相同,远程有效

最后一个 git pull,让gpt来:
git fetch 只更新远程指针,不动你本地分支。从远处拿过来,
git pull fetch + merge(最常用)
git pull –rebase fetch + rebase(让你的提交排在远程节点后面)
git push 把你本地的节点推到远程(相当于反向传递链表)。

gpt5写的教程

适用对象与课程目标

本教程面向刚会 add/commit/push 的初学者,目标是帮助你成长为能够独立管理分支、解决冲突并通过 Pull Request 参与团队协作的开发者。全篇采取“知识讲解 + 实验操作步骤 + 练习任务”的方式,强调“版本控制思想”和“团队协作习惯”。


一、Git 基础与原理

什么是版本控制?为什么要用 Git?

  • 版本控制:记录文件随时间的变化,支持回退、对比、协作。
  • Git 的优势:分布式(每个人都有完整历史)、分支轻量、性能好、生态成熟(GitHub/GitLab 等)。

Git 的本地与远程仓库关系图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   开发者A本地                     远程仓库(GitHub/GitLab/Cursor Cloud)
┌────────────────┐ ┌───────────────┐
│ 工作区 (WD) │ git add │ origin │
└──────┬─────────┘ ───────────────► │ (remote repo) │
│ └──────┬────────┘
│ git commit │
▼ │
┌────────────────┐ │
│ 暂存区 (Index) │ │
└──────┬─────────┘ │
│ 写入历史 │
▼ │
┌────────────────┐ git push / git fetch/pull │
│ 本地仓库 (Repo)│ ◄───────────────────────────────┘
└────────────────┘

核心思想:工作区修改先进入暂存区,提交到本地仓库形成历史,再与远程仓库同步。

实验:创建一个本地仓库,添加文件并进行首次提交

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1) 创建并进入目录
mkdir git-lab && cd git-lab

# 2) 初始化仓库
git init

# 3) 创建文件
echo "Hello Git" > README.md

# 4) 将改动加入暂存区
git add README.md

# 5) 首次提交
git commit -m "chore: init repository with README"

# 6) 查看提交日志(简洁)
git log --oneline

练习任务

  1. 修改 README.md,追加一行文本;
  2. 运行:
1
2
3
4
5
6
git status
git diff # 查看工作区与上次提交的差异
git add README.md
git diff --staged # 查看暂存区与上次提交的差异
git commit -m "docs: update README with description"
git log --oneline --graph --decorate --all

二、核心命令详解

讲解与实操:add / commit / status / push / pull

  • git status:当前改动状态(未跟踪、已修改、已暂存)。
  • git add <文件>:把工作区改动加入暂存区;-A/. 为批量添加。
  • git commit -m “…”:把暂存区改动写入历史,形成一个快照。
  • git remote add origin :添加远程仓库别名 origin
  • git push -u origin main:首次将 main 推送到远程并建立跟踪关系。
  • git pull:从远程拉取并合并;等价于 git fetch + git merge

实验:模拟本地修改、推送、远程查看结果

1
2
3
4
5
6
7
8
9
10
11
12
# 1) 在 GitHub/GitLab/Cursor Cloud 创建一个空仓库(记住仓库URL)

# 2) 在本地仓库绑定远程
git remote add origin <your-repo-url>

# 3) 确认当前分支为 main(若不是可重命名)
git branch -M main

# 4) 推送到远程
git push -u origin main

# 5) 在平台页面查看 README.md 是否已经出现

练习:撤销修改 / 查看历史

1
2
3
4
5
6
7
8
9
10
# 工作区撤销:把某文件恢复为上次提交的版本(危险:丢弃未暂存的修改)
git checkout -- README.md

# 暂存区撤销:把某文件从暂存区移回工作区
git reset HEAD README.md

# 查看历史与差异
git log --oneline --decorate --graph --all
git show HEAD~1 # 查看上一个提交的详情
git diff HEAD~1..HEAD # 查看两个提交之间的差异

三、分支管理(Branch)

分支的意义与命名规范

  • 独立开发、并行协作、降低互相影响。
  • 建议命名:
    • 功能:feature/<short-name>,如 feature/login
    • 修复:fix/<short-name>bugfix/<short-name>,如 fix/ui-overflow
    • 发布:release/<version>,如 release/1.2.0
    • 热修复:hotfix/<short-name>

常用命令:branch / checkout / switch / merge / rebase

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建并切换到新分支
git checkout -b feature/login # 或:git switch -c feature/login

# 查看本地/远程分支
git branch # 本地
git branch -r # 远程
git branch -a # 本地+远程

# 合并分支到当前分支(产生一个合并提交)
git checkout main
git merge feature/login

# 变基:把 feature 分支的提交“接到”最新 main 之上(线性历史)
git checkout feature/login
git fetch origin
git rebase origin/main

提示:团队一般约定在发起 PR 前使用 rebase 同步主干,保持历史整洁;或使用平台提供的“Squash and merge”。

实验:创建 feature/login 分支并合并回 main

1
2
3
4
5
6
7
8
9
10
11
12
# 1) 新建并切换到功能分支
git checkout -b feature/login
echo "Login page" > login.md
git add login.md
git commit -m "feat(login): add login page draft"

# 2) 回到主分支并合并
git checkout main
git merge feature/login

# 3) 推送
git push origin main

练习:解决一次简单冲突

  1. mainfeature/conflict-demo 分支中,分别修改同一文件同一行并提交;
  2. 尝试将 feature/conflict-demo 合并回 main,感受冲突并解决。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 构造冲突(示例)
git checkout -b feature/conflict-demo
echo "line-from-feature" > conflict.txt
git add conflict.txt && git commit -m "feat: add conflict line"

git checkout main
echo "line-from-main" > conflict.txt
git add conflict.txt && git commit -m "feat: add conflict line in main"

# 合并并触发冲突
git merge feature/conflict-demo

# 手动编辑 conflict.txt,保留正确版本,删除 <<<<<< ======= >>>>>>> 标记
git add conflict.txt
git commit -m "merge: resolve conflict in conflict.txt"

四、团队协作与 Pull Request(PR)

PR 的意义

  • 在 GitHub/GitLab/Cursor Cloud 上,PR/MR 是“把某分支的修改提请合并到目标分支”的协作流程载体。
  • 提供代码差异、历史、检查状态与讨论区,是团队沟通与质量把关的核心。

教学步骤:创建新分支 → 推送 → 发起 PR → 代码审查 → 合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1) 本地创建并提交
git checkout -b feature/docs-onboarding
echo "Onboarding" > docs/onboarding.md
git add .
git commit -m "docs: add onboarding doc"

# 2) 推送到远程(同名分支)
git push -u origin feature/docs-onboarding

# 3) 在平台页面上:
# - 点击“Compare & pull request”(GitHub)或“Create merge request”(GitLab)
# - 填写标题与描述(见下方模板)
# - 选择审阅者(Reviewers)
# - 等待评审,按意见修正并再次 push

# 4) 审查通过后选择合并策略(Merge/Squash/Rebase)

PR 描述模板示例

1
2
3
4
5
6
7
8
9
10
11
12
## 变更内容
- 描述本次变更做了什么,影响哪些模块

## 背景/动机
- 为什么要改?关联的 issue 或用户问题

## 检查清单
- [ ] 本地自测通过
- [ ] 更新了文档/注释
- [ ] 兼容性/安全性评估

## 截图/录屏(可选)

练习任务

  • 两名成员分别在各自分支提交改动,互相创建 PR 并进行 Review,至少各写 2 条有建设性的评论(可包含命名建议、边界条件、测试建议等)。

五、冲突与回滚

冲突的原理

  • 当两人修改“同一文件的同一行”或“相邻区域”,Git 无法自动合并,需要人工决策。
  • 冲突文件中会出现冲突标记:<<<<<<<=======>>>>>>>

实验:手动制造冲突并解决

参考第三章“练习:解决一次简单冲突”的步骤。

revert 与 reset 的区别与使用场景

  • git revert :创建一个新的提交,用“反操作”抵消指定提交。安全、可溯源,适合已推送到共享仓库的回滚。
  • git reset:移动分支指针到历史某点;
    • --soft:仅移动指针,保留暂存区与工作区;
    • --mixed(默认):清空暂存区,保留工作区改动;
    • --hard:同时丢弃暂存区和工作区改动(危险)。
  • 团队协作中,优先使用 revert;只有在个人分支、未推送的情况下才考虑 reset --hard

练习:用 revert 撤销一次错误提交

1
2
3
4
5
6
7
8
# 找到需要撤销的提交ID
git log --oneline

# 以新增提交的方式撤销(安全)
git revert <commit_id>

# 推送
git push

六、Tag 与版本发布

什么是 tag?为什么要打版本号?

  • Tag 是对某个提交打上的“里程碑”标签,常用于版本发布(如 v1.0.0)。
  • 便于回溯、对比与生成发布说明。

实验:创建 v1.0 标签并推送

1
2
3
4
5
6
7
8
9
# 轻量标签
git tag v1.0.0

# 或注解标签(推荐,包含作者、日期、说明)
git tag -a v1.0.0 -m "release: v1.0.0"

# 推送标签
git push origin v1.0.0 # 推送单个
git push origin --tags # 推送全部未推送标签

练习:查看某版本差异

1
2
git diff v1.0.0..v1.1.0
git log v1.0.0..v1.1.0 --oneline --decorate

七、最佳实践与规范

Commit Message 规范(示例:Conventional Commits)

  • 常用类型:feat 新功能、fix 修复、docs 文档、refactor 重构、test 测试、chore 杂务。
  • 示例:
1
2
3
feat(login): support email-based authentication
fix(api): handle empty payload on /users
docs(readme): add quick start section

分支命名规范

  • feature/loginbugfix/ui-overflowhotfix/payment-timeoutrelease/1.3.0

团队协作建议:如何做 Code Review

  • 聚焦:可读性、正确性、边界条件、测试覆盖。
  • 语气:客观、具体、可执行;多用建议式语言。
  • 小步提交:更易审查与回滚。
  • 对安全/性能/兼容性修改要明确标注并请求更多关注。

实验任务:在一个虚拟项目中模拟完整协作流程

  1. A 初始化仓库并推送 main
  2. B fork(或直接 clone 有权限的仓库);
  3. A 新建 feature/a,B 新建 feature/b,各自提交并推送;
  4. 双方各自发起 PR,互相 Review;
  5. 合并 PR 到 main,打 v1.0.0 标签并推送;
  6. 产出一次 Release Note(可手写或用平台自动生成)。

PR 模板(可放在 .github/pull_request_template.md)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## 变更类型
- [ ] Feat
- [ ] Fix
- [ ] Docs
- [ ] Refactor
- [ ] Test
- [ ] Chore

## 变更说明
-

## 风险与验证
- 风险点:
- 验证方式:

## 关联 Issue
Closes #123

八、进阶内容(选学)

Git Flow vs GitHub Flow 简介

  • GitHub Flow:主干 main + 短生命周期功能分支 + PR + 持续部署。简单、适合持续交付。
  • Git Flowdevelop 主开发分支 + feature/* + release/* + hotfix/*,规约清晰,适合有版本节奏的产品。

选择建议:小团队或频繁上线用 GitHub Flow;多团队协作、严格发布节奏用 Git Flow。

常见问题与故障排查

  • push 被拒绝(远程有新提交):
1
2
3
git fetch origin
git rebase origin/main # 或 git pull --rebase
git push
  • 合并时产生大量无关差异:检查换行符/文件权限;配置 .gitattributes
1
* text=auto eol=lf
  • 误删分支:若已推送到远程,可从远程恢复:
1
git checkout -b feature/x origin/feature/x
  • 想“拿回某个文件”的旧版本:
1
git checkout <commit_id> -- path/to/file

推荐阅读与工具

  • 书籍:Pro Git(免费英文版)、Git 权威指南。
  • 插件/工具:VS Code GitLens、SourceTree、Fork、GitKraken、GitHub Desktop。
  • 平台:GitHub、GitLab、Cursor Cloud(均支持 PR/MR 工作流与保护规则)。

结语与延伸

版本控制的本质是“可追溯的协作”。工具只是手段,习惯才是关键:小步提交、写清描述、善用分支与 PR、勤做 Review 与回滚演练。在真实项目中持续实践,才是掌握 Git 的唯一途径。


课程完成后你将掌握的能力

能力 说明
初始化与基本提交 独立完成 init/add/commit/status 与本地历史查看
远程协作 配置 remote,完成 push/pull/fetch 并处理常见拒绝问题
分支管理 创建/切换/合并/变基,遵循分支命名规范
冲突解决 读懂冲突标记,手动合并并验证
回滚策略 正确区分 revertreset 并在合适场景应用
版本发布 创建/推送 Tag,比较版本差异并生成发布说明
PR 工作流 发起 PR、撰写描述、参与 Code Review 并选择合并策略
团队规范 使用规范的 Commit Message、PR 模板与 Review 建议