4、Git基础操作(一):git init、git clone、git status、git add、git commit,以及.gitignore文件的使用
说实话,很多新手学Git,一上来就被各种概念砸晕了。什么暂存区、工作区、HEAD指针……其实你想想看,Git最核心的操作就那么几个。今天我就带你把这几个最常用的命令彻底搞明白。
我个人习惯,每次教新人Git,都先让他们把下面这张图刻在脑子里。这是Git最基础的工作流程,搞懂它,后面就顺了。
4.1 从零开始:git init
你想在一个新项目里用Git,第一步就是初始化。说白了,就是告诉Git:「嘿,这个文件夹归你管了」。
mkdir my-project
cd my-project
git init
执行完 git init 之后,Git会在当前目录下创建一个隐藏的 .git 文件夹。这个文件夹里存着所有版本历史、配置信息等。我见过有人不小心把这个文件夹删了,结果整个版本历史全丢了……嗯,这里要注意,.git 文件夹就是Git的命根子,别乱动。
git init 然后立刻 git add . 再 git commit -m "Initial commit"。这样从一开始就有版本记录,后面改了什么一目了然。
4.2 拿来主义:git clone
如果别人已经建好了仓库,你想参与进来,那就用 git clone。这就像从网盘下载一个文件夹,但Git会把这个文件夹的「前世今生」都下载下来。
git clone https://github.com/username/repository.git
这个命令会做三件事:
- 在当前目录下创建一个同名文件夹(比如
repository) - 把远程仓库的所有文件下载下来
- 自动初始化本地仓库,并关联远程地址
我曾经遇到过一个问题:克隆一个超大的项目,结果等了半天没反应。后来发现是网络问题。如果你也遇到这种情况,可以试试 git clone --depth 1,这个参数只克隆最近一次提交,速度快很多。当然,代价是你拿不到完整的历史记录。
4.3 随时查看状态:git status
这个命令我一天能用几十次。它告诉你当前仓库里发生了什么变化。说白了,就是Git的「体检报告」。
git status
输出结果大概长这样:
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: index.html
Untracked files:
(use "git add <file>..." to include in what will be committed)
new-style.css
看到 modified 表示文件被改了但还没暂存,Untracked files 表示Git完全不认识这些新文件。我建议你养成习惯:每次提交前先 git status 看一眼,确认自己改了什么,别稀里糊涂就提交了。
git status 只显示「有变化」的文件。如果你改了一个文件又改回去了,Git会认为没有变化,不会显示。别问我怎么知道的……有一次我改了半天代码,发现 git status 显示 nothing to commit,当时就懵了。
4.4 把改动装进篮子:git add
你改好了代码,但Git不会自动跟踪这些改动。你需要用 git add 把文件「放上暂存区」。你可以把它想象成一个购物车——你先挑好要买的东西(改动的文件),然后统一结账(提交)。
# 添加单个文件
git add index.html
# 添加所有改动(包括新文件和修改)
git add .
# 添加当前目录下所有 .js 文件
git add *.js
我个人习惯用 git add . 比较多,但有个坑:如果你不小心把一些临时文件、日志文件也加进去了,后面提交就会很乱。所以,我建议你配合 .gitignore 文件一起使用,后面会讲到。
4.5 正式存档:git commit
git commit 就是把暂存区的内容正式保存到本地仓库。每次提交都会生成一个唯一的哈希值(比如 a1b2c3d),这就是你这次改动的「身份证」。
git commit -m "修复了登录页面的样式问题"
关于提交信息,我有几条铁律:
- 用中文写清楚:别写什么「fix bug」这种废话,要写「修复了用户头像加载失败的问题」
- 一句话说清楚:控制在50字以内,如果说不清楚,说明这次改动太大了,应该拆成多次提交
- 用现在时:比如「修复」而不是「修复了」,这是Git社区的惯例
4.6 眼不见为净:.gitignore 文件
项目里总有一些文件不需要Git管理,比如:
node_modules/—— 依赖包,几万个文件.env—— 环境变量,可能包含密码*.log—— 日志文件,每天都在变dist/—— 构建产物,可以重新生成
这时候就需要 .gitignore 文件了。它告诉Git:「这些文件你别管,就当它们不存在」。
# 忽略 node_modules 文件夹
node_modules/
# 忽略所有 .log 文件
*.log
# 忽略 .env 文件(但保留 .env.example)
.env
!.env.example
# 忽略 dist 文件夹
dist/
创建 .gitignore 文件很简单,在项目根目录新建一个文本文件,命名为 .gitignore 就行。我建议你从网上找一个模板,比如 GitHub 上就有各种语言的 .gitignore 模板,直接复制过来改改就能用。
.gitignore 只对「还没被Git跟踪」的文件有效。如果你已经 git add 了一个文件,再把它加到 .gitignore 里是没用的。我曾经犯过这个错——把密码文件提交了,然后才加 .gitignore,结果密码还在历史记录里。正确的做法是用 git rm --cached 先移除跟踪。
4.7 实战演练:一个完整的流程
说了这么多,我们来走一遍完整的流程。假设你刚接手一个新项目:
# 1. 克隆项目
git clone https://github.com/team/project.git
# 2. 进入项目目录
cd project
# 3. 查看当前状态(确认干净)
git status
# 4. 创建 .gitignore(如果项目里没有)
echo "node_modules/" >> .gitignore
echo ".env" >> .gitignore
# 5. 开始写代码... 改完了之后
git status # 看看改了哪些文件
# 6. 添加改动
git add .
# 7. 再次确认状态
git status # 应该显示绿色文字,表示已暂存
# 8. 提交
git commit -m "完成了用户登录功能"
# 9. 推送到远程(后面章节会详细讲)
git push
这个流程我每天都在用。你刚开始可能会觉得麻烦,但用顺手了就会发现——每一步都有它的道理。
git add . 之后忘了 git status 确认,结果把一个包含API密钥的配置文件也提交了。虽然马上 git reset 撤销了,但想想都后怕。所以,git status 真的是你的好朋友,多用它。
好了,这一章的内容就到这里。这几个命令是Git操作的基石,你花点时间把它们练熟,后面学分支、合并、远程协作就会轻松很多。记住那张流程图,每次操作前在脑子里过一遍:我现在在哪个区?我要把文件送到哪里去?