01 — 版本控制是什么?为什么你需要 Git

📅 发布时间:2026/8/7 11:35:45
01 — 版本控制是什么?为什么你需要 Git
01 — 版本控制是什么为什么你需要 Git写在前面这一章要解决什么你大概听过「Git」「GitHub」这些词但不知道它们到底是干嘛的。这一章不讲任何命令细节只帮你搞清楚三件事学完后你应该能用自己的话说出「版本控制」解决了什么问题分清 Git 和 GitHub 的区别很多人搞混在自己电脑上装好 Git配好基本信息跑出第一个空仓库读者设定大一同学没有任何项目经验甚至不确定 Git 是不是一个网站。1. 定位为什么要先搞懂概念1.1 一句话先记住Git 是帮你记住文件每一次改动的工具就像游戏里的自动存档。打游戏的时候如果你走到一个存档点不存档后面挂了就只能从头来。写代码也一样——如果你改了一下午的代码运行崩了没有「存档点」就只能凭记忆手动改回去。Git 就是帮你自动打存档点的工具。1.2 没有 Git 会怎样你可能觉得「我不写代码用不到这个」。但想想这些场景场景没有 Git 时你会怎么做会出现什么问题论文改了 5 版发现第 2 版更好文件名写成论文-最终版-真的最终.docx文件越堆越多找不到想要的那版小组作业三个人各自改了一份微信群里传来传去谁也不知道哪个是最新版改了一下午代码运行崩了盯着屏幕手动回忆改了啥大概率改不回来心态崩想试一个新写法又怕把能跑的版本改坏整个文件夹复制一份叫「备份」磁盘堆满备份改完不知道怎么合回去换了台电脑想继续昨天的活用 U 盘拷来拷去容易覆盖、容易丢Git 把这些问题都变成了一个简单的动作打存档。你想存就存随时翻回任何一个存档点多人也不怕互相覆盖。1.3 和你已经会的事对比你已经会的和 Git 的相似点和 Git 的不同点编辑器的撤销CtrlZ都能「回到之前的状态」撤销只能回退几步Git 能回到任意历史时刻另存为新文件都保留了旧版本另存为会堆一堆文件Git 整齐地存在一个地方网盘的历史版本都有版本记录网盘只能一个人用Git 天生为多人协作设计游戏存档都能读档游戏存档只有一条线Git 可以同时存好几条线分支核心理解Git 存的不是「改了什么」而是「每次改完之后所有文件长什么样」——就像游戏存档存的是「此时此刻的完整画面」。2. 本质Git 到底是什么2.1 先搞清一个常见误解Git 不是网站。很多人以为 Git 就是 GitHub这就像以为「电饭锅」就是「共享厨房」——Git是装在你自己电脑上的工具离线也能用GitHub是一个网站让你把代码放到网上和大家共享你可以只用 Git 完全不碰 GitHub前五章都不需要联网也可以把代码推到 GitHub 方便多人协作。2.2 Git 的核心特点用大白话说Git 有三个最关键的特点特点白话解释对你意味着什么分布式每个人的电脑上都有完整的历史不怕断网不怕服务器挂存快照每次存档保存的是完整的文件状态不用担心只存了差异翻旧版很快分支便宜开一条新分支就像贴一张便利贴想试新写法随时开分支不怕改坏主代码图分布式版本控制——每个人都有完整的历史副本。来源Pro GitCC BY-NC-SA 3.0。2.3 三种版本控制模式了解即可版本控制不是从 Git 才有的它经历了三个阶段模式打个比方最大问题本地版本控制把日记本锁自己抽屉里只能在一台电脑上用集中式版本控制大家都去图书馆借同一本书图书馆关门了服务器挂了谁也干不了活分布式版本控制Git每人手里都有一本完整的书单台机器坏了不怕别人那里还有图本地版本控制——只有自己机器上有历史。图集中式版本控制——所有历史存在中央服务器上。署名说明以上三张图来自 Pro Git 一书CC BY-NC-SA 3.0。详见assets/diagrams/ATTRIBUTION.md。2.4 Git 是怎么来的2005 年Linux 内核的开发团队遇到了一个问题他们之前用的版本控制工具叫 BitKeeper不再免费给他们用了。Linux 内核由全球几千人协作开发急需一个替代品。Linus Torvalds就是创造 Linux 的那个人花了两周时间自己写出了 Git 的第一版。他对 Git 的要求很简单需求为什么要快Linux 内核太大了慢了没人用离线也能用贡献者遍布全球不是人人都在公司内网开分支要便宜几千人在同时开发不同功能开源免费Linux 本身就是开源的这些当初为了 Linux 内核设计的特点今天每一个都帮到了你——在你自己电脑上就能提交代码随时开分支完全不花钱。图版本控制工具的发展时间线。2.5 为什么大家都用 Git你可能会问工具那么多为什么偏偏 Git 最流行三个原因真的好用开分支不要钱、断网也能提交、速度飞快GitHub 带飞2008 年 GitHub 上线让 Git 从「命令行工具」变成「社交平台」大家都在上面你也得在学校和公司都要求招聘启事写「熟悉 Git」课程作业要求用 Git 提交不用反而更麻烦3. Git 能帮你做什么按场景你想做的事用 Git 怎么做详细章节把当前状态存下来git addgit commit第 03 章看看之前存了哪些档git log第 03 章回到之前某个存档点git restore/git reset第 04 章试试新写法不影响主代码git branchgit switch第 05 章把新写法合回主代码git merge第 05 章把代码放到网上和同学共享git push第 06 章拿到同学的代码git pull第 06 章临时藏起没写完的代码git stash第 07 章给某个重要版本打个标签git tag第 07 章现在不用记住这些命令后面每一章都会带着你一步步操作。这里先有个印象就行。4. 动手准备安装和配置4.1 安装 Git系统怎么装Windows去 git-scm.com 下载安装包一路下一步就行macOS打开终端输入git系统会自动提示你安装Linux用包管理器安装比如 Ubuntu 执行sudo apt install git4.2 检查有没有装好打开终端Windows 上叫「Git Bash」输入git--version如果看到类似这样的输出就说明装好了git version 2.43.0你看到的版本号可能不一样没关系只要是 2.x 就行。4.3 配置你的身份必须做Git 每次存档都会记录「是谁存的」所以你得先告诉 Git 你叫什么gitconfig--globaluser.name你的名字gitconfig--globaluser.email你的邮箱gitconfig--globalinit.defaultBranch main白话翻译这三条命令命令白话意思git config --global user.name 你的名字以后我存的档作者写「你的名字」git config --global user.email 你的邮箱我的联系邮箱是「你的邮箱」git config --global init.defaultBranch main新建仓库时默认分支叫 main而不是旧式的 master几点注意名字和邮箱不用真实信息也行练习时可以用假的名字和邮箱但如果以后要往 GitHub 推代码邮箱要和 GitHub 注册邮箱一致这三条命令只需要执行一次以后就不用再输了4.4 检查配置有没有生效gitconfig--global--list如果看到类似下面的输出就对了user.name你的名字 user.email你的邮箱 init.defaultbranchmain4.5 创建你的第一个仓库「仓库」就是 Git 管理的文件夹。我们建一个试试mkdirlearn-git-01cdlearn-git-01gitinit-bmain你会看到Initialized empty Git repository in /path/to/learn-git-01/.git/白话翻译Git 在这个文件夹里建了一个隐藏的.git目录以后这个文件夹里的所有改动Git 都会帮你记录。看看当前状态gitstatus输出On branch main No commits yet nothing to commit (create/copy files and use git add to track)白话翻译「On branch main」—— 你现在在 main 这条分支上「No commits yet」—— 还没有任何存档「nothing to commit」—— 暂时没有需要存的东西5. 几个必须要知道的前提知识5.1 「保存」不等于「提交」这是新手最容易踩的坑你以为的实际上在编辑器里按 CtrlS 就是存档了CtrlS 只是保存到硬盘Git 完全不知道文件改了就自动进 Git 了必须手动git addgit commit才算存档流程是这样的你改了文件按 CtrlS 保存到硬盘 ← 这是编辑器的活你用git add挑出想存档的文件 ← 这是你的选择你用git commit打存档 ← 这才是 Git 的活5.2 Git 和 GitHub 不是一回事GitGitHub装在你电脑上的工具一个网站离线也能用必须联网用来记录文件变化用来存放和共享代码免费、开源基本功能免费高级功能收费打个比方Git 是电饭锅GitHub 是共享厨房。你在家用电饭锅煮饭本地用 Git也可以把饭端到共享厨房给大家尝推到 GitHub。5.3 不要把密码放进仓库Git 的历史是永久的——一旦你把密码提交进去就算后来删了文件历史里还是能看到。所以密码、密钥、token 这些东西永远不要提交用.gitignore文件告诉 Git「这些文件别管我」习惯用环境变量存密码后面会讲6. 命令一览按用途分组不用背先有个印象就行配置相关命令用途git config --global 键 值设置全局配置git config --global --list查看全局配置git config --list --show-origin查看配置从哪来的仓库相关命令用途git init -b main新建仓库git clone 网址从网上下载已有仓库第 06 章查看相关只读不会改任何东西命令用途git status看当前状态最常用的命令git log看历史存档git diff看文件改了什么帮助相关命令用途git help 命令打开详细帮助文档git 命令 -h看简短帮助7. 对照表帮你理清容易混淆的概念Git vs GitHub维度GitGitHub是什么命令行工具网站装在哪你自己电脑上互联网上离线能用吗能不能必须注册吗不用要注册账号提交代码git commit本地通过git push推上去提交 vs 保存 vs 备份动作记录了「为什么改」吗能回到过去吗多人能协作吗编辑器保存CtrlS不能不能不能复制文件夹备份不能勉强能不能Git 提交commit能你要写提交说明能能8. 安全习惯硬规矩8.1 一定要做的规矩为什么第一次提交前先配置好名字和邮箱不然提交记录里没有作者信息练习时用单独的文件夹不怕搞坏删了重来就行每次操作后跑git status养成好习惯随时知道当前状态默认分支名用main和 GitHub 等平台保持一致8.2 绝对不要做的禁忌后果正确做法在真实项目上练破坏性命令可能把代码搞丢用learn-git-xxx专门练习把密码提交进仓库密码永久留在历史里用.gitignore排除以为在编辑器里保存就是提交了改动根本没进 Git必须addcommit和同学共用一个 Git 账号提交记录分不清谁是谁各用各的账号9. 真实场景场景一新学期开始写作业开学了老师让你用 Git 交作业。你需要安装 Git配置名字和邮箱建一个文件夹git init变成仓库写完作业后git addgit commit打存档如果需要推到 GitHubgit push推上去场景二小组合作做项目三个人一起做期末项目每人从 GitHub 上git clone下载代码各自在自己电脑上改代码改完后git push推到网上其他人git pull拉取最新代码如果两个人同时改了同一个文件Git 会提示冲突第 05 章讲怎么解决场景三自己写代码怕改坏你写了一个能跑的程序但想试试新功能开一条新分支git branch try-new-feature切到新分支上改代码git switch try-new-feature改坏了切回主分支就行主代码完好无损改好了把新分支合并回主分支10. 进阶补充首读可跳过10.1 「分布式」不等于「没规矩」分布式不是说大家随便乱推代码。团队里仍然有规矩主分支受保护、改动要经过审查Pull Request、不能随意覆盖别人的提交。Git 给你自由团队给你纪律。10.2 配置文件存在哪作用域位置谁优先全局--global用户主目录下的配置文件中等本地--local仓库里的.git/config最高覆盖全局系统--system安装目录最低用git config --list --show-origin可以看每个配置值来自哪个文件。10.3 Git 存储的直觉Git 不是存「改了什么」而是存「改完之后所有文件长什么样」。没改的文件不会重复存Git 会自动复用。这个设计让 Git 又快又省空间。第 10 章会用命令亲自验证这一点。10.4 图形界面工具VS Code、GitKraken 这些图形界面工具可以帮你更直观地操作 Git。但建议你先学命令行因为出了问题网上搜到的答案都是命令行和同事交流时命令行是通用语言图形界面会变命令行不会11. 小实验在可丢弃目录里做实验 A环境就绪打开终端运行git --version把版本号记下来设置全局配置名字、邮箱、默认分支名运行git config --global --list确认三项都设置好了建一个临时文件夹git init -b main再运行git status通过标准git status显示On branch main并且不报任何身份缺失的错误。实验 B用自己的话解释用 3-5 句话回答以下问题不要照抄教程原文Git 和「另存为新文件」比好在哪里Git 和 GitHub 是什么关系为什么 Git 需要你设置邮箱实验 C配置覆盖练习在刚才的练习仓库里设置一个本地邮箱和全局不同的gitconfig--localuser.emailtestlocal.com运行git config --list --show-origin同时找到全局邮箱和本地邮箱完成后取消本地覆盖gitconfig--unsetuser.email通过标准理解「本地配置覆盖全局配置」这个优先级关系。12. 常见问题问学 Git 必须注册 GitHub 吗不用。前五章的内容全部在本机完成完全不需要联网和注册账号。问Git 只给程序员用吗不完全是。任何需要追踪文件改动的场景都能用 Git比如写论文、写博客。不过它对文本文件最友好照片、视频等大文件不太适合直接用 Git 管理。问命令行和图形界面先学哪个先学命令行。原因有二一是出问题搜答案都是命令行二是理解命令行之后再上手图形界面会很快反过来却不行。问不小心把密码提交进去了怎么办如果还没有推送到远程仓库用第 04 章的方法可以撤回。如果已经推送了需要修改密码并从历史中清除比较麻烦。所以最好一开始就养成好习惯不提交密码。问为什么默认分支叫 main 而不是 master这是社区的约定变化。master这个名字历史上让人联想到主奴关系所以社区约定改用main。功能上没有任何区别。问云端删除了项目我本地还有吗有的。你本地的仓库和远程仓库是独立的除非你主动执行git pull否则远程的任何操作都不会影响你本地的代码。问已经用错误邮箱提交了怎么办先修改配置防止后续继续提交错误邮箱已有提交的修改方法在第 16 章会讲。如果已经推送到远程修改历史需要和团队协调。问我找到工作了发第一个 PR 之前需要读多少建议扎实读完 01-08 章至少把基本操作练熟。第 06 章的远程协作内容是必读的。13. 总结13.1 一页速记项目要点Git 是什么帮你记录文件每一次改动的工具像游戏存档核心特点分布式离线也能用、存快照不是存差异、分支便宜想开就开Git vs GitHubGit 是工具GitHub 是网站像电饭锅 vs 共享厨房起源2005 年 Linus Torvalds 为 Linux 内核开发而创建现在要做的安装 Git、配置名字和邮箱、建第一个空仓库下一步第 02 章理解「三棵树」模型13.2 本系列中的位置01 导论你在这里 → 02 三棵树模型 → 03 基本工作流 → ... ↑ 后面每个命令都要用到这个模型13.3 思维升华Git 不是保存按钮也不是网站——它是历史引擎。目标不是背全参数而是始终清楚「当前处于什么状态」「下一步想要什么状态」。先正确再谈速度。13.4 延伸阅读Pro Git — 关于版本控制三种模式的详细说明Pro Git — Git 简史更多历史细节初次运行 Git 前的配置本仓库图示署名assets/diagrams/ATTRIBUTION.md13.5 检查清单能不提「GitHub」的情况下用一句话说清 Git 是什么能用 2-3 句话说出 Git 为什么诞生能分清集中式和分布式版本控制的区别能分清 Git 和 GitHub 的区别本机git --version可以正常运行已设置user.name、user.email、init.defaultBranch已在可丢弃目录执行git init -b main知道「保存」和「提交」不是一回事知道不能把密码提交进仓库