# 拉取请求和讨论

Hub 中的 Pull requests 和 Discussions 允许用户对仓库进行社区贡献。Pull requests 和 discussions 在所有仓库类型中的工作方式相同。

从宏观层面来看，其目标是构建一个更简化的版本，类似于其他 Git 托管平台（如 GitHub）的 PR 和 Issues：
- 不涉及任何分支：贡献者直接推送到源仓库上的特殊 `ref` 分支。
- 讨论和 PR 之间没有严格的界限：它们本质上是一样的，因此显示在相同的列表中。
- 它们针对机器学习（即模型/数据集/空间仓库）进行了优化，而非任意仓库。

_请注意，Pull Requests 和讨论可以在[仓库设置](./repositories-settings#disabling-discussions--pull-requests)中启用或禁用_

## 列表

通过访问任意仓库中的社区选项卡，您可以查看所有讨论和拉取请求。您还可以进行筛选，仅查看处于打开状态的项目。

## 查看

Discussion 页面允许您查看来自不同用户的评论。如果是 Pull Request，您可以前往 Files changed 选项卡查看所有更改。

## 编辑讨论 / 拉取请求标题

如果您已提交 PR 或讨论，是仓库的作者，或拥有该仓库的写入权限，则可以通过点击铅笔按钮来编辑讨论标题。

## 固定讨论 / 拉取请求

如果您对某个仓库具有写入权限，则可以置顶讨论和 Pull Requests。被置顶的讨论会显示在所有讨论的顶部。

## 锁定讨论 / 拉取请求

如果您对某个仓库具有写入权限，则可以锁定讨论或 Pull Requests。讨论被锁定后，之前的评论仍然可见，但用户将无法添加新的评论。

## 评论的编辑与审核

如果您撰写了评论或对仓库具有写入权限，可以从评论框右上角的上下文菜单中编辑评论内容。

编辑完评论后，评论上方会出现一个新链接。该链接显示编辑历史。

你也可以隐藏评论。隐藏评论后无法撤销，任何人都将无法再查看或编辑其内容。

另请参阅 [内容审核](./moderation)，了解如何举报不当评论。

## 我可以在评论和讨论中使用 Markdown 和 LaTeX 吗？

是的！你可以使用 Markdown 为评论添加格式。此外，你还可以使用 LaTeX 进行数学排版，你的公式会先通过 [KaTeX](https://katex.org/) 渲染，然后再在 Markdown 中解析。

对于 LaTeX 公式，您必须使用以下分隔符：
- `$$ ... $$` 用于显示模式
- `&#92;&#92;(...\\)` 用于行内模式（斜杠和括号之间没有空格）。

## 如何在本地管理 Pull requests？

假设你的 PR 编号是 42。

```bash
git fetch origin refs/pr/42:pr/42
git checkout pr/42
# Do your changes
git add .
git commit -m "Add your change"
git push origin pr/42:refs/pr/42
```

### 草稿模式

在“高级模式”下从零开始创建新的 Pull request 时，草稿模式是默认状态。在此状态下，其他贡献者会知道您的 Pull request 仍在开发中，且无法合并。当您的分支准备就绪时，只需点击“Publish”按钮，即可将 Pull request 的状态更改为“Open”。请注意，一旦发布，就无法再返回草稿模式。

## 删除 Pull request ref

当 Pull request 被关闭或合并后，您可以删除其关联的 git ref（存储该 PR 提交的分支），以释放存储空间。

在关闭或合并 PR 后，您会在讨论区底部看到一条通知，显示删除该 ref 后可释放的预估存储空间。点击“Delete ref”按钮即可永久删除该 PR 的 git ref 并回收存储空间。

> [!TIP]
> 当主分支经过压缩（squash）且后续删除了某些文件时，这一点尤为有用。即使这些文件并非由该 PR 本身添加，它们仍会保留在 PR 分支的历史记录中，占用本可释放的存储空间。

> [!WARNING]
> 删除 PR ref 是不可逆的。删除后，您将无法再在本地获取或检出该 PR 的提交。

## Pull requests 高级用法

### 在 git 仓库中，更改存储在哪里？

我们的 Pull requests 不使用 fork 和 branch，而是使用直接存储在源仓库中的自定义“分支”，称为 `refs`。

[Git 引用](https://git-scm.com/book/en/v2/Git-Internals-Git-References)是 git 的内部机制，它已经用于存储标签和分支。

使用自定义 refs（例如 `refs/pr/42`）而非分支的优势在于，克隆仓库的人（包括仓库“所有者”）默认不会获取这些 refs，但仍可按需获取。

### 获取所有 Pull requests：献给 git 魔法师 🧙‍♀️

您可以调整本地的 **refspec** 以获取所有 Pull requests：

1. 获取

```bash
git fetch origin "refs/pr/*:refs/remotes/origin/pr/*"
```

2. 创建一个跟踪该引用的本地分支

```bash
git checkout pr/{PR_NUMBER}
# for example: git checkout pr/42
```

3. 如果您进行了本地更改，要将其推送到 PR 分支：

```bash
git push origin pr/{PR_NUMBER}:refs/pr/{PR_NUMBER}
# for example: git push origin pr/42:refs/pr/42
```

