# Pull request'ы и Discussions

Hub Pull requests and Discussions позволяют пользователям вносить вклад в репозитории от сообщества. Pull requests и discussions работают одинаково для всех типов репозиториев.

В общих чертах, цель состоит в том, чтобы создать более простую версию PR и Issues, как у других хостингов git (например, GitHub):
- в процессе не используются форки: участники отправляют изменения в специальную ветку `ref` непосредственно в исходный репозиторий.
- нет чёткого разграничения между обсуждениями и PR: по сути, они одинаковы, поэтому отображаются в одних и тех же списках.
- они оптимизированы для ML (т.е. для репозиториев моделей/датасетов/spaces), а не для произвольных репозиториев.

_Обратите внимание, что Pull Requests и обсуждения можно включить или отключить в [настройках репозитория](./repositories-settings#disabling-discussions--pull-requests)_

## Список

Перейдя на вкладку community в любом репозитории, вы можете просмотреть все обсуждения и pull request'ы. Также можно отфильтровать список, чтобы видеть только открытые.

## Просмотр

Страница 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
```

### Черновой режим

Draft mode — это статус по умолчанию при создании нового Pull request с нуля в «Advanced mode». При этом статусе другие участники понимают, что над вашим Pull request ещё ведётся работа, и он не может быть объединён. Когда ваша ветка готова, просто нажмите кнопку «Publish», чтобы изменить статус Pull request на «Open». Обратите внимание, что после публикации вернуться в режим draft невозможно.

## Удаление ссылки Pull request

Когда Pull request закрывается или сливается, вы можете удалить связанную с ним git-ссылку (ветку, хранящую коммиты PR), чтобы освободить место на диске.

После закрытия или слияния PR внизу обсуждения появится уведомление с оценкой объёма хранилища, который можно освободить, удалив ref. Нажмите кнопку "Delete ref", чтобы безвозвратно удалить git ref PR и освободить место в хранилище.

> [!TIP]
> Это особенно полезно, если основная ветка была сжата (squash), а файлы удалены позже. Эти файлы остаются в истории ветки PR, даже если они не были добавлены самим PR, занимая место в хранилище, которое можно освободить.

> [!WARNING]
> Удаление PR-ссылки необратимо. После удаления вы больше не сможете получить или выполнить checkout коммитов PR локально.

## Расширенное использование pull request

### Где в репозитории git хранятся изменения?

Наши Pull requests не используют форки и ветки, а вместо них — пользовательские «ветки», называемые `refs`, которые хранятся непосредственно в исходном репозитории.

[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References) — это внутренняя механика git, которая уже хранит теги и ветки.

Преимущество использования пользовательских refs (например, `refs/pr/42`) вместо веток заключается в том, что они по умолчанию не загружаются людьми (включая «владельца» репозитория), клонирующими репозиторий, но при этом их можно запросить по требованию.

### Получение всех Pull requests: для магов git 🧙‍♀️

Вы можете настроить локальный **refspec**, чтобы получить все Pull requests:

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:

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

