3、核心操作(上):git init与git clone、git add与git commit、git status与git log、理解.git目录结构
好,咱们正式开始动手了。这一章我带你过一遍 Git 最核心的四个操作,外加一个你迟早要打交道的 .git 目录。说白了,这章就是你的「Git 驾驶入门课」——学会怎么启动、怎么加速、怎么踩刹车、怎么看仪表盘。
3.1 从零开始:git init 与 git clone
先问个问题:你手头有个项目文件夹,想把它变成 Git 仓库,怎么办?
答案就是 git init。这命令会在当前目录下创建一个隐藏的 .git 文件夹,里面装着 Git 需要的所有「户口本」和「账本」。我个人的习惯是,新项目一建好,第一件事就是跑 git init,哪怕还没写一行代码。为什么?因为这样我就能随时记录每一个改动,心里踏实。
mkdir my-project
cd my-project
git init
# 输出:Initialized empty Git repository in /path/to/my-project/.git/
另一种情况是,你想从远程仓库(比如 GitHub、GitLab)拉一份代码下来。这时候用 git clone。它相当于把远程仓库的完整历史、所有分支、所有标签都复制到你本地。
git clone https://github.com/example/some-project.git
# 这会在当前目录下创建一个 some-project 文件夹
--branch 参数。比如 git clone --branch develop 仓库地址。我在项目中遇到过,主分支代码太大,只拉开发分支能省不少时间。
3.2 记录变化:git add 与 git commit
好,仓库有了,代码也写了。现在你想把改动「拍个照」保存下来。Git 的流程分两步:git add 和 git commit。
git add 是把文件从工作区放到暂存区。你可以把它想象成「选照片」——你拍了一堆照片(修改了文件),但只有你选中的那些才会被放进相册(提交)。
# 添加单个文件
git add index.html
# 添加所有改动(慎用,建议先 git status 看看)
git add .
然后 git commit 就是真正「拍照」了。每次提交都要写一条消息,说明你这次改了啥。我见过太多人写「update」或者「fix bug」这种毫无信息量的消息。你想想看,三个月后你回来看历史,看到「fix bug」你能想起来修了啥吗?
git commit -m "feat: 添加用户登录页面,包含表单验证"
git add 之后直接修改文件。因为 git add 记录的是那一刻的快照,你后续的修改不会被包含进去,除非你再次 git add。我曾经因为这个丢过一行关键代码,后来养成了「add 完立刻 commit」的习惯。
3.3 查看状态:git status 与 git log
这两个命令,我一天能用几十次。它们就是你的「仪表盘」和「行车记录仪」。
git status 告诉你当前工作区的状态:哪些文件被修改了、哪些在暂存区、哪些还没被跟踪。我建议你在每次 git add 之前和 git commit 之后都跑一遍,确认自己没搞错。
git status
# 输出示例:
# On branch main
# Changes not staged for commit:
# modified: index.html
# Untracked files:
# new-file.js
git log 则是查看提交历史。默认会显示每个提交的哈希值、作者、日期和提交消息。你可以加各种参数来定制显示方式。
# 查看简洁版历史(一行一个提交)
git log --oneline
# 查看图形化分支历史
git log --graph --oneline --all
我个人最常用的是 git log --oneline -5,只看最近 5 条提交。为什么?因为大多数时候我只关心「刚才发生了什么」,而不是「去年发生了什么」。
3.4 理解 .git 目录结构
好,现在咱们聊聊那个神秘的 .git 文件夹。很多初学者不敢碰它,觉得碰了就会坏掉。其实没那么玄乎,我来带你看看里面都有啥。
用 ls -la 看看你的项目根目录,你会看到 .git 文件夹。进去看看:
cd .git
ls -la
# 你会看到类似这样的结构:
# HEAD
# config
# description
# hooks/
# info/
# objects/
# refs/
我来挑几个重要的说说:
| 文件/目录 | 作用 |
|---|---|
HEAD |
指向当前分支的引用。比如 ref: refs/heads/main 表示你在 main 分支上 |
config |
仓库级别的配置文件。用户名、邮箱、远程仓库地址都在这里 |
objects/ |
Git 的核心——所有数据都存这里。包括文件内容、提交对象、树对象 |
refs/ |
存放分支和标签的引用。比如 refs/heads/main 就是 main 分支的最新提交 |
hooks/ |
钩子脚本目录。可以在特定事件(如提交前、推送前)自动执行脚本 |
嗯,这里要注意一点:objects/ 目录里的文件是经过压缩和哈希处理的,你直接用文本编辑器打开是乱码。想看内容?用 git cat-file 命令。
# 查看某个对象的内容(需要对象的哈希值)
git cat-file -p 某个哈希值
我记得刚学 Git 时,总想手动修改 .git 里的文件来「作弊」。结果有一次把 HEAD 文件改坏了,整个仓库都打不开。后来我学乖了——.git 目录就像飞机的黑匣子,你可以看,但别乱动。
.git 目录提交到版本控制里。它本身就是版本控制的数据库,嵌套提交会导致无限循环。我曾经见过有人把整个项目(包括 .git)又 clone 到另一个仓库里,结果那个仓库膨胀到几个 GB。
3.5 本章小结
这一章我们学了四个核心操作:
- git init / git clone:创建或复制仓库
- git add / git commit:记录文件快照
- git status / git log:查看当前状态和历史
- .git 目录:理解 Git 的存储结构
这些操作你每天都会用到。别急着往下学,先把这几个命令练熟。下一章咱们会聊分支和合并——那才是 Git 真正展现威力的时候。
公众号:蓝海资料掘金营,微信deep3321