人人都能学编程
English 开始学习
核心 · Git第 6 课 / 共 6 课免费阅读

.gitignore 与 pull request · Git 与 GitHub

团队怎么让仓库保持整洁、安全?

课程目录

为什么需要它

仓库是共享的、永久的。密钥、构建产物和日志文件都不该放进去:密钥会泄露,垃圾文件会造成无谓的冲突。团队会约定几个习惯:.gitignore、小分支、清楚的提交说明,以及经过评审的 pull request。

直觉理解

.gitignore 列出 Git 应该当作看不见的文件模式:

.env
*.log
build/

被忽略的文件不会出现在 git status 里,git add . 也会跳过它们。(已经提交过的文件仍会被跟踪;之后再忽略也不会把它从历史里去掉。)

团队里一次典型的修改:

  1. git switch -c fix-cart-total
  2. 几次小提交,说明写清楚
  3. git push -u origin fix-cart-total
  4. 在 GitHub 上开一个 pull request;队友评审;CI 跑测试
  5. 合并,然后删掉分支

定义

.gitignore

A file of patterns for files Git should not track: secrets, logs, build output, dependencies such as node_modules/.
一个写着文件模式的文件,列出 Git 不应跟踪的文件:密钥、日志、构建产物、依赖目录(比如 node_modules/)。

拉取请求 Pull request

A request on GitHub (or a similar site) to merge a branch, where teammates review the changes and automated checks run before merging.
在 GitHub(或类似网站)上提出的合并某个分支的请求,合并前队友会评审修改,自动检查也会运行。

示例

忽略不该进仓库的东西

在互动课里运行

三类绝不能提交的文件。先写好 .gitignore,再全部 add。

git status
echo ".env" > .gitignore
echo "*.log" >> .gitignore
echo "build/" >> .gitignore
git status
git add .
git commit -m "add gitignore"
逐步执行
  1. L1之前:.env、build/app.bin、debug.log 都显示为未跟踪。
  2. L5之后:只有 .gitignore 本身是新的。
  3. L6git add . 跳过了被忽略的文件。

给发布打标签

在互动课里运行

标签是给某个提交起的固定名字,用来标记发布版本。

git tag v1.0
git tag
git log --oneline
逐步执行
  1. L1v1.0 现在永远指向这个提交。
  2. L3标签显示在提交旁边。

常见错误

提交之后才忽略

已经提交过的 .env,再加进 .gitignore 也不会从历史里消失。要换掉密钥,并用 git rm --cached .env 停止跟踪它。

巨大的 pull request

两千行的 pull request 只会被扫一眼,不会被认真评审。拆成几个小的,合并更快,也能发现更多 bug。

小测验

1. .gitignore 里哪一行能忽略所有文件夹里以 .log 结尾的文件?

  1. A*.log
  2. B/log
  3. C.log/
查看答案

答案:A

不带斜杠的模式会在任何位置匹配文件名。

2. 最后一条命令打印什么?

echo "*.log" > .gitignore
git add .
git status
  1. A
    On branch main
    Changes to be committed:
      new file:   .env
      new file:   .gitignore
      new file:   build/app.bin
  2. B
    On branch main
    Changes to be committed:
      new file:   .gitignore
  3. C
    On branch main
    Changes to be committed:
      new file:   .env
      new file:   .gitignore
      new file:   build/app.bin
      new file:   debug.log
查看答案

答案:A

只忽略了 *.log,所以密钥文件 .env 和 build/ 都被暂存了。这正是 .gitignore 要防止的错误。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出什么会被提交?

    执行完这些命令后,新提交里有哪些文件?

  2. 改需求别让密钥进仓库

    这里会把一切都提交,包括 .env 密钥、日志和 build 文件夹。在 git add . 之前加上 .gitignore,让提交里只有 .gitignore。

  3. 从零写为 pull request 做好准备

    完成团队流程的前半部分:建分支 fix-total,把 app.py 改成只有一行 print('total fixed'),以 fix total 为说明提交,再带跟踪(-u)把这个分支推送到 origin。不要提交 .env、debug.log 或 build/。

在互动课里练这一课

打开互动课,这些例子都能直接改、直接运行,练习题提交马上判题。免费开始,不用注册。

互动课按顺序解锁:前面的课还没学,会先带你到课程地图。

本课术语

术语中文英文定义
.gitignore.gitignore 忽略文件A list of file patterns Git should not track.
Pull request拉取请求A reviewed request to merge one branch into another.
Tag标签A fixed name for one commit, often a release like v1.0.