# Pull requests와 Discussions

Hub의 Pull requests와 Discussions를 통해 사용자는 저장소에 커뮤니티 기여를 할 수 있습니다. Pull requests와 Discussions는 모든 저장소 유형에서 동일한 방식으로 작동합니다.

전체적으로, 다른 git 호스트(예: GitHub)의 PR과 Issues의 더 간단한 버전을 구축하는 것이 목표입니다:
- 포크가 관여되지 않습니다: 기여자는 소스 저장소에서 특수한 `ref` 브랜치에 직접 push합니다.
- discussion과 PR 사이에 명확한 구분이 없습니다. 본질적으로 동일하기 때문에 동일한 목록에 표시됩니다.
- ML(즉, 모델/데이터셋/스페이스 저장소)에 최적화되어 있으며, 임의의 저장소에는 적용되지 않습니다.

_참고로, Pull Requests와 discussions는 [repository settings](./repositories-settings#disabling-discussions--pull-requests)에서 활성화하거나 비활성화할 수 있습니다._

## 목록

어떤 저장소에서든 커뮤니티 탭으로 이동하면 모든 Discussions와 Pull requests를 볼 수 있습니다. open 상태인 항목만 필터링하여 볼 수도 있습니다.

## 보기

Discussion 페이지를 통해 다양한 사용자의 댓글을 확인할 수 있습니다. Pull Request인 경우, Files changed 탭으로 이동하여 모든 변경 사항을 볼 수 있습니다.

## 토론 / Pull request 제목 편집

PR이나 discussion을 열었거나, 저장소의 작성자이거나, 저장소에 쓰기 권한이 있는 경우 연필 버튼을 클릭하여 discussion 제목을 편집할 수 있습니다.

## 토론 / Pull Request 고정

리포지토리에 대한 쓰기 권한이 있으면 토론과 Pull Requests를 고정할 수 있습니다. 고정된 토론은 모든 토론 목록의 상단에 표시됩니다.

## 토론/풀 리퀘스트 잠금

리포지토리에 대한 쓰기 권한이 있으면 토론이나 Pull Requests를 잠금 처리할 수 있습니다. 토론이 잠금 처리되면 이전 댓글은 여전히 표시되며, 사용자는 새 댓글을 추가할 수 없습니다.

## 댓글 편집 및 관리

리포지토리에 댓글을 작성했거나 쓰기 권한이 있는 경우, 댓글 상자의 오른쪽 위 모서리에 있는 컨텍스트 메뉴에서 댓글 내용을 편집할 수 있습니다.

댓글이 수정되면 댓글 위에 새 링크가 나타납니다. 이 링크는 수정 이력을 표시합니다.

댓글을 숨길 수도 있습니다. 댓글을 숨기면 되돌릴 수 없으며, 더 이상 아무도 해당 내용을 볼 수 없거나 수정할 수 없습니다.

부적절한 댓글을 신고하는 방법을 확인하려면 [moderation](./moderation)도 읽어보세요.

## 댓글과 토론에서 Markdown과 LaTeX를 사용할 수 있나요?

네! Markdown을 사용하여 댓글에 서식을 추가할 수 있습니다. 또한 수식 작성을 위해 LaTeX를 사용할 수 있으며, 수식은 Markdown으로 파싱되기 전에 [KaTeX](https://katex.org/)로 렌더링됩니다.

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

Draft mode는 "Advanced mode"에서 새 Pull request를 처음 생성할 때 기본 상태입니다. 이 상태에서는 다른 기여자가 해당 Pull request가 작업 중임을 알 수 있으며, 병합할 수 없습니다. 브랜치가 준비되면 "Publish" 버튼을 눌러 Pull request의 상태를 "Open"으로 변경하면 됩니다. 게시한 후에는 Draft mode로 되돌릴 수 없습니다.

## Pull request ref 삭제

Pull request가 닫히거나 병합되면, 해당 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는 포크와 브랜치를 사용하지 않고, 소스 저장소에 직접 저장되는 `refs`라는 이름의 사용자 지정 "브랜치"를 사용합니다.

[Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)는 태그와 브랜치를 이미 저장하는 git의 내부 메커니즘입니다.

브랜치가 아닌 커스텀 ref(예: `refs/pr/42`)를 사용하는 장점은, 리포지토리를 클론하는 사용자(리포지토리 "owner" 포함)가 기본적으로 이를 가져오지 않지만, 필요할 때 언제든지 가져올 수 있다는 것입니다.

### 모든 Pull requests 가져오기: git 마법사들을 위해 🧙‍♀️

로컬 **refspec**를 조정하여 모든 Pull requests를 가져올 수 있습니다:

1. Fetch

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

