Git 入门完全教程:从零开始学会版本控制
如果你刚开始学编程,或者刚开始跟别人协作开发项目,Git 是第一个要过的坎。
很多人觉得 Git 难,不是因为 Git 本身复杂,是因为没人把它的核心概念讲清楚。搞懂了"为什么","怎么做"就是顺理成章的事。这篇文章从零开始,带你走一遍完整的 Git 流程。
Git 解决什么问题
写代码的时候,你肯定经历过这种情况:改了一个 bug,结果把其他功能搞坏了。想退回去,但不知道改了哪些文件,也不知道每个文件改了什么。
Git 就是解决这个问题的。它会记录你每次修改的内容,随时可以查看历史,随时可以回退。你可以把它理解成游戏的"存档"功能,但比存档更强大——它记录的不是一个时间点的快照,而是每一次改动本身。
Git 还有一个重要用途是协作。多人同时改同一个文件,Git 能自动合并,有冲突的地方会标出来让你决定。没有 Git 的时代,大家用邮件发代码、用文件夹命名 v1_final_最终版_真的最终版,那才叫痛苦。
安装 Git
Mac 上打开终端,输入 git --version,如果没有会自动提示安装。Windows 去 git-scm.com 下载安装包,一路下一步就行。安装完成后打开终端(Git Bash 或命令行),输入:
git --version
看到版本号就说明装好了。
接下来配置用户名和邮箱,这两条信息会出现在每次记录里:
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
三个核心概念
在动手之前,先搞懂 Git 的三个区域。
工作区就是你电脑上能看到的文件夹,你在里面创建文件、修改代码、删除文件,这些操作都在工作区。
暂存区是 Git 的一个中间地带。你把修改"放进去",告诉 Git 这些改动是我要记录的。你可以只放一部分文件,也可以放一个文件里的部分修改。
仓库是 Git 真正存储历史记录的地方。你把暂存区的内容"提交"到仓库,Git 就会生成一条永久的记录。
三个区域的关系:工作区 → git add → 暂存区 → git commit → 仓库。
可以用一个类比来理解:工作区像是桌上的草稿纸,暂存区像是你挑出来准备归档的那些纸放进文件袋,仓库则是上了锁的档案柜,每次提交就是往柜子里添加一份带标签的档案。
第一次使用 Git
创建一个新文件夹,进入它,然后初始化 Git:
mkdir my-project
cd my-project
git init
这个命令在文件夹里创建了一个隐藏的 .git 目录,Git 用它来管理所有版本信息。你现在有了一个空的 Git 仓库。
创建一个文件,比如 README.md,写几行内容。然后输入:
git status
Git 会告诉你 README.md 是"未跟踪的",意思是 Git 看到了这个文件,但还没有管它。
现在把文件放进暂存区:
git add README.md
再输入 git status,会发现 README.md 变成了绿色,说明已经在暂存区了。
把暂存区的内容提交到仓库:
git commit -m "第一次提交:添加 README"
-m 后面是这次提交的说明。写清楚你做了什么,以后看历史记录的时候一目了然。
好的 commit 说明应该用简洁的一句话概括本次改动。常见的写法有:feat: 新增功能、fix: 修复问题、docs: 更新文档、refactor: 重构代码。这种格式叫 Conventional Commits,在团队协作中非常常见。
查看历史
提交几次之后,输入:
git git log
不对,输入:
git log
Git 会按时间倒序列出每次提交,每条记录有作者、时间、说明和一串字符(commit ID)。这个 ID 就是这次提交的唯一标识,以后可以用它来查看具体内容或回退到这一步。
如果觉得输出太多,可以用 git log --oneline,每次提交只显示一行。
想查看某次提交具体改了哪些内容,可以用:
git show 8位commitID
它会显示该次提交修改了哪些文件,每个文件的增删内容用绿色和红色标记,非常直观。
连接远程仓库
现在你的 Git 只在你电脑上。如果你想备份到网上,或者跟别人协作,需要连接一个远程仓库。GitHub 是最常用的,注册账号后在 GitHub 上点"New Repository",创建一个空仓库。
回到终端,把本地仓库和远程仓库关联起来:
git remote add origin https://github.com/你的用户名/项目名.git
origin 是远程仓库的名字,你可以随便起,但大家都默认叫 origin。
然后把你本地的内容推上去:
git push -u origin main
-u 是 --set-upstream 的缩写,它把本地 main 分支和远程 main 分支关联起来,以后直接 git push 就行,不用每次写远程分支名。
日常使用流程
安装好 Git、关联好远程仓库之后,每天的工作流程其实就四步。
第一步,拉取最新代码:git pull。如果别人改了远程仓库,这会把最新内容下载到你电脑上。
第二步,做你的修改。写代码、改文档、修 bug,随便。
第三步,把修改放进暂存区:git add 文件名。如果想把所有改动都放进去,用 git add .(点号代表当前目录所有文件)。
第四步,提交并推送:git commit -m "说明",然后 git push。
四步搞定。实际工作中大部分时候就这么循环。
还有一个常用操作是 git fetch,它和 git pull 的区别是:fetch 只是下载远程的更新但不自动合并到本地,适合你想先看看别人改了什么再决定要不要合并的场景。
一个容易忽略的细节
不是所有文件都应该提交。编译出来的程序、依赖包、配置文件里的密码和密钥,这些不应该放进 Git。
在项目根目录创建一个叫 .gitignore 的文件,写上你不想让 Git 管理的文件类型:
node_modules/
.env
*.log
dist/
Git 会自动忽略这些文件。这个文件本身要提交到仓库里,这样别人克隆你的项目时也用同一套忽略规则。
理解 Git 的底层思想
Git 是分布式的版本控制系统。不像 SVN 那样只有一台中央服务器,Git 每个人的电脑上都有完整的项目历史。这意味着你离线也能提交、回退、查看历史,等有网了再 push 上去也来得及。
Git 存储数据的方式也很聪明。每次提交时,Git 并不保存所有文件的完整拷贝,而是保存和上一次提交之间的差异(delta)加上一个指向完整项目快照的指针。所以即使做了成千上万次提交,Git 占用的空间也不会很大。
理解了这个理念,后面学分支、合并、回退就会轻松很多。
