很多初学者在使用 Git 时,会遇到这样的问题:
为什么有些文件会出现在 git status 里?
为什么有些文件 Git 没有管理?
为什么写了 .gitignore 之后,文件还是被提交了?
git add . 到底添加了什么?这些问题都和 Git 的管理范围 有关。
Git 并不会自动管理电脑里的所有文件。它只会管理当前仓库目录中,被纳入版本控制的文件。理解 Git 管理哪些文件、忽略哪些文件,是学习 Git 的基础。
Git 仓库从哪里开始?#
一个 Git 仓库的核心标志是:
.git/当你在某个目录执行:
git initGit 会在当前目录下创建一个 .git 文件夹。
例如:
my-project/
├── .git/
├── README.md
├── index.html
└── style.css这时,my-project 就是一个 Git 仓库。
Git 会管理这个仓库目录下的文件变化,但不会管理仓库目录外面的内容。
例如:
Desktop/
├── my-project/
│ ├── .git/
│ ├── README.md
│ └── index.html
└── other-file.txt这里的 other-file.txt 不在 my-project 仓库里面,所以不会被这个 Git 仓库管理。
工作区是什么?#
工作区就是你正在编辑的项目目录。
例如:
my-project/
├── README.md
├── index.html
└── style.css你在 VS Code、记事本、终端里修改这些文件,都是在修改工作区。
工作区里的文件变化不一定会立刻进入 Git 历史。Git 需要你明确告诉它:哪些变化要加入下一次提交。
这个动作就是:
git addGit 眼里的文件状态#
在 Git 里,一个文件通常会处于下面几种状态。
未跟踪文件#
未跟踪文件指的是:文件存在于工作区,但还没有被 Git 纳入版本控制。
例如你新建一个文件:
hello.md然后执行:
git status可能会看到:
Untracked files:
hello.md这表示 Git 看到了这个文件,但还没有开始管理它。
如果你想让 Git 管理它,需要执行:
git add hello.md已跟踪文件#
已跟踪文件指的是:已经被 Git 纳入版本控制的文件。
比如一个文件曾经被执行过:
git add README.md
git commit -m "add README"那么 README.md 就是已跟踪文件。
以后你再修改 README.md,Git 就能识别它发生了变化。
已修改文件#
已修改文件指的是:文件已经被 Git 跟踪,但内容发生了变化,还没有加入暂存区。
例如你修改了 README.md,执行:
git status可能会看到:
Changes not staged for commit:
modified: README.md这表示 Git 知道这个文件被改了,但这次修改还没有准备进入下一次提交。
已暂存文件#
已暂存文件指的是:文件变化已经通过 git add 加入暂存区,准备进入下一次提交。
例如:
git add README.md然后执行:
git status可能会看到:
Changes to be committed:
modified: README.md这表示这次修改已经进入暂存区,下一次执行 git commit 时会被保存到 Git 历史中。
暂存区是什么?#
暂存区可以理解为:下一次提交的准备区。
Git 的提交不是自动保存整个项目,而是保存你放进暂存区的内容。
基本流程是:
工作区
↓ git add
暂存区
↓ git commit
本地仓库例如你同时修改了两个文件:
README.md
index.html但你只想先提交 README.md,可以执行:
git add README.md
git commit -m "update README"这时只有 README.md 的修改会进入这次提交,index.html 的修改仍然留在工作区。
这就是暂存区的意义:它允许你选择哪些修改进入下一次提交。
使用 git status 查看当前状态#
学习 Git 时,最常用的命令之一就是:
git status它会告诉你:
哪些文件没有被跟踪
哪些文件被修改了
哪些文件已经暂存
当前分支是否干净建议你在每次 git add 和 git commit 前后都执行一次:
git status这样可以清楚地知道当前仓库处于什么状态。
把文件加入 Git 管理#
如果只想添加某一个文件:
git add README.md如果想添加当前目录下的所有变化:
git add .git add . 会把当前目录及其子目录中的新增、修改、删除变化加入暂存区。
但要注意:git add . 不是提交。
它只是把变化放进暂存区。
真正保存到 Git 历史中,还需要执行:
git commit -m "提交说明"哪些文件不应该交给 Git 管理?#
并不是所有文件都适合提交到 Git 仓库。
通常不建议提交这些内容:
系统临时文件
编辑器缓存文件
依赖目录
构建产物
日志文件
环境变量文件
密钥和密码例如:
.DS_Store
node_modules/
dist/
public/
.env
*.log这些文件要么可以重新生成,要么包含本地环境信息,要么可能包含敏感内容。
这类文件通常应该使用 .gitignore 忽略。
.gitignore 是什么?#
.gitignore 是 Git 的忽略规则文件。
你可以在仓库根目录创建一个文件:
.gitignore然后写入需要忽略的文件或目录。
例如:
# 依赖目录
node_modules/
# 构建产物
dist/
public/
# 环境变量
.env
# 日志文件
*.log
# macOS 系统文件
.DS_Store这样 Git 就不会再把这些未跟踪文件显示到 git status 里。
.gitignore 的常见写法#
忽略单个文件:
.env忽略某个目录:
node_modules/忽略所有 .log 文件:
*.log忽略某个目录下的文件:
public/
dist/添加注释:
# 这里是注释已经被 Git 跟踪的文件,.gitignore 还生效吗?#
这是初学者非常容易踩坑的地方。
如果一个文件已经被 Git 跟踪,那么你后来把它写进 .gitignore,Git 仍然会继续跟踪它。
例如,假设 .env 已经被提交过:
git add .env
git commit -m "add env file"后来你在 .gitignore 里写:
.env这并不会让 Git 自动停止跟踪 .env。
你需要执行:
git rm --cached .env然后提交这次变化:
git commit -m "stop tracking env file"这条命令的意思是:从 Git 版本控制中移除 .env,但保留本地文件。
如果是目录,例如 public/:
git rm -r --cached public/然后:
git commit -m "stop tracking public directory"如何判断文件为什么被忽略?#
如果你发现某个文件没有出现在 git status 中,可以用:
git check-ignore -v 文件名例如:
git check-ignore -v .env如果这个文件被忽略,Git 会告诉你是哪一条规则导致它被忽略。
这在 .gitignore 规则比较多的时候很有用。
一个完整示例#
假设你有一个项目:
my-blog/
├── content/
├── public/
├── themes/
├── .env
├── hugo.toml
└── README.md其中:
content/
themes/
hugo.toml
README.md这些通常应该交给 Git 管理。
而:
public/
.env通常不应该提交。
你可以创建 .gitignore:
public/
.env
.DS_Store然后执行:
git status确认 Git 不再提示这些被忽略的文件。
接着添加需要管理的内容:
git add content themes hugo.toml README.md .gitignore提交:
git commit -m "initialize blog project"这样你的仓库就只会管理真正需要保存的内容。
常见误区#
.gitignore 会删除文件吗?#
不会。
.gitignore 只是告诉 Git 不要跟踪某些文件。
它不会删除本地文件,也不会自动删除远程仓库里已经存在的文件。
git add . 会提交文件吗?#
不会。
git add . 只是把变化加入暂存区。
真正提交需要执行:
git commit -m "提交说明"Git 会自动管理所有文件吗?#
不会。
Git 只会管理仓库目录里的内容,并且只有被纳入版本控制的文件才是已跟踪文件。
忽略规则写了为什么没生效?#
常见原因是文件已经被 Git 跟踪。
这种情况下需要先执行:
git rm --cached 文件名然后再提交。
小结#
理解 Git 的管理范围,关键是分清楚下面几个概念:
工作区:你正在编辑的项目文件
暂存区:下一次提交的准备区
本地仓库:保存提交历史的地方
未跟踪文件:Git 看到但还没管理的文件
已跟踪文件:已经被 Git 纳入版本控制的文件
.gitignore:告诉 Git 哪些未跟踪文件应该忽略最常用的检查命令是:
git status最常用的添加命令是:
git add 文件名或者:
git add .如果你能理解“工作区 → 暂存区 → 本地仓库”这个流程,就已经掌握了 Git 文件管理的核心。