Git 到底是干啥的?零基础小白听完都懂了并且轻松驾驭它
git通俗的来说就是一种用来多人文件版本合作的工具但是对一些非程序员的项目小白或者没有程序基础的但是想要入行做程序员的人来说完完全全理解起来稍微有点困难。这篇文章不像很多文章一样是枯涩的码字教学。现在我们就用最通俗易懂的方式让你从零基础理解他并且使用他。这种教学方法不是把你当白痴的教学方法反而是让你快速入门深刻理解它并记住它的教学方法。因为可能说得比较详细篇幅较长还得请你耐心的把他看完。一、git的作用1、git的版本控制文件永远不会只有一个版本这句话我们似乎用亲身经历证明过。你是否有过以下经历论文会有“终稿v1、终稿v2、终稿最终版”、✍设计稿会有“改版A、改版B、改版C”、甚至自己写的文章也会来回改十几遍。更不用说单独只通过一个本地夹操刀一个大型项目了突然有一天你觉得你的论文、设计稿、文章、项目某一个节点开始脱离了原本的方向或者发生了一些错误但是你已经对其进行多处修改了单独再修改不仅费事废经历还容易发生遗漏。你或许信誓旦旦的告诉我你可以这样做。。。论文_最终v1.docx论文_最终_改过的v2.docx论文_最终2_真的最终.docx论文_最终最终版_别改了.docx论文_最终最终版_真的别改了_last.docx不仅每次要单独保存文件还容易忘甚至最后你已经分不清哪个是最新版哪个删了重点改了什么东西。而且这种方法对于大型的项目来说。。。或许聪明的你想到了如果我当前的文件如果能像游戏里的存档点。保存一下是一个点明天再改它又是一个点。你死了改错了读档就行。这样就好了 是的这就是Git做的事情之一帮你保存每一次修改并能随时回到任何一次修改并帮你的记录理了一个时间线。你可以把Git理解成一个“文件历史的照相机”你每改一次资料Git就悄悄拍一张照片你还可以在照片背面写上备注第一天写了初稿 咔留了一版这是我的初稿哦第二天删了两段 又拍一张第三四段不太通顺我删掉啦第三天修改标题 再拍一张修改了标题第四天添加了新内容再拍一张增加了”女主爆甩男主的情节“第五天写完稿子最后拍一张完稿如果第四天你突然后悔“我觉得还是第一天写得好”没关系——Git把每一张“版本照片”都替你保存着你可以把你的文件直接穿越回第一天。你只要知道改文件 → Git记一次改错了 → Git带你回去文件乱了 → Git给你旧版本一切可撤回、可穿越、可找回你现在应该理解了git可以给文件的版本理一个时间线并且备注当前版本的改动除了记录文件内容本身他还记录了哪些东西改了文件提交Git记录了哪些东西Git通常管理的是一个项目文件夹这个文件夹在Git里叫“仓库”。一次提交可以同时包含新增了哪些文件删除了哪些文件哪些文件被修改谁进行了修改为什么修改这次修改发生在上一版本之后Git会为整个项目建立一条可以追溯的修改历史即每个时间点的改动细则我们都可以看到有了这些东西不仅仅方便个人对项目存档也方便了对团队的合作2、git的团队合作如果你一个人写文档Git能当备份器。当多人写文档或者项目那我们就需要通过git得到一个共享的当前版本。三个人一起写同一个方案文档或者项目如果不用Git会怎样假设三个人一起在V2文档上作业情况一情况很真实也很可怕小王写着写着发你一个V3“你改改我再看”你在小王V3的基础上做V4小李没有看到最新消息手里还拿着之前的 V2继续修改了一下午三份文件互相不一样可能造成团队有人不知道谁是最新版最后大家互相讨论将v4作为最新版大家同时将你文件里的v4更新为自己的最新版本这种情况下如果项目很多人大家都要下载更新文件并且如果有些人如果通知不到位没有读到新信息没有及时更新文件并且进行了新作业后续整理文件会不会很麻烦情况二情况很真实也很可怕小王写着写着发你一个V3“你改改我再看”你改完发给小李V4小李说这个V3不行他自己已经写好了一个v3小王和小李各一个V3你有一个在小王基础上的v4大家讨论得到小李的V3确实很好但是你的V4怎么办改来改去对不上最后三个人互相背锅 这种情况下是大家没有沟通好的情况两个人同时修改产生了两个“最新版”并导致后续继续产生无用功情况三就算大家通过好如果因为时间关系同时合作文件将非常地狱情况很真实也很可怕时间关系小王小李你同时在v2上作业大家需要将自己各自的作业合并为一个v3的作业大家艰难的合并且细对每一个文件大家发现你和小王修改了同一个文件你和小王要各保存自己的一部分文件要合并修改这时候不能简单地说“谁最后保存谁就覆盖前面的人。”因为两个人的修改都可能有价值。这就是多人协作中非常典型的冲突Conflict而 Git 的出现就是为了结束混乱。用Git每个人都能同时做事每个人都有一本完整的练习册副本。每个人都可以同时写自己的那一页不会互相抢笔。小王修改第一章你修改目录小李修改最后一章经理只查看大家具体改了哪些内容。如果修改的是不同位置Git 通常可以自动完成合并。例如小王修改 a.txt你修改 b.txt小李修改 c.txt因为大家没有修改同一个地方Git 很容易把这些修改合并起来最终版本├── 小王修改的 a.txt├── 你修改的 b.txt└── 小李修改的 c.txt所以团队不需要不断互相发送V3.zipV4.zipV5最终.zipV5最终修改.zip每个人只需要管理自己的修改然后通过 Git 把修改同步到团队仓库。你写你的我写我的最后Git帮大家拼好。 就算冲突了Git也能帮你处理例如你和小李同时修改了同一个文件里的第三段。你的版本Git 非常适合团队开发。小李的版本Git 非常适合大型团队协作。Git 无法判断到底谁写得更好因为这是业务判断不是技术问题。所以 Git 不会擅自覆盖其中一个版本。它会告诉你这里发生冲突了两个人都修改了同一个位置请决定最终保留什么内容。Git 会把冲突位置标记出来然后由开发者决定保留你的版本保留小李的版本两个版本都保留所Git 的作用不是帮你决定谁对谁错。而是准确告诉你冲突发生在哪里并保证双方的修改都不会悄悄消失。团队用Git的三个大优点优点解释① 不会互相覆盖因为git可以帮你自己找出冲突不会出现“我改了你又给我删了”的问题② 每个人可以同时独立工作不抢文件不等别人改完才轮到你③ 所有修改有迹可循谁写了啥一清二楚避免甩锅一句话总结你做你的我做我的最后Git把结果合成一个版本历史都存着。合作从“混乱”变成“有序”3、git的项目团队协作的案例示例三个人一起做《坦克大战》游戏项目团队组成如下假设我们有一个三人小组角色负责内容小策策划关卡设计、玩法文档小美美术坦克素材、地图贴图小程程序代码、功能实现他们三个人像这样分工并协作① 小程创建项目仓库里面有资料夹例如/code 代码 /assets 美术资源 /docs 策划文档② 每个人在各自的文件夹开发不会互相干扰人工作方式小策写玩法文档 → 在 docs 文件夹小美画坦克素材 → 在 art 文件夹小程写炮弹发射代码 → 在 code文件夹当他们开发好一部分功能或内容时小策文档完成 → 提交小美坦克素材打磨完 → 提交小程移动逻辑做完 → 提交这种情况下似乎他们不会冲突、不会覆盖别人成果、每个人的贡献清清楚楚他们只需要简单的拉取分支和提交分支就可以了。git直接帮他们合并并记录他们所提交的内容接下来是更复杂的情况团队组成如下角色人数工作内容美术2人小红 小蓝坦克、地图、爆炸特效策划1人小白玩法规则、关卡文档程序3人小程、小明、小涛坦克移动、AI、子弹系为了避免抢文件他们这样分工 内容分工各自独立Git 分支分法各干一条线小红 → 画坦克皮肤在 art文件夹小蓝 → 做爆炸/地图素材在 art文件夹小白 → 调规则关卡文档在 docs 文件夹小程 → 坦克系统、子弹系统等功能在 code文件夹小明 → AI系统等功能在 code文件夹小涛 → UI客户端功能在 code文件夹这种情况下可能会发生❌ 美术素材互相覆盖(两位美术同时修改了某一张图片❌ 程序写的功能撞车、不兼容程序同时编写了同一模块的的代码这种情况简单的拉取分支和提交分支似乎不太够为了更有效的管理他们的合作文件就程序组来举例比如小程、小明、小涛共同在brach-code开发游戏的代码项目可以通过更新代码分支拉取代码分支添加代码分支合并代码分支切换代码分支等远程和本地的操作来完成自己的操作在后面的章节中会详细讲到二、git仓库1、本地仓库 什么是本地仓库当你从远程仓库克隆项目到电脑或自己在本地git init创建一个项目时就会生成一个本地仓库它就像一个 记录你所有修改历史的私人工作区 不联网也能使用的开发空间 试验、备份、版本管理的多功能实验室用更贴近日常的小比喻本地仓库 你自己桌面上的草稿本你可以改、可以写乱、可以翻以前的内容谁也不会受影响。等你满意后再把结果拿去“共享”——那就是 push 到远程。 本地仓库实际上包含三个区域Git区域理解意义工作区 Working Directory你的草稿纸文件实际编辑的地方暂存区 Staging Area草稿准备区、待提交篮子想提交哪些改动先放进去本地仓库 Local Repository历史记录册commit 后的永久版本存档本地仓库能做的事①随时 commit保存每一次改动历史前面我们说了git帮你保存每一次修改并能随时回到任何一次修改这个保存的操作就是commit操作保存每一次改动历史你不需要等到完美再提交只要改动完成一小步就能保存✔ 新增功能 → commit✔ 调整UI → commit✔ 修bug → commit②可以无限分支做实验安全无风险分支是本地仓库最大自由度这里多出来的分支你可以看作从copy一份项目文件出来用于你的项目实验示例main稳定版 ├─ try-ai-test ← 测AI敌人看是否好玩 ├─ ui-redesign ← 改坦克UI但怕翻车 └─ crazy-physics ← 胡搞弹道轨迹也不怕无论试验多疯 不会影响主项目 不会影响队友 随时可合并 or 放弃Git本地仓库让探索变得无负担。你甚至可以尽情写错因为随时回滚。③ 本地仓库可以脱离网络使用想象你坐高铁、去咖啡馆断网、飞机上开发你依然可以✔ 查看版本历史✔ 建分支、写代码、写策划文档✔ commit 多次保存快照④ 推送前可以自查不会破坏主项目直接在云端写代码 风险很大但 Git 不允许直接改远程而是要求先在本地完成修改你在本地打磨 → 测试通过 → push这样保证提交到远程的永远是靠谱版本队友看到的是你思考后的结果不是半成品或错误文件2、远程仓库 什么是远程仓库有什么方法能给存储每个版本的文件并且让队友也能即时看见储每个版本的文件。是的使用网络并且创建一个远程仓库。远程仓库 把你的代码/文件存在网上而不是只放在你电脑里。远程仓库可以存储你每次提交的信息并且队友也能通过远程仓库即时的看见你提交的信息一般靠谱的队友会把自己本地仓库深思熟虑的工作成果上传到远程仓库这样做最重要的作用是 换电脑也能随时拿到项目文件 队友能随时一起修改项目文件 本地电脑坏了文件也不会受到任何损失远程仓库能做的事① 本地代码推送到远程仓库push你在本地写代码 → commit 保存 → 想共享给队友这时你会执行pushpush 把你电脑里的成果上传到远程仓库让别人也能看到。适用场景✔ 完成一个功能✔ 修完 bug✔ 调整文档或素材✔ 想与团队同步你的进度② 从远程拉取最新代码到本地pull当别人推送了更新而你本地还是旧版本你需要pullpull 把他人更新下载并合并到本地让你保持最新进度。适用场景✔ 队友开发完新模块✔ 远程仓库有人修了冲突✔ 有关键功能更新你要接着做一句话总结 ①②我写完 → push 上传别人更新 → pull 下载③支持权限管理决定谁能访问/修改你可以设置公开还是私有谁能看谁能 push谁只能 read-only为什么要有远程仓库它解决了哪些痛点这里对小白略抽象可以快速看一遍尽量理解实在看不懂没关系你就当我水字数① 做多人协作的「中心版本库」没有远程仓库时每个人都拿着一份项目副本互相发压缩包、发U盘谁是最新版谁改的东西是对的同时改冲突怎么解决一团乱。有了远程仓库之后约定以远程仓库为“唯一权威版本”大家从远程拉最新 → 在本地改 → 改完再推回远程团队协作就变成这样一条闭环远程拿 → 本地改 → 传回远程 → 别人再拿最新所以你可以这么形容远程仓库是这个项目的“大家都认的源头版本”。② 做项目的「安全备份」只放在本地会怎样电脑坏了、硬盘挂了、被偷了 → 项目没了不小心删库 → 直接社会性死亡而远程仓库在云端服务器上通常会异地备份RAID 磁盘阵列运维团队守着你本地炸了只要远程在一切还在。最多再clone一份下来继续干活。③做多设备之间的「同步枢纽」你可能不止一台设备公司电脑家里电脑笔记本 / iPad有了远程仓库流程变成在公司写到一半 →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 分支分法各干一条线小红 → 画坦克皮肤branchbrach-art小蓝 → 做爆炸/地图素材branchbrach-art小白 → 调规则关卡文档branchbrach-doc小程 → 坦克系统、子弹系统等功能branchbrach-code小明 → AI系统等功能branchbrach-code小涛 → UI客户端功能branchbrach-code1、git基础操作①git init操作程序员小程在自己的文件夹里创建了一个项目文件并且项目文件是这样的/code 代码 /assets 美术资源 /docs 策划文档这里仅仅是一个文件还不是本地仓库但是他打开终端 / Git Bash选择这个项目的文件夹,并输入git init让文件夹变成Git仓库这时候小程就有属于自己的本地仓库了然后可以让git给你记录快照给你记录文件的时间线②git add操作和git commit创好本地仓库后再来回顾一下本地仓库的三层区域区域Git 名字小白理解工作区Working Directory你实际在改的文件夹暂存区Staging Area“待提交篮子”先挑准备好的改动放进去本地仓库Local Repository历史相册真正永久记录改动的地方git add //把改动从“工作区”放进“暂存区”为下一次 commit 做准备 git commit //把暂存区的内容打包存进“本地仓库”变成一个历史版本一张简化流程就是你改文件 → git add → git commit工作区 暂存区 本地仓库git add 命令示例git add main.py # 把 main.py 的修改放入暂存区 git add assets/ # 把 assets 目录下所有变化加入暂存区 git add . # 把当前目录所有变更都加入暂存区我们把暂存取准备好的东西通过提交到本地仓库本地仓库咔的一声为我们留了一个历史版本git commit命令示例git commit -m 实现坦克移动和开火功能 git commit -m 更新美术资源红色坦克皮肤 git commit -m 补充文档第一关敌人刷怪规则一个 commit 会包含当前暂存区所有文件的版本提交人信息谁提交时间什么时候提交说明做了什么以后你可以回到这个 commit看那时候项目长什么样对比当时和现在的差别出了问题可以回滚/对比排查暂存区的作用可以先把“确定的部分”放进暂存区不确定的先留着比如你还在试验一半/code/move.py 已经改完了确定没问题 ✅/code/ai.py 还在乱试根本写不完 ❌你可以git add code/move.py # 这部分先纳入提交计划 # ai.py 先别管 git commit -m 完成坦克移动重构 | # ai.py 继续改改爽再说add我对这些改动“有信心了准备提交”工作区未 add 的内容 “还在玩还没想好先别进历史”。回到小程那里git add . #把artcodedoc文件放入缓存区 git commit -m 完成artcodedoc初始文件构造 #这样小程就把自己的初始缓存项目放入缓冲区了小程通过上述两部操作完成了一次自己项目对本地仓库的提交我们就可以通过历史记录来查看这次操作了③git log操作git log用来查看提交历史commit 记录它就像时间轴你能看到项目从过去到现在经历了什么改动。执行git log你就可以看见一下记录commit 45bb3c4f4d... Author: 小程 chengtank.com Date: 2024-01-22 16:41 完成artcodedoc初始文件构造④git remote add origin操作小程本地创建了一个 Git 仓库并且完成了第一次提交后他想要把这个本地仓库与远程仓库比如 GitHub、GitLab 或 Gitee关联起来。其通过执行git remote add origin命令就可以将本地仓库与远程仓库绑定使得其他成员通过这个远程仓库获取到小程创建的代码文件。命令格式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 pushgit push是将本地仓库的更改提交上传到远程仓库的命令。通常在完成本地开发后想要与团队共享代码或者备份代码到远程仓库时会使用git push。命令格式git push 远程仓库名 本地分支名:远程分支名 远程仓库名通常是 origin表示你之前通过 git remote add origin 命令关联的远程仓库。 本地分支名是你当前工作的本地分支名例如 main 或 master。 远程分支名远程仓库中你希望将本地分支推送到的分支名通常和本地分支同名。如果是第一次推送并且本地和远程仓库的分支还没有关联可以用git push -u origin main其中-u表示设置 upstream 关联也就是说以后就可以直接用git push不需要再指定远程仓库和分支。到此为止小程建立好了本地仓库并把仓库文件上传到远程仓库其他队友就可以通过远程仓库来拉取或者克隆项目了。下面是建立仓库的流程你电脑里先有项目文件 ↓ git init让文件夹变成Git仓库 ↓ git add git commit ↓ 再去平台创建远程仓库 ↓ git remote add origin 远程仓库地址 ↓ git push 上传到远程⑥git clone操作仓库项目初始文件已建在 GitHub / GitLab / Gitee每个人打开终端 / Git Bash选一个放项目的文件夹git clone 远程仓库地址 # 比如 # git clone https://github.com/your-team/tank-battle-game.git执行完后他们的电脑里就多了一个文件夹tank-battle-game/ ├── README.md ├── 之后会有code/ ├── 之后会有assets/ └── 之后会有docs/这个文件夹就是各自的本地仓库接下来所有改动都在这里发生。这一步叫clone克隆clone可以看作把远程仓库完整“拷贝一份”到自己电脑上变成本地仓库。这和“下载 ZIP 压缩包”相比有两个本质区别zip 只是一堆文件没 Git 历史、不能 commit、不能 pushclone 下来的是一个带完整 Git 历史、可以继续版本管理的仓库2、git分支操作①git pull 操作项目成员通过git clone操作在本地得到了大家共同的项目如果后续有成员通过git push更新了这个项目那我们还需要进行git clone来更新项目吗不用我们直接通过git pull命令来更新最新的项目到本地。git pull 从远程仓库拉取最新更新并自动合并到你的本地仓库。git pull 实际发生了两件事git pull其实是两个命令的合体git fetch 从远程把更新”拉下来“ git merge 把更新合并进你的当前分支所以 pull fetch merge流程示意远程仓库远程最新版本 ↓ fetch 本地仓库拿到更新但还没合并 ↓ merge 你的当前分支更新后的最终版本你只执行一条 pull它内部自动帮你完成这两步。假设队友小红通过以下操作推了新的坦克皮肤git add assets/tank.png git commit -m 新增蓝色坦克皮肤 git push你只需输入git pull本地立刻出现/assets/tank.png ✔下面我来详细讲一下git fetch 和 git merge②git fetch 操作git fetch只“拿”不“动”一句话解释git fetch从远程仓库把最新的提交记录拉到本地但不改动你当前的代码文件**。也就是说它会更新origin/main、origin/dev等远程分支的指针但它不会去改你现在正在用的分支比如本地main小白可以这么想:把远程仓库想成 “总店账本”本地仓库是你手里的“分店账本”。git fetch就像去总店复印了一份最新账本带回店里但你还没用它去改自己本地的账本。你只是知道了“总店现在是什么样”但你自己的账本还停留在原来的状态。实际会发生什么执行git fetch # 或者更明确一点 git fetch originGit 会做几件事从远程仓库把最新提交记录下载下来更新本地的“远程跟踪分支”比如origin/main、origin/dev、origin/feature-xxx不改变你的当前分支如本地main的内容保持不变你的工作区文件不会突然多/少东西你可以理解为“先把远程的最新情况同步到本地的数据库里但先不动我的工作区。”查看 fetch 之后的情况你可以用git log --oneline --graph --all看到本地main在某个位置origin/main可能已经往前走了几步多了几次提交这时候你就知道“远程已经更新但我本地还没跟上。”③ git merge 操作前面我们说过git fetch把远程最新情况拿回来但不修改当前分支。git merge把另一条开发线的成果合并进当前分支。小白可以这样理解fetch是先把队友的新作业拿到手里merge是把队友的作业正式整理进自己的作业。假设小程当前位于本地main分支远程的origin/main已经更新。先执行git fetch origin此时只是更新了本地保存的远程分支信息工作区还没有变化。查看双方差异git log --oneline --graph --all git diff main..origin/main确认没有问题后将远程更新合并到当前分支git merge origin/main如果本地没有额外提交Git 通常只需要把分支指针向前移动这叫作“快进合并”也就是 fast-forward。如果本地和远程都有新提交Git 会尝试把两边的内容合在一起。合并成功时如果小程修改了坦克移动代码小明修改了敌人 AI而且双方没有修改同一处内容Git 通常能自动完成合并小程的修改 ─┐ ├─ 合并后的新版本 小明的修改 ─┘终端可能显示Merge made by the ort strategy.这表示合并已经完成。发生冲突时假设小程和小明同时修改了code/config.py中的同一行小程写的是TANK_SPEED 8小明写的是TANK_SPEED 10Git 不知道游戏最终应该采用哪个速度于是会暂停合并并在文件中标出冲突 HEAD TANK_SPEED 8 TANK_SPEED 10 origin/main它们分别表示 HEAD到当前分支里的内容到准备合并进来的内容。这时需要开发者讨论并手动修改。例如最终决定使用TANK_SPEED 9修改完成后删除 Git 生成的冲突标记再执行git add code/config.py git commit -m 解决坦克速度配置冲突至此冲突就解决了。如果发现这次合并不应该继续可以取消尚未完成的合并git merge --abort记住Git 能发现冲突、标记冲突但最终保留什么内容需要人来决定。④ git pull 操作的完整理解现在我们可以重新理解git pullgit pull它相当于告诉 Git先获取远程更新再把更新整合到我当前的分支。入门阶段可以把它近似理解为git fetch git merge不过实际使用哪种整合方式还会受到 Git 配置和命令参数影响。为了避免意外生成合并提交小白可以先使用git pull --ff-only它表示只有当前分支能够直接快进时才更新如果本地和远程已经各自发展就先停止让我自己处理。如果命令失败可以先查看情况git status git log --oneline --graph --all不要一看到报错就随便执行强制覆盖命令。3、分支详细操作① 查看分支查看本地分支git branch查看本地和远程的全部分支git branch -a当前所在分支前面会出现一个星号* main feature/tank-movement feature/enemy-ai② 创建并切换分支假设小明要开发敌人 AI不应该直接在稳定的main分支上乱改而是创建自己的功能分支git switch -c feature/enemy-ai这条命令做了两件事创建feature/enemy-ai分支切换到这个分支。旧版本 Git 也常见下面的写法git checkout -b feature/enemy-ai之后小明就可以在该分支开发git add code/enemy_ai.py git commit -m 实现敌人基础追踪逻辑这些提交暂时只影响feature/enemy-ai不会改变main。③ 切换分支切换回主分支git switch main再次切换到 AI 分支git switch feature/enemy-ai切换前最好先运行git status如果存在尚未提交的修改Git 可能拒绝切换或者这些修改可能跟着进入另一个分支。因此建议先提交、暂存或妥善处理当前修改。④ 把功能分支合并到 mainAI 功能完成并通过测试后先切换到要接收修改的分支git switch main再执行git merge feature/enemy-ai注意顺序先站到“接收成果”的分支再把“提供成果”的分支合进来。合并并确认无误后可以删除本地功能分支git branch -d feature/enemy-ai如果分支还没有被合并-d通常会拒绝删除从而保护你的工作。⑤ 把分支推送到远程本地创建的新分支不会自动出现在远程仓库需要执行git push -u origin feature/enemy-ai设置上游关联以后在这个分支上通常可以直接使用git push git pull4、撤销错误操作Git 被称为“后悔药”但不同阶段要使用不同命令。① 文件改错了但还没有 git add恢复某个文件git restore code/config.py这会丢弃该文件尚未暂存的修改使用前一定要确认这些内容确实不要了。② 已经 git add但还没有 commit把文件移出暂存区同时保留工作区中的修改git restore --staged code/config.py它的意思是这次先别提交但我刚才写的内容仍然保留。③ 已经 commit但还没有推送如果只是提交说明写错可以修改最近一次提交git commit --amend如果提交已经推送并被队友使用不要随意重写历史。更安全的做法通常是git revert 提交编号git revert会创建一个新的提交用来抵消旧提交的影响不会偷偷删除公共历史。git revert 官方文档5、使用 .gitignore 忽略不该提交的文件项目中有些文件不应该提交例如Python 缓存编译产物IDE 临时配置日志文件本地环境文件包含密码或密钥的配置。可以在项目根目录创建.gitignore# Python 缓存 __pycache__/ *.pyc # 虚拟环境 .venv/ venv/ # 日志 *.log # 本地环境变量 .env # IDE 配置 .vscode/ .idea/但要特别注意.gitignore只能阻止尚未被 Git 跟踪的文件。如果文件已经提交过仅仅把它写进.gitignore并不会自动删除历史记录。如果密码、Token 或密钥已经提交到远程应立即作废并更换不能只删除文件就认为安全了。6、小白最实用的团队协作流程日常开发可以记住下面这套流程# 1. 切换到主分支 git switch main # 2. 获取最新代码 git pull --ff-only # 3. 创建自己的功能分支 git switch -c feature/tank-fire # 4. 修改文件后查看状态 git status git diff # 5. 暂存并提交 git add code/tank_fire.py git commit -m 实现坦克开火功能 # 6. 推送功能分支 git push -u origin feature/tank-fire接着在 GitHub、GitLab 或 Gitee 上发起 Pull Request 或 Merge Request让队友检查代码。确认没有问题后再合并到main。一句话总结先同步主分支 → 创建功能分支 → 小步提交 → 推送远程 → 发起合并请求 → 审查后合并。四、全文最终总结学到这里你已经掌握了 Git 最核心的一条工作链修改文件 ↓ git status / git diff ↓ git add ↓ git commit ↓ git pull 或 git fetch ↓ 解决可能出现的冲突 ↓ git pushGit 并不是一堆需要死记硬背的命令。它真正解决的是三个问题我改了什么我怎样保留一个可靠版本我和队友怎样安全地合并成果只要牢牢记住工作区负责修改暂存区负责挑选本地仓库负责记录远程仓库负责共享。那么 Git 就不再是一套晦涩的命令而会变成你开发项目时最可靠的“时间机器”和“协作账本”。