跳到主要内容Git 入门实战:从零理解版本控制与团队协作 | 极客日志编程语言大前端
Git 入门实战:从零理解版本控制与团队协作
Git 是一款用于多人文件版本控制的工具,核心作用是记录文件修改历史并提供随时回滚的能力。本文通过通俗比喻解释了 Git 的版本控制原理、本地与远程仓库的区别,以及 init、add、commit、push、pull 等基础操作。内容涵盖团队协作中的冲突处理、分支管理策略,适合零基础开发者快速掌握 Git workflow,实现高效的项目管理与代码同步。
灭霸1 浏览 Git 入门实战:从零理解版本控制与团队协作
Git 通俗来说,就是一种用于多人文件版本合作的工具。对于非程序员的项目小白,或者没有程序基础但想入行的人来说,完全理解起来可能稍显困难。这篇文章不采用枯燥的码字教学,而是用最通俗易懂的方式,让你从零基础理解它、使用它。
一、Git 的作用
1. Git 的版本控制
文件永远不会只有一个版本。你是否经历过以下场景?
- 论文会有'终稿 v1、终稿 v2、终稿最终版';
- 设计稿会有'改版 A、改版 B、改版 C';
- 甚至自己写的文章也会来回改十几遍。
更不用说单独只通过一个本地文件夹操刀一个大型项目了。突然有一天,你觉得某个节点脱离了原本的方向或发生了错误,但你已经进行了多处修改,单独再修改不仅费事,还容易发生遗漏。
你可能会说:'我可以这样做……'
论文_最终 v1.docx
论文_最终_改过的 v2.docx
论文_最终 2_真的最终.docx
论文_最终最终版_别改了.docx
这种方法不仅每次要单独保存(还容易忘),最后甚至分不清哪个是最新版,哪个删了重点改了什么东西。而且对于大型项目来说,这简直是灾难。
或许聪明的你想到了:如果能像游戏里的存档点就好了。保存一下是一个点,明天再改它又是一个点。你死了(改错了),读档就行。
是的,Git 做的事情非常简单:
帮你保存每一次修改,并能随时回到任何一次修改。
因此我们可以将 Git = 文件的时间机器。
你可以把 Git 理解成一个'文件历史的照相机':
| 你每改一次资料 | Git 就悄悄拍一张照片 | 你还可以在照片背面写上备注 |
|---|
| 第一天写了初稿 | 📷 咔!留了一版 | 这是我的初稿哦 |
| 第二天删了两段 | 📷 又拍一张 | 第三四段不太通顺,我删掉啦 |
| 第三天修改标题 | 📷 再拍一张 | 修改了标题 |
| 第四天添加了新内容 | 📷 再拍一张 | 增加了'女主爆甩男主的情节' |
| 第五天写完稿子 | 📷 最后拍一张 | 完稿! |
如果第四天你突然后悔:'我觉得还是第一天写得好!'没关系——Git 把每一张'版本照片'都替你保存着,你可以直接穿越回第一天。
只要知道:
改文件 → Git 记一次
改错了 → Git 带你回去
文件乱了 → Git 给你旧版本
一切可撤回、可穿越、可找回
在这里总结一下,Git 就是文件的照相机和备忘录,它记录着你文件的每一个版本,学了 Git,你的文件不会再变成一团乱麻。
2. Git 的团队合作
如果你一个人写文档,Git 能当备份器、时光机、后悔药。但真正好玩的地方是——多人一起正确使用它,像开了外挂。
想象一个场景:三个人一起写同一个方案文档或者项目,如果不用 Git 会怎样?假设三个人一起在 V2 文档上作业:
情况一:
| 小王写着写着发你一个 V3 | '你改改,我再看' |
| 你改完发给小李 V4 | 小李又改回 V2 说 V3 不行 |
| 三份文件互相不一样 | 谁是最新版?谁改错了?没人知道 |
| 最后大家互相讨论,将 v4 作为最新版 | 大家同时将你文件里的 v4 更新为自己的最新版本 |
这种情况下,如果项目很多人,大家都要下载更新文件,并且如果有些人通知不到位,没有读到新信息,没有及时更新文件,并且进行了新作业,后续整理文件会不会很麻烦?
| 情况 | 很真实也很可怕 |
|---|
| 小王写着写着发你一个 V3 | '你改改,我再看' |
| 你改完发给小李 V4 | 小李说这个 V3 不行,他自己已经写好了一个 v3 |
| 小王和小李各一个 V3,你有一个在小王基础上的 v4 | 大家讨论得到,小李的 V3 确实很好,但是你的 V4 怎么办 |
| 改来改去对不上 | 最后三个人互相背锅 😩 |
这种情况下是大家没有沟通好的情况,但是发生了错误很难补救。
就算大家通过好,如果因为时间关系同时合作文件将非常地狱。
| 情况 | 很真实也很可怕 |
|---|
| 时间关系,小王,小李,你同时在 v2 上作业 | 大家需要将自己各自的作业合并为一个 v3 的作业 |
| 大家艰难的合并且细对每一个文件 | 大家发现你和小王修改了同一个文件 |
| 你和小王要各保存自己的一部分 | 冲突文件要合并修改 |
你可以把 Git 想象成一本大型练习册,每个人都可以同时写自己的那一页,不会互相抢笔。
- 小王写第一章
- 你改目录
- 小李润色结尾
- 经理审稿只看版本差异
- Git 自动把大家写的部分合起来
就像几个人一起拼拼图,不用挤一个位置。没有喊话、没有抢文件、没有版本混乱。
💡 你写你的,我写我的,最后 Git 帮大家拼好。
有时候不可能完全不重叠——你改了第三段,小李也改了第三段,那怎么办?
Git 不会让你们打架,它会说:'你们俩第 3 段写法不一样,我标出来,你们商量选哪个。'
它不会吞历史、不会乱合,也不会神秘地覆盖别人。一切公开透明、可对比、可选择。
⚙ 它不是替你做裁判,而是把分歧摆在你面前让你决定。
| 优点 | 小白理解版解释 |
|---|
| ① 不会互相覆盖 | 因为 git 可以帮你自己找出冲突,不会出现'我改了你又给我删了'的问题 |
| ② 每个人可以同时独立工作 | 不抢文件,不等别人改完才轮到你 |
| ③ 所有修改有迹可循 | 谁写了啥一清二楚,避免甩锅 |
你做你的,我做我的;最后 Git 把结果合成一个版本,历史都存着。
3. Git 的项目团队协作案例示例
| 角色 | 负责内容 |
|---|
| 小策(策划) | 关卡设计、玩法文档 |
| 小美(美术) | 坦克素材、地图贴图 |
| 小程(程序) | 代码、功能实现 |
① 小程创建项目仓库(Git 仓库 = 游戏资料大箱子)
里面有资料夹,例如:
/code 代码 /assets 美术资源 /docs 策划文档
② 每个人在各自的文件夹开发,不会互相干扰
他们不再围着一个文件夹抢,而是:
| 人 | 工作方式 |
|---|
| 小策 | 写玩法文档 → 在 docs 文件夹 |
| 小美 | 画坦克素材 → 在 art 文件夹 |
| 小程 | 写炮弹发射代码 → 在 code 文件夹 |
- 小策:文档完成 → 提交
- 小美:坦克素材打磨完 → 提交
- 小程:移动逻辑做完 → 提交
这种情况下似乎他们不会冲突、不会覆盖别人成果、每个人的贡献清清楚楚,他们只需要简单的拉取分支和提交分支就可以了。
| 角色 | 人数 | 工作内容 |
|---|
| 美术 | 2 人(小红 & 小蓝) | 坦克、地图、爆炸特效 |
| 策划 | 1 人(小白) | 玩法规则、关卡文档 |
| 程序 | 3 人(小程、小明、小涛) | 坦克移动、AI、子弹系 |
| 内容分工(各自独立) | Git 分支分法(各干一条线) |
|---|
| 小红 → 画坦克皮肤 | 在 art 文件夹 |
| 小蓝 → 做爆炸/地图素材 | 在 art 文件夹 |
| 小白 → 调规则+关卡文档 | 在 docs 文件夹 |
| 小程 → 坦克系统、子弹系统等功能 | 在 code 文件夹 |
| 小明 → AI 系统等功能 | 在 code 文件夹 |
| 小涛 → UI 客户端功能 | 在 code 文件夹 |
这种情况下可能会发生:
❌ 美术素材互相覆盖 (两位美术同时修改了某一张图片)
❌ 程序写的功能撞车、不兼容(程序同时编写了同一模块的代码)
这种情况简单的拉取分支和提交分支似乎不太够,为了更有效的管理他们的合作文件,就程序组来举例,比如小程、小明、小涛共同在 branch-code 开发游戏的代码项目,可以通过更新代码分支,拉取代码分支,添加代码分支,合并代码分支,切换代码分支等远程和本地的操作来完成自己的操作,在后面的章节中会详细讲到。
二、Git 仓库
1. 本地仓库
🟦 什么是本地仓库?
当你从远程仓库克隆项目到电脑,或自己在本地 git init 创建一个项目时,就会生成一个 本地仓库。它就像一个:
- 📌 记录你所有修改历史的私人工作区
- 📌 不联网也能使用的开发空间
- 📌 试验、备份、版本管理的多功能实验室
本地仓库 = 你自己桌面上的草稿本,
你可以改、可以写乱、可以翻以前的内容,谁也不会受影响。
等你满意后再把结果拿去'共享'——那就是 push 到远程。
🟦 本地仓库实际上包含三个区域
| Git 区域 | 理解 | 意义 |
|---|
| 工作区 Working Directory | 你的草稿纸 | 文件实际编辑的地方 |
| 暂存区 Staging Area | 草稿准备区、待提交篮子 | 想提交哪些改动先放进去 |
| 本地仓库 Local Repository | 历史记录册 | commit 后的永久版本存档 |
🟦 本地仓库能做的事
① 随时 commit,保存每一次改动历史
前面我们说了 Git 帮你保存每一次修改,并能随时回到任何一次修改。这个保存的操作就是 commit 操作,保存每一次改动历史。
你不需要等到完美再提交,只要改动完成一小步就能保存:
✔ 新增功能 → commit
✔ 调整 UI → commit
✔ 修 bug → commit
每一次都是一张'时光快照',想回滚随时回:
🌱 commit 就像给你的项目拍照片
💥 崩了?直接回到上一张照片,稳如老狗
分支是本地仓库最大自由度,这里多出来的分支,你可以看作从 copy 一份项目文件出来用于你的项目实验。
main(稳定版)
├─ try-ai-test ← 测 AI 敌人看是否好玩
├─ ui-redesign ← 改坦克 UI 但怕翻车?
└─ crazy-physics ← 胡搞弹道轨迹也不怕
🟡 不会影响主项目
🟡 不会影响队友
🟡 随时可合并 or 放弃
Git 本地仓库让探索变得无负担。你甚至可以尽情写错,因为随时回滚。
你依然可以:
✔ 查看版本历史
✔ 建分支、写代码、写策划文档
✔ commit 多次保存快照
直接在云端写代码 = 风险很大
但 Git 不允许直接改远程,而是要求先在本地完成修改。
你在本地打磨 → 测试通过 → push
这样保证提交到远程的永远是靠谱版本。
队友看到的是你思考后的结果,不是半成品或错误文件。
2. 远程仓库
🧊 什么是远程仓库?
有什么方法能给存储每个版本的文件,并且让队友也能即时看见储每个版本的文件。是的,使用网络,并且创建一个远程仓库。
远程仓库 = 把你的代码/文件存在网上,而不是只放在你电脑里。
远程仓库可以存储你每次提交的信息,并且队友也能通过远程仓库即时的看见你提交的信息。
一般靠谱的队友会把自己本地仓库深思熟虑的工作成果上传到远程仓库!
📌 换电脑也能随时拿到项目文件
📌 队友能随时一起修改项目文件
📌 本地电脑坏了文件也不会受到任何损失
🧊 远程仓库能做的事
你在本地写代码 → commit 保存 → 想共享给队友
这时你会执行 push:
push = 把你电脑里的成果上传到远程仓库,让别人也能看到。
适用场景:
✔ 完成一个功能
✔ 修完 bug
✔ 调整文档或素材
✔ 想与团队同步你的进度
当别人推送了更新,而你本地还是旧版本,你需要 pull:
pull = 把他人更新下载并合并到本地,让你保持最新进度。
适用场景:
✔ 队友开发完新模块
✔ 远程仓库有人修了冲突
✔ 有关键功能更新你要接着做
我写完 → push 上传
别人更新 → pull 下载
- 公开还是私有?
- 谁能看?
- 谁能 push?
- 谁只能 read-only?
🧊 为什么要有远程仓库?(它解决了哪些痛点)
没有远程仓库时,每个人都拿着一份项目副本,互相发压缩包、发 U 盘:
- 谁是最新版?
- 谁改的东西是对的?
- 同时改冲突怎么解决?
- 约定:以远程仓库为'唯一权威版本'
- 大家从远程拉最新 → 在本地改 → 改完再推回远程
- 团队协作就变成这样一条闭环:
远程拿 → 本地改 → 传回远程 → 别人再拿最新
- 电脑坏了、硬盘挂了、被偷了 → 项目没了
- 不小心删库 → 直接社会性死亡
你本地炸了,只要远程在,一切还在。
最多再 clone 一份下来继续干活。
- 在公司写到一半 →
push
- 回家
pull 一下 → 立刻接着写
远程仓库就是你的'云端中转站',
你在哪台电脑,就从云里把项目捞下来继续写。
- GitHub、Gitee、GitLab.com、Bitbucket(公共云)
- 公司内网 GitLab / Gitea(自建,只有员工能访问)
- 谁能访问这个仓库(公开 / 私有,成员列表)
- 谁能写(push)?谁只能看(pull)?
- 谁在什么时候提交了什么东西(提交记录 + 日志)
远程仓库 = 上锁的共享文件柜 + 自动记账本。
锁决定谁能动,记账本记录谁动过。
⑤ 驱动自动化:测试 / 部署 / 检查(进阶但很重要)
很多团队会约定:
'只要有人 push 到远程仓库,就自动触发一件事。'
- 自动跑一遍测试,看有没有写挂
- 自动构建、自动部署到测试环境 / 线上
- 自动做代码检查(lint、格式化)
也就是说:远程仓库经常是整个自动化流水线的触发点,
是'CI/CD 的起点',这一点后续进阶章节里会详细提到。
🧊 常见的 Git 远程仓库平台有哪些?
| 平台 | 类别 | 小白理解 |
|---|
| GitHub | 全球最大开源平台 | 有点像'代码界的淘宝城',啥都有 |
| Gitee(码云) | 国内平台,速度快 | 类似国产 GitHub,访问更顺畅 |
| GitLab | 企业常用,可私有部署 | 就像公司自建仓库,只员工能进 |
| Bitbucket | 程序团队多人协作多 | 小团队免费私库多,适合开发协作 |
三、Git 操作详解
现在大家理解了 Git 的主要作用,本地仓库,远程仓库,下面我通过一个简单的项目实例来讲解一下 Git 的详细操作步骤,还是坦克大战六人组。
| 角色 | 人数 | 工作内容 |
|---|
| 美术 | 2 人(小红 & 小蓝) | 坦克、地图、爆炸特效 |
| 策划 | 1 人(小白) | 玩法规则、关卡文档 |
| 程序 | 3 人(小程、小明、小涛) | 坦克移动、AI、子弹系 |
| 内容分工(各自独立) | Git 分支分法(各干一条线) |
|---|
| 小红 → 画坦克皮肤 | branch:branch-art |
| 小蓝 → 做爆炸/地图素材 | branch:branch-art |
| 小白 → 调规则+关卡文档 | branch:branch-doc |
| 小程 → 坦克系统、子弹系统等功能 | branch:branch-code |
| 小明 → AI 系统等功能 | branch:branch-code |
| 小涛 → UI 客户端功能 | branch:branch-code |
1. Git 基础操作
① git init 操作
程序员小程在自己的文件夹里创建了一个项目文件,并且项目文件是这样的:
/code 代码 /assets 美术资源 /docs 策划文档
这里仅仅是一个文件,还不是本地仓库,但是他打开终端 / Git Bash,选一个这个项目的文件夹,并输入:
② git add 操作和 git commit
| 区域 | Git 名字 | 小白理解 |
|---|
| 工作区 | Working Directory | 你实际在改的文件夹 |
| 暂存区 | Staging Area | '待提交篮子',先挑准备好的改动放进去 |
| 本地仓库 | Local Repository | 历史相册,真正永久记录改动的地方 |
git add //把改动从'工作区'放进'暂存区',为下一次 commit 做准备
git commit //把暂存区的内容打包,存进'本地仓库'变成一个历史版本
你改文件 → git add → git commit 工作区 暂存区 本地仓库
git add main.py
git add assets/
git add .
git commit -m "实现坦克移动和开火功能"
git commit -m "更新美术资源:红色坦克皮肤"
git commit -m "补充文档:第一关敌人刷怪规则"
- 当前暂存区所有文件的版本
- 提交人信息(谁)
- 提交时间(什么时候)
- 提交说明(做了什么)
- 看那时候项目长什么样
- 对比当时和现在的差别出了问题
- 可以回滚/对比排查
暂存区的作用:可以先把'确定的部分'放进暂存区,不确定的先留着
/code/move.py 已经改完了,确定没问题 ✅
/code/ai.py 还在乱试,根本写不完 ❌
git add code/move.py
git commit -m "完成坦克移动重构"
add = 我对这些改动'有信心了,准备提交'
工作区未 add 的内容 = '还在玩,还没想好,先别进历史'。
git add .
git commit -m "完成 art,code,doc 初始文件构造"
小程通过上述两部操作,完成了一次自己项目对本地仓库的提交,我们就可以通过历史记录来查看这次操作了。
③ git log 操作
git log 用来查看提交历史(commit 记录)
它就像时间轴,你能看到项目从过去到现在经历了什么改动。
commit 45bb3c4f4d...
Author: 小程 <[email protected]>
Date: 2024-01-22 16:41
"完成 art,code,doc 初始文件构造"
④ git remote add origin 操作(小白可跳过)
小程本地创建了一个 Git 仓库,并且完成了第一次提交后,他想要把这个本地仓库与远程仓库(比如 GitHub、GitLab 或 Gitee)关联起来。其通过执行 git remote add origin 命令,就可以将本地仓库与远程仓库绑定,使得后续能够方便地推送(push)和拉取(pull)代码。
git remote add origin <远程仓库地址>
git remote 是 Git 用来管理远程仓库的命令。
add 是用来添加一个新的远程仓库。
origin 是远程仓库的名称,通常使用 origin 作为默认名称,你也可以使用其他名字,但 origin 是惯例。
<远程仓库地址> 是你在 GitHub、GitLab 或 Gitee 等平台创建的仓库地址,通常是一个 URL。例如:https://github.com/your-user/your-repo.git
git remote add origin https://github.com/your-team/tank-battle-game.git
通过这个命令,本地仓库与远程仓库就建立了关联。此后,所有的 git push 和 git pull 操作都会默认对这个远程仓库进行。
⑤ git push 操作
连接远程仓库后,小程想将本地仓库的内容(提交)上传到远程仓库,这时候就要用到 git push。
git push 是将本地仓库的更改(提交)上传到远程仓库的命令。通常在完成本地开发后,想要与团队共享代码,或者备份代码到远程仓库时,会使用 git push。
git push <远程仓库名> <本地分支名>:<远程分支名>
<远程仓库名>:通常是 origin,表示你之前通过 git remote add origin 命令关联的远程仓库。
<本地分支名>:是你当前工作的本地分支名,例如 main 或 master。
<远程分支名>:远程仓库中你希望将本地分支推送到的分支名,通常和本地分支同名。
如果是第一次推送,并且本地和远程仓库的分支还没有关联,可以用:
-u 表示设置 upstream 关联,也就是说以后就可以直接用 git push 不需要再指定远程仓库和分支。
到此为止:小程建立好了本地仓库,并把仓库文件上传到远程仓库,其他队友,就可以通过远程仓库来拉取或者克隆项目了。
下面是建立仓库的流程:
你电脑里先有项目文件 ↓
git init(让文件夹变成 Git 仓库) ↓
git add + git commit ↓
再去平台创建远程仓库 ↓
git remote add origin <远程仓库地址> ↓
git push 上传到远程
⑥ git clone 操作
📍 仓库项目初始文件已建在 GitHub / GitLab / Gitee
每个人打开终端 / Git Bash,选一个放项目的文件夹:
tank-battle-game/
├── README.md
├── (之后会有)code/
├── (之后会有)assets/
└── (之后会有)docs/
这个文件夹,就是各自的本地仓库,接下来所有改动都在这里发生。
clone 可以看作:
把远程仓库完整'拷贝一份'到自己电脑上,变成本地仓库。
但这和'下载 ZIP 压缩包'相比,有两个本质区别:
- zip 只是一堆文件,没 Git 历史、不能 commit、不能 push
- clone 下来的,是一个带完整 Git 历史、可以继续版本管理的仓库
2. Git 分支操作
① git pull 操作
项目成员通过 git clone 操作在本地得到了大家共同的项目,如果后续有成员通过 git push 更新了这个项目,那我们还需要进行 git clone 来更新项目吗?不用,我们直接通过 git pull 命令来执行就可以了。
git pull = 从远程仓库拉取最新更新,并自动合并到你的本地仓库。
git fetch(从远程把更新'拉下来') + git merge(把更新合并进你的当前分支)
远程仓库(远程最新版本) ↓
fetch 本地仓库(拿到更新但还没合并) ↓
merge 你的当前分支(更新后的最终版本)
你只执行一条 pull,它内部自动帮你完成这两步。
git add assets/tank.png
git commit -m "新增蓝色坦克皮肤"
git push
下面我来详细讲一下git fetch 和 git merge
② git fetch 操作
git fetch:从远程仓库把最新的提交记录拉到本地,但不改动你当前的代码文件**。
- 它会更新
origin/main、origin/dev 等远程分支的指针
- 但它不会去改你现在正在用的分支(比如本地
main)
小白可以这么想:
把远程仓库想成 '总店账本',本地仓库是你手里的'分店账本'。
git fetch 就像:
去总店复印了一份最新账本带回店里,但你还没用它去改自己本地的账本。
你只是知道了'总店现在是什么样',
但你自己的账本还停留在原来的状态。
git fetch
git fetch origin
- 从远程仓库把最新提交记录下载下来
- 更新本地的'远程跟踪分支'
- 比如:
origin/main、origin/dev、origin/feature-xxx
- 不改变:
- 你的当前分支(如本地
main 的内容保持不变)
- 你的工作区文件(不会突然多/少东西)
'先把远程的最新情况同步到本地的数据库里,但先不动我的工作区。'
git log --oneline --graph --all
- 本地
main 在某个位置
origin/main 可能已经往前走了几步(多了几次提交)
这时候你就知道:
'远程已经更新,但我本地还没跟上。'
③ git merge 操作
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online