# Pull requests と Discussions

HubのPull requests（プルリクエスト）とDiscussions（ディスカッション）により、ユーザーはリポジトリへのコミュニティ貢献を行うことができます。Pull requestsとDiscussionsは、すべてのリポジトリタイプで同じように機能します。

大まかに言えば、その目的は、GitHubなどの他のgitホストのPRやIssuesのよりシンプルなバージョンを構築することです：
- フォークは関与しません。コントリビューターはソースリポジトリ上の特別な`ref`ブランチに直接プッシュします。
- ディスカッションとPRには明確な区別はなく、本質的には同じものであるため、同じリストに表示されます。
- これらはML（つまり、モデル/データセット/スペースのリポジトリ）用に最適化されており、任意のリポジトリには対応していません。

_なお、Pull Requestsとディスカッションは、[リポジトリ設定](./repositories-settings#disabling-discussions--pull-requests)から有効化または無効化できます。_

## リスト

リポジトリのコミュニティタブに移動すると、すべてのDiscussionsとPull requestsを確認できます。また、オープン状態のもののみに絞り込むこともできます。

## 表示

Discussionページでは、異なるユーザーからのコメントを確認できます。Pull Requestの場合は、Files changedタブに移動することで、すべての変更を確認できます。

## ディスカッション / Pull request のタイトルを編集する

PRやディスカッションを作成した、リポジトリの作成者である、または書き込みアクセス権を持っている場合は、鉛筆アイコンをクリックしてディスカッションのタイトルを編集できます。

## ディスカッション / Pull Request をピン留めする

リポジトリへの書き込みアクセス権がある場合、ディスカッションと Pull Request をピン留めできます。ピン留めされたディスカッションは、すべてのディスカッションの上部に表示されます。

## ディスカッション / Pull Request をロックする

リポジトリへの書き込みアクセス権がある場合、ディスカッションや Pull Request をロックできます。ディスカッションがロックされると、以前のコメントは引き続き表示されますが、ユーザーは新しいコメントを追加できなくなります。

## コメントの編集とモデレーション

コメントを書き込んだ場合、またはリポジトリへの書き込み権限がある場合は、コメントボックスの右上隅にあるコンテキストメニューから、コメントの内容を編集できます。

コメントが編集されると、コメントの上に新しいリンクが表示されます。このリンクには編集履歴が表示されます。

コメントを非表示にすることもできます。コメントの非表示は元に戻すことができず、その内容は誰も表示できなくなり、編集もできなくなります。

不適切なコメントの報告方法については、[moderation](./moderation)も参照してください。

## コメントやディスカッションでMarkdownとLaTeXを使用できますか？

はい！コメントに書式を追加するにはMarkdownを使用できます。さらに、数式の組版にはLaTeXを利用でき、数式はMarkdownで解析される前に[KaTeX](https://katex.org/)によってレンダリングされます。

LaTeXの数式には、以下の区切り記号を使用する必要があります:
- `$$ ... $$` は表示モード用
- インラインモードには`&#92;&#92;(...\\)`を使用します（スラッシュと括弧の間にスペースを入れないでください）。

## ローカルでPull requestを管理するにはどうすればよいですか？

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
```

### ドラフトモード

Draft modeは、"Advanced mode"で新しいPull requestをゼロから作成した際のデフォルトのステータスです。このステータスにより、他のコントリビューターは、あなたのPull requestが作業中であり、マージできないことを知ることができます。ブランチが準備できたら、"Publish"ボタンを押すだけで、Pull requestのステータスを"Open"に変更できます。公開した後は、Draft modeに戻すことはできないことに注意してください。

## Pull request ref の削除

Pull request がクローズまたはマージされた場合、関連する git ref（PR のコミットを保存するブランチ）を削除して、ストレージの空き領域を確保できます。

PRをクローズまたはマージした後、ディスカッションの下部に、そのrefを削除することで解放できる推定ストレージ容量が表示されます。Delete refボタンをクリックすると、PRのgit refが恒久的に削除され、ストレージが回収されます。

> [!TIP]
> これは、メインブランチがスクワッシュされ、その後でファイルが削除された場合に特に役立ちます。これらのファイルは、PR自体によって追加されなかった場合でも、PRブランチの履歴に残り続け、解放できるはずのストレージを占有し続けます。

> [!WARNING]
> PR ref の削除は元に戻せません。一度削除すると、ローカルで PR のコミットをフェッチしたりチェックアウトしたりできなくなります。

## Pull requests 高度な使用法

### gitリポジトリのどこに変更が保存されますか？

当社のPull requestはフォークやブランチを使用せず、代わりにソースリポジトリに直接保存される`refs`と呼ばれるカスタムの「ブランチ」を使用しています。

[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)は、gitがタグやブランチを保存するために内部で使用している仕組みです。

ブランチではなく、カスタムリファレンス（`refs/pr/42` など）を使用する利点は、リポジトリをクローンする人々（リポジトリの「オーナー」を含む）がデフォルトではそれらをフェッチしない一方で、必要に応じてフェッチできる点です。

### すべてのPull requestを取得します: gitの魔法使い🧙‍♀️向け

ローカルの**refspec**を調整して、すべてのPull requestを取得できます。

1. 取得

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

2. refを追跡するローカルブランチを作成します

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

3. ローカルで変更を加えた場合、PRのrefにプッシュするには:

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

