仓库管理入门

通过学习 GitHub 的一些基础功能,你可以更好地支持多人协作,让项目保持有序、友好和健康发展。

这是一个交互式课程,需要在 GitHub 上实际操作来完成学习。本页面为静态预览,仅方便您一次性阅读所有步骤内容。

前往 GitHub 开始学习 →

📖课程概览

English | 中文

本课程翻译自 Github Skills,全部课程请点击 这里查看

仓库管理入门

通过学习 GitHub 的一些基础功能,你可以更好地支持多人协作,让项目保持有序、友好和健康发展。

欢迎

  • 适合人群: 想要学习团队协作的开发者
  • 学习内容: 当越来越多人加入协作时,如何保护仓库内容并进行有效管理
  • 您将完成: 为 Mergington 高中课外活动网站的代码仓库做好准备,使更多老师可以安全参与开发
  • 先决条件:
  • 学习时长: 不到一小时即可完成。

通过本次练习,你将:

  1. 配置简单的规则和设置,限制对仓库内容的随意修改
  2. 学习如何制定协作规范,让团队沟通更清晰
  3. 为不同代码部分指定负责人
  4. 了解个人仓库与组织仓库在协作方式上的区别
  5. 建立团队协作的基本规则,营造健康开发环境
  6. 学习如何建立管理安全更新流程

[!IMPORTANT] 本练习主要用于帮助你整体了解 GitHub 的常用功能,并不会深入讲解每一个细节。如果需要深入学习,可以参考相关链接资料。

如何开始本练习

点击下方的 COPY EXERCISE 按钮,复制此练习到你的账号下,然后等待大约 20 秒,让小猫咪(Mona, GitHub吉祥物)为你准备好第一节课,之后刷新页面

遇到问题? 🤷

在复制仓库时,我们建议使用以下设置:

  • 仓库名称、描述这些字段系统已经帮我们自动填充好了,您可以按需修改。

  • 建议选择公开仓库,因为私有仓库会消耗GitHub Actions 分钟数

如果等待20秒后,页面没有变化,请检测 Actions 选项卡。

  • 查看是否有任务(job)正在运行,有时可能需要更长时间。

  • 如果页面显示任务失败,请提交 issue。太好了,你发现了一个 Bug!🐛


© 2025 GitHub • Code of ConductMIT License

🎯课程步骤

GitHub

步骤 1: 保护你的代码

假设你为 Mergington 高中开发了一个管理课外活动的网站,这个网站突然火了起来,原本只是一个简单的报名工具,现在已经成了学校一半社团活动的核心平台 📚✨。

校长 Martinez 对你的成果非常满意,甚至在教职工会议上宣布:所有社团都要用这个网站!

这当然是好事,但你心里也有点紧张——万一有人不小心改坏了代码,偏偏又是在秋季活动展前夕,那可就麻烦了 😰

随着越来越多老师加入协作,现在必须给仓库加点“安全措施”。好在 GitHub 提供了不少工具来帮你做到这一点:

关键保护手段

  1. 仓库规则集(Repository Rulesets):可以限制一些高风险操作,比如:

    • 不能直接往重要分支(如 main)提交代码
    • 防止分支被删除或重命名
    • 禁止强制推送(避免历史被覆盖)
    • 以及更多控制策略
  2. .gitignore - 这是一个“忽略清单”,告诉 Git 哪些文件不应该被纳入版本控制,例如:

    • 临时文件
    • 包含密码或敏感信息的配置文件
    • 其他开发者不需要的系统文件

[!TIP] 可以把这些设置想象成学校校刊的编辑流程:各个学生委员会负责拍照和撰写文章,最后由校刊主编调整排版,确保整体流畅,再由老师/顾问签字确认内容合适。

⌨️ 实操练习: (可选) 体验一下网站功能

展示步骤

GitHub Copilot 入门指南 课程中,我们开发了这个课外活动网站。你可以按照以下步骤启动开发环境并进行体验。

重要: 这一部分主要是为了让你体验课外活动网站,不是完成本次练习的必要条件。如果你愿意,可以跳过此活动。

  1. 创建在线开发环境(Codespace):右键点击下面的按钮,在新标签页中打开创建 Codespace 页面。使用默认配置。

    Open in GitHub Codespaces

  2. 等待一段时间,让环境准备就绪。它会自动安装所有需要的依赖库和服务。

  3. 确认 GitHub CopilotPython 插件已安装并启用。

    copilot extension for VS Code

    python extension for VS Code
  4. 运行项目:在左侧边栏中,选择 Run and Debug 选项卡,然后按 Start Debugging 图标。

    📸 查看截图
    run and debug
    🤷 遇到问题?

    如果Run and Debug区域为空,请尝试重新加载VS Code:打开命令面板(Ctrl+Shift+P)并搜索 Developer: Reload Window

    empty run and debug panel
  5. Ports tab 中找到网页访问地址,打开链接确认是否能正常访问。

    📸 查看截图
    ports tab

    Screenshot of Mergington High School WebApp

⌨️ 实操练习:添加分支保护规则

首先,让我们添加一些保护措施,以防止有人意外破坏系统。

  1. 如果有必要,打开另一个标签页并导航到此仓库。进入仓库的 Settings(设置) 页面

  2. 在左侧导航中,展开 Rules 区域,然后选择 Rulesets

  3. 单击 New ruleset 按钮,然后选择 New branch ruleset

    image
  4. 设置 Ruleset NameProtect main,并将 Enforcement status 设为 Active

    image
  5. 找到 Targets 部分,使用 Add target 下拉菜单添加 2 个条目:

    1. 添加 Include default branch 选项,包含默认分支(防止切换默认分支绕过规则)

      image
    2. 使用 include by pattern 选项,并输入模式 main

      image image
  6. 找到 Rules 部分,确保以下选项已选中。

    • Restrict deletions (限制删除分支)
    • Require a pull request before merging (合并前需要拉取请求)
      • Required approvals: 0 (需要的审批数量: 0)
      • Require review from Code Owners (需要代码所有者审查)
    • Block force pushes (禁止强制推送)
  7. 滚动到底部,单击 Create 按钮保存规则集。

⌨️ 实操练习:创建 .gitignore 文件

我们知道很多老师使用不同的工具,为了避免大家提交不必要的文件,可以创建一个.gitignore文件来告诉 Git。

  1. 在顶部导航栏,返回 Code 选项卡,确认你位于 main 分支上。

  2. 在文件列表上方,点击 Add file 下拉菜单,选择 Create new file 新建文件。

    New file button
  3. 输入文件名 .gitignore。我们将先忽略模板选择器,稍后再自定义。将以下示例内容复制到文件中。

    新文件预览
    # Python backend for club management
    __pycache__/
    *.py[cod]      # Python compiled files
    *$py.class
    *.so
    .Python
    env/
    .env           # Where database passwords are stored
    venv/          # Virtual environment for testing
    .venv
    
    # Teacher IDE settings
    .vscode/       # Ms. Rodriguez uses VS Code
    .idea/         # Mr. Chen uses PyCharm
    
    # Local development & testing
    instance/
    .pytest_cache/
    .coverage      # Test coverage reports
    htmlcov/
    
    # Staff computer files
    .DS_Store      # For teachers with Macs
    Thumbs.db      # For teachers with Windows
    
  4. 在页面右侧,选择 Commit changes... 按钮。请注意,我们无法直接提交到 main 分支!这说明我们的规则集正在起作用,太棒了!

    image
  5. 在输入框中,输入 prepare-to-collaborate 作为分支名称,然后点击 Propose changes 按钮。你会跳转到一个新页面,以发起一个新的拉取请求。

  6. 设置标题为 Prepare to collaborate,然后点击 Create pull request 按钮。请不要立即合并,因为我们还要添加更多与协作相关的更改。

  7. 文件已提交,Mona 会自动检查你的工作。稍等片刻,她会在评论中给出反馈与下一步任务。

[!TIP] GitHub 官方提供了大量现成的 .gitignore 模板,适用于不同语言和项目类型,可以在 github/gitignore 仓库中查看。

🤷 遇到问题?

确保你将 .gitignore 文件提交到了 prepare-to-collaborate 分支。文件名和分支名都要完全匹配!

GitHub

步骤 2: 为协作做好准备

你的校园网站现在越来越受欢迎了!在上次教职工会议展示之后,艺术社的 Rodriguez 老师和象棋社的 Chen 老师都兴奋地找到了你,提出了不少新想法:

  • Rodriguez 老师想增加一个作品展示画廊
  • Chen 老师则希望为象棋和体育活动添加一个比赛赛程系统! 🎨♟️

虽然你很高兴大家的热情,但你也意识到需要在他们开始修改代码之前设定一些规则。你可不想在春假来临前夕,因为代码冲突导致注册系统崩溃!

让其他老师加入到 Mergington 高中的项目中,意味着你需要考虑如何让大家协同工作而不破坏彼此的代码。

Colaboradores(协作者) 就是你通过仓库设置授权、可以修改项目代码的人。

  • 允许他人参与开发,同时仍然保护仓库的关键设置
  • 个人仓库权限简单。组织仓库权限更细致灵活,如读、写、维护和管理。

为了让多人协作不混乱,GitHub 提供了两个特殊文件:

  1. CONTRIBUTING.md - 贡献指南。内容可以包括:

    • 如何搭建开发环境
    • 如何提交修改(流程说明)
    • 代码风格规范,保持一致
    • 如何在遇到问题时寻求帮助
  2. CODEOWNERS - 用来明确“谁负责哪部分代码”。

    • 当有人提交 Pull Request 时,GitHub 会自动通知对应负责人来审核

⌨️ 实操练习:创建贡献指南文件

IT 社团明天就要开会了,现在要提前准备好文档,让新加入的老师能快速上手。

  1. 确保当前位于 prepare-to-collaborate 分支。

  2. 在文件列表上方,点击 Add file 下拉菜单,选择 Create new file 新建文件。

  3. 写入欢迎信息。

    # Contributing to the Mergington High Extra-Curricular Activities Website
    
    Thank you for your interest in helping improve our school's website!
    Whether you want to add your club's activities, fix a bug, or suggest
    new features, this guide will help you get started. 🎉
    
  4. 添加开发环境设置说明,帮助老师快速搭建开发环境。

    ## 开发环境
    
    1. 将仓库克隆到本地。
    2. 安装 Python 依赖:`pip install -r requirements.txt`。
    3. 运行开发服务器:`python src/app.py`。
    4. 在浏览器中访问 `http://localhost:8000` 查看网站。
    
    ## 提交修改
    
    1. 为你的修改创建一个新分支。
       - 使用描述性名称,例如 `art-gallery-feature` 或 `fix-chess-signup`
    2. 使用示例学生数据在本地进行修改和测试。
       - 使用 MongoDB 扩展预览包含的示例数据。
    3. 推送你的分支并创建拉取请求。
    4. 等待审查并解决任何反馈。
    
    ## 代码风格
    
    - 遵循 Python 代码的 PEP 8 规范(后端)
    - 使用清晰、描述性的变量名(例如:student_name、start_time)
    - 添加注释来描述逻辑块
    
  5. 添加 “获取帮助” 部分。

    ## 遇到问题?
    
    - 首先检查是否存在相同的 issue。
      - 如果 issue 已存在,请添加评论或点赞。
      - 如果没有,请创建并保持描述尽量详细。
    - 参加每周四午餐时间的 IT 社团答疑。
    - 其他问题,请发送邮件至 [email protected]
    
  6. 在右上方,使用 Commit changes... 按钮,直接提交到 prepare-to-collaborate 分支。

⌨️ 实操练习:指定代码负责人

随着越来越多的人加入,你希望核心功能的修改仍然由你把关。这可以通过 CODEOWNERS 文件来实现。

  1. 返回 Code tab。确保你在 prepare-to-collaborate 分支上。

  2. 在顶部目录,创建一个名为 CODEOWNERS 的新文件(区分大小写,无扩展名)。

  3. 添加以下内容:

    # Core functionality - changes here should be rare!
    /src/app.py                   @{{ login }}
    /src/backend/database.py      @{{ login }}
    /src/backend/routers/auth.py  @{{ login }}
    
    # The frontend will need refactored soon to be more object oriented.
    /src/static/   @{{ login }}
    
  4. 在右上方,使用 Commit changes... 按钮,直接提交到 prepare-to-collaborate 分支。

  5. 文件提交后,等待片刻,让 Mona 检查你的工作、提供反馈并开启下一课。

⌨️ 实操练习:(可选) 添加你的第一个协作者

如果你已经准备好让别人参与开发,可以邀请他们加入:

[!IMPORTANT] 这一步是可选的,因为它需要其他人拥有 GitHub 账户才能参与。

  1. 在顶部导航中,选择 Settings tab。

  2. 在左侧导航中,选择 Collaborators

  3. 找到 Manage access 区域,然后点击 Add people 按钮。

  4. 输入朋友或同事的 GitHub 用户名或邮箱,然后点击 Add to repository 按钮。

[!IMPORTANT] 个人仓库只有一个协作角色类型。 " Collaborator" 获得权限,但没有 admin 权限。如果您需要更精细的权限,可以考虑创建一个免费的组织,并分配存储库角色

GitHub

步骤 3: 营造健康发展氛围

随着越来越多的人加入,Martinez 校长在晨会后特意找你谈话:“你的网站正成为学校的关键基础设施!我们需要确保它随着越来越多老师的加入而健康发展。你能添加一些指南来保持一切井然有序吗?”

随着课外活动网站的发展,你需要的不仅仅是技术保护和贡献指南。你还需要鼓励健康和建设性的沟通。

下面我们通过 Code of Conduct(行为准则)和 Issue Templates(问题模板)来营造健康的社区氛围。

  1. Code of Conduct - 这是一个规范社区成员行为准则的文件。把它想象成为学生手册,其中规定了尊重他人的行为规范、如何报告非技术问题以及违反规定的后果。

  2. Issue Templates - 问题模板要求大家按格式提问题,减少来回沟通成本

⌨️ 实操练习:用行为准则设定预期

让我们先为日益壮大的教师贡献者团队建立一些社区准则。

[!TIP] Contributor Covenant 是许多项目使用的流行行为准则。

  1. 在顶部导航中,返回 Code 选项卡。确保你在 prepare-to-collaborate 分支上。

  2. 在顶部目录,创建一个名为 CODE_OF_CONDUCT.md 的新文件(区分大小写)。

  3. 添加行为准则内容。

    # Mergington High School Code of Conduct
    
    ## Our Pledge
    
    In the interest of fostering an open and welcoming environment for
    our school community, we as contributors and maintainers pledge to
    make participation in the Extra-Curricular Activities project a
    respectful and harassment-free experience for everyone.
    
    ## Our Standards
    
    Examples of behavior that contributes to creating a positive environment include:
    
    - Using welcoming and inclusive language
    - Being respectful of differing viewpoints and experiences
    - Gracefully accepting constructive criticism
    - Focusing on what is best for the students and the school community
    - Showing empathy towards other community members
    
    Examples of unacceptable behavior include:
    
    - The use of inappropriate language or imagery
    - Trolling, insulting comments, and personal attacks
    - Public or private harassment
    - Publishing others' private information without explicit permission
    - Other conduct which could reasonably be considered inappropriate in a school setting
    
    ## Responsibilities
    
    Project maintainers are responsible for clarifying the standards of
    acceptable behavior and are expected to take appropriate and fair
    corrective action in response to any instances of unacceptable behavior.
    
    Project maintainers have the right and responsibility to remove, edit,
    or reject comments, commits, code, issues, and other contributions that
    are not aligned to this Code of Conduct.
    
    ## Scope
    
    This Code of Conduct applies both within project spaces and in public spaces
    when an individual is representing the project or the school. Examples of
    representing the project include using an official project email address,
    posting via an official social media account, or acting as an appointed
    representative at an online or offline event.
    
    ## Enforcement
    
    Instances of abusive, harassing, or otherwise unacceptable behavior may be
    reported to the IT Club faculty advisor. All complaints will be reviewed and
    investigated promptly and fairly.
    
    Project maintainers who do not follow or enforce the Code of Conduct in good faith may
    face temporary or permanent repercussions as determined by the school administration.
    
    ## Attribution
    
    This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org),
    version 1.4, available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html](https://www.contributor-covenant.org/version/1/4/code-of-conduct.html)
    
  4. 在右上角,使用 Commit changes... 按钮,将你的修改直接提交到 prepare-to-collaborate 分支。

⌨️ 实操练习:通过问题模板提升沟通效率

现在让我们创建 Issue 模板,以便其他教师可以以标准化的方式报告错误或提出新需求。

[!TIP] 建议你可以考虑用一下正在测试中的 Issue 表单功能,它能让大家提问题的时候更方便、更清晰。

  1. 在顶部导航栏,选择 Settings tab。

  2. 找到 Features 部分,确认 Issues 已启用。

  3. 点击 Set up templates 按钮进入问题模板编辑器。

    image
  4. 点击 Add template 下拉菜单,选择 Bug report

  5. 点击 Preview and edit 按钮查看当前模板。点击 Edit icon (铅笔) 图标进行编辑。

    image

    image

    image
  6. (可选) 为了让我们的学生和老师更省心,可以删除关于桌面和手机详情的部分。

  7. 对 "Feature request" 模板重复上述步骤。

    image
  8. 准备好模板后,让我们提交它们。点击右上角的 Propose changes 按钮。输入描述,并将分支设置为 add-issue-templates,然后点击 Commit changes。你可以忽略自动创建的拉取请求。

    image
  9. 提交文件后,等待片刻,让 Mona 检查你的工作、提供反馈并开启下一课。

[!TIP] 你有没有注意到,现在你正在 2 个分支上并行工作?这正是多人协作时的真实写照。

GitHub

步骤 4: 为不可避免的事情做好准备

当你在教师休息室喝着咖啡时,你突然意识到:随着越来越多的老师加入贡献,安全漏洞的出现只是时间问题。😱

这是不可避免的——哪怕维护再好的项目,也会遇到安全问题。让我们通过配置 GitHub 提供的一些工具来积极为这一天做好准备:

  1. Dependabot - 用来监控你项目依赖的第三方库,检测依赖中的已知漏洞,自动创建拉取请求,将依赖项升级到安全版本。

  2. Code Scanning - 分析代码库的代码,查找安全漏洞和编码错误。使用 GitHub Copilot Autofix 自动为这些警报建议修复方案。

  3. Security Policy and Private vulnerability reporting - 提供指南和简单表单,供安全研究人员和最终用户直接向代码库维护者报告漏洞。这可以防止在修复前公开敏感问题。

[!NOTE] 这只是一个快速设置指南。要更详细地设置每个服务,我们建议参考相关的 GitHub Skills 课程和/或 GitHub 文档。

⌨️ 实操练习:使用 Dependabot 自动更新安全补丁

通过配置 Dependabot,实现自动修复依赖漏洞,减少人工维护

[!TIP] 进一步了解,可以查看 GitHub Skills 上的 Secure Repository Supply Chain 课程!

  1. 在顶部导航,选择 Settings tab。

  2. 在左侧导航,选择 Advanced Security

  3. 找到 Dependabot 部分,确认或更改设置以匹配以下内容:

    • Dependabot alerts: enabled
    • Dependabot security updates: enabled
    • Grouped security updates: enabled
  4. 找到 Dependabot version updates 并点击 Enable 按钮。这会打开一个编辑器来创建配置文件。

    image
  5. 在左侧文件列表中,点击顶部 Expand file tree 按钮显示文件列表。在顶部,将分支切换到 prepare-to-collaborate。记住,我们的规则不允许直接修改 main 分支上的文件。

    image
  6. package-ecosytem 设置为 pip,以便 Dependabot 自动监控我们的 Python 依赖项。

    image
  7. 在右上角,使用 Commit changes... 按钮,直接将更改提交到 prepare-to-collaborate 分支。

⌨️ 实操练习:使用 Code Scanning 检测潜在的安全风险

我们学校没有人是专业软件开发人员,所以我们启用代码扫描功能,这样如果代码里可能存在安全隐患,就能及时提醒我们。同时,我们也配置 GitHub Copilot,让它可以自动生成修复问题的 Pull Request

[!TIP] 进一步了解,可以查看 GitHub Skills 上的 Introduction to CodeQL 课程!

  1. 在顶部导航,选择 Settings tab。

  2. 在左侧导航,选择 Advanced Security

  3. 找到 Code scanning 部分,点击 Set up 按钮并选择 Default 选项以打开配置面板。

    image
  4. 点击 Enable CodeQL 按钮接受默认配置。

    image
  5. Tools 部分下方,确认 Copilot Autofix 已启用。

    image

⌨️ 实操练习:建立漏洞上报机制

现在自动化的安全机制已经准备好了,接下来我们要为“真实的人”制定一份指南,让他们在发现安全漏洞时,可以用一种安全、规范的方式进行报告

  1. 在顶部导航,选择 Settings tab。

  2. 在左侧导航,选择 Advanced Security

  3. 找到 Private vulnerability reporting 设置,确认其状态为 enabled

  4. 在顶部导航,点击 Security tab。

  5. 在左侧导航,点击 Policy 选项。

  6. 点击 Start setup 按钮,启动编辑器以创建 SECURITY.md 文件。


  7. 在左侧文件列表中,点击顶部 Expand file tree 按钮显示文件列表。在顶部,将分支切换到 prepare-to-collaborate。记住,我们的规则不允许直接修改 main 分支上的文件。

  8. 我们将忽略提供的模板,而是使用 Mergington High School IT 部门的建议。添加以下内容:

    💡 小提示 如果你切换到一个不包含相同文件的分支,编辑器将变为空白。按下 Restore 按钮可以恢复上一个编辑器的内容。

    # Mergington High School Security Policy
    
    ## Reporting a Vulnerability
    
    At Mergington High, we take the security of our Extra-Curricular Activities website seriously, especially
    since it contains student information. If you discover a security vulnerability, please follow these steps:
    
    1. **Do not** create an issue on this repository, disclose the vulnerability publicly, or discuss it with other teachers/students.
    1. In the top navigation of this repository, click the **Security** tab.
    1. In the top right, click the **Report a vulnerability** button.
    1. Fill out the provided form. It will request information like:
       - A description of the vulnerability
       - Steps to reproduce the issue
       - Potential impact on student data or website functionality
       - Suggested fix (if you have one)
    1. Email the IT Club faculty advisor at [email protected] and inform them you have made a report. **Do not** include any vulnerability details.
    
    ## Response Timeline
    
    - We will acknowledge receipt of your report within 2 school days
    - We will provide an initial assessment within 5 school days
    - Critical issues affecting student data will be addressed immediately
    - We will create a private fork to solve the issue and invite you as a collaborator so you can see our progress and contribute.
    
    ## Thank You
    
    Your help in keeping our school's digital resources secure is greatly appreciated!
    Responsible disclosure of security vulnerabilities helps protect our entire school community.
    
  9. 在右上角,使用 Commit changes... 按钮,直接将更改提交到 prepare-to-collaborate 分支。

  10. 提交文件后,等待片刻,让 Mona 检查你的工作,提供反馈,并开启下一课的内容。

GitHub

步骤 5:发布(Release)

所有准备工作都已就绪,是时候正式发布了!

⌨️ 实操练习:合并协作更改

  1. 在顶部导航栏,选择 Pull requests 选项卡。

  2. 找到 prepare-to-collaborate 分支的拉取请求并合并。你可能需要等待新的安全扫描完成。

  3. 找到 add-issue-templates 分支的拉取请求并合并。你可能需要等待新的安全扫描完成。

  4. 两个拉取请求都合并后,Mona 将准备最终的评审并确认练习完成!干得漂亮!你已全部完成!🎉

GitHub

课程回顾

恭喜你,你已经成功完成了这个课程!现在,你已经为与同事们愉快的协作做好了充分准备!

celebrate

你已经成功为 Mergington 高中的课外活动网站做好了健康、安全的协作准备。快去告诉校长,让他向 IT 部门炫耀你的积极行动吧!

下面是本次课程的总结:

  • 通过 .gitignore 和分支保护机制,防止了代码被意外损坏。
  • 通过 CONTRIBUTING.mdCODEOWNERS 设定了清晰的贡献指南。
  • 建立了社区标准,包括行为准则 (Code of Conduct) 和结构化的问题模板。
  • 通过启用自动化扫描和提供安全的上报流程,为未来的安全挑战做好了准备。

接下来学什么?

这次课程旨在带你了解仓库管理的不同方面。然而,还有更多内容等待你去探索!

这里有一些推荐的进阶课程:

以下是你可以从 GitHub 官方文档 查阅的更多有用资源:

关于 GitHub Skills

GitHub Skills 是 GitHub 官方提供的交互式学习平台。 原始课程需要在 GitHub 上执行操作,通过 GitHub Actions 自动检测进度。

本页面将所有步骤展示在一个页面中,方便您一次性阅读全部内容。

前往 GitHub 实操练习