核心概念与第一个项目
在动手之前,先把几个概念钉死
上一篇我们把 Git 装好了,但还不知道它内部是怎么运作的。这一篇我们先花力气把几个核心概念搞透——仓库、工作区/暂存区/版本库、提交、分支、远程仓库——理解了它们,后面所有操作就都顺理成章了。理论讲完我们立刻动手,从零建一个项目、完成第一次提交,让你把这套路子跑通一遍。
仓库:被 Git 管起来的文件夹
仓库说白了就是一个被 Git 管理的文件夹。你的项目文件夹里有一堆文件,当你在里面跑一句 git init,这个文件夹就变成了仓库——Git 会偷偷建一个隐藏的 .git 文件夹,往里塞所有的版本历史。仓库分两种:在你自己电脑上的叫本地仓库,在服务器上(比如 GitHub)大家都能访问的叫远程仓库。
工作区、暂存区、版本库(最容易混,也最重要)
这三个是 Git 最核心、也最容易把新手绕晕的概念。我们用一个比喻一次讲透。想象你在整理房间、准备拍张照发朋友圈:你的房间本身,就是工作区——你在这里挪东西、打扫、装饰,对应到 Git 就是你改代码的项目文件夹;你手边有一张"待拍照清单",沙发摆好了你就在清单上勾"沙发✓"、书架理好了勾"书架✓"、卧室还乱着就先不勾,这张清单就是暂存区,对应到 Git 是你用 git add 把改好的文件放进去的那块;最后你照着清单把勾上的东西拍成一张照片、永久存进相册,这张照片就是版本库里的一次提交,对应到 Git 是 git commit。
你可能会问,为什么非要搞个暂存区当中间环节、不能改完直接提交?因为很多时候你一次性改了十个文件,但它们其实属于两个不同的功能,你想分成两次提交——第一次提交登录功能那三个、第二次提交注册功能那七个。有了暂存区你就能精确控制每次提交包含哪些改动:
git add login.html login.css login.js
git commit -m "完成登录功能"
git add register.html register.css register.js signup.js form.js validation.js utils.js
git commit -m "完成注册功能"这样提交历史就是清晰的,每一条都对应一个完整的功能,而不是一锅"改了一堆东西"。整个流程画出来是这样:工作区里改文件,git add 把要的改动推进暂存区,git commit 把暂存区固化成版本库里的一次提交。
提交:给项目拍快照
一次提交(commit)就是给你的项目拍一张快照,记录下当前所有被跟踪文件的状态。它包含改了什么、提交信息、作者、时间戳,还有一个唯一的 ID(像 a3f5d9c)。提交历史可以想象成一条时间线上的珍珠链——每颗珠子是一次提交,按时间串起来,你随时能跳到任何一颗看看那时的项目长什么样。
这里我们必须强调提交信息这件事,因为它是几个月后你(和同事)能不能看懂历史的关键。坏的提交信息长这样:"修改"、"更新代码"、"aaa"、"修复bug"——三个月后你排查一个线上问题、翻历史看到"修复bug",根本不知道修的是哪个 bug。好的提交信息是具体的:"添加用户登录功能"、"修复首页按钮点击无响应"、"重构数据库连接模块提升性能"。多花十秒写清楚,未来的你会感谢现在的你。
分支:项目的平行宇宙
分支是 Git 最强大的能力,也是新手最容易卡的概念。我们接着用写小说的比喻:主线剧情是男主和女主 A 在一起,但你想试一个不同结局——男主和女主 B。没有分支的话,你直接改了结局,发现读者不喜欢、原来的结局已经被覆盖找不回来了;有了分支,你从主线复制出一个"女主B结局"分支,在分支上写新结局,读者喜欢就并回主线(合并)、不喜欢就丢掉分支,主线纹丝未动。
对应到 Git,主分支(main,老叫法是 master)是项目主线、通常是稳定可发布的版本;功能分支从主线分出去开发新功能,开发完再并回来。团队协作时,张三开 feature-login 分支搞登录、李四开 feature-payment 分支搞支付,各干各的互不干扰,main 始终保持可运行。分支的好处一句话:能放心做实验、并行开发、出问题直接删分支,绝不弄坏主线。
远程仓库:云端的那一份
远程仓库就是你项目的云端备份,搁在服务器上(GitHub、GitLab、Gitee 这些),团队都能访问。本地仓库只在你电脑上,远程仓库在服务器上;git push 把本地新提交上传到远程,git pull 把远程新提交拉回本地。它的价值是备份(电脑坏了代码还在)、协作(互相能看到)、分享(公开仓库全世界能看),后面 GitHub 那一篇会专门讲怎么用。
动手:从零建第一个 Git 项目
概念够了,我们立刻实操,把这套路子从头跑一遍。
第一步——建项目文件夹、初始化仓库
我们先建个文件夹、进去,然后用 git init 把它变成仓库:
cd ~/Desktop
mkdir my-first-project
cd my-first-project
git initgit init 会回你一句:
Initialized empty Git repository in /Users/zhangsan/Desktop/my-first-project/.git/到这一步,Git 在文件夹里建了隐藏的 .git,这个文件夹从此就是仓库了。
⚠️ 注意,
.git是隐藏文件夹(文件管理器里默认看不到),它装着全部版本历史。千万不要手贱去改.git里的任何东西,改坏了仓库就废了。如果你哪天想"取消"某个文件夹的 Git 管理,删掉.git就行——但平时根本不需要动它。
第二步——建第一个文件、看看 Git 怎么看它
我们往里放一个 README.md:
echo "# 我的第一个Git项目" > README.mdecho 输出文字、> 把输出写进文件。然后我们用一条贯穿全程的命令看看 Git 眼里发生了什么:
git statusOn branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
nothing added to commit but untracked files present (use "git add" to track)我们逐行读懂:On branch main 是你在 main 分支;No commits yet 是还没做过任何提交;Untracked files 下的 README.md 是 Git 看见这个文件了、但还没被正式"收编"管理——这就是"未跟踪"。最后一行直接给了下一步的提示:用 git add 把它纳入跟踪。
第三步——推进暂存区、完成第一次提交
我们照着提示把文件加进暂存区:
git add README.md(如果有好几个文件要一起加,git add . 一把全加,. 表示当前目录。)再看一次 git status,状态变了:
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md文件从 Untracked 变成了 Changes to be committed——它进暂存区了。然后我们把它固化成一次提交:
git commit -m "初始化项目,添加README文件"[main (root-commit) a3f5d9c] 初始化项目,添加README文件
1 file changed, 5 insertions(+)
create mode 100644 README.md-m 是 message 的缩写、后面跟提交说明;[main (root-commit) a3f5d9c] 告诉你这是 main 分支上的第一次提交(root-commit)、ID 是 a3f5d9c。到这里,你的第一次提交就完成了。再跑一次 git status,它会告诉你 nothing to commit, working tree clean——没有待提交的改动、工作区干净,说明都落袋了。
第四步——看历史
我们用 git log 看看刚才那笔提交长什么样:
git logcommit a3f5d9c8b2e1f4d6a8c9e7f5d3b1a9c7e5d3b1a (HEAD -> main)
Author: 张三 <zhangsan@example.com>
Date: Mon Dec 23 10:30:00 2024 +0800
初始化项目,添加README文件(HEAD -> main) 表示你当前(HEAD)就在 main 分支这个提交上。默认的 git log 信息很全但有点啰嗦,日常我们更爱用简洁版:
git log --onelinea3f5d9c (HEAD -> main) 初始化项目,添加README文件一行一条,干净利落。按 q 退出日志浏览。
另一种起点:克隆已有项目
如果你的队友已经在 GitHub 上建了项目,你想把它弄到本地,一条 git clone 就够,不用再 git init:
cd ~/Desktop
git clone https://github.com/yourteam/awesome-project.git
cd awesome-projectclone 会把整个项目连同全部历史一起下载下来、自动建好本地仓库和远程的连接。从零建用 init、加入已有项目用 clone,这两种起点覆盖了你绝大多数场景。
小结
我们把 Git 的几个核心概念和第一次实操都过了一遍:仓库是被 Git 管的文件夹;改动从工作区经 git add 进暂存区、再经 git commit 固化进版本库,暂存区让你能精确控制每次提交包含哪些改动;提交信息要写得具体、对未来的自己负责;分支是平行宇宙、让你放心实验不弄坏主线;远程仓库是云端那一份。实操上,git init 起项目、git status 看状态、git add 进暂存区、git commit 提交、git log --oneline 看历史——这条链子你跑通一遍,Git 的日常骨架就有了。
下一站
骨架有了,下一篇我们进入每天都要用的日常操作——怎么看改了什么、怎么撤销、怎么忽略不想管的文件。
下一篇:日常工作流