# 프로젝트에 기여

포크를 통해 프로젝트에 기여하는 방법을 알아봅니다.

GitHub에서 프로젝트에 기여하는 것은 공동 목표를 달성하기 위해 함께 작업하는 개발자와 공동 작업자에게 반드시 필요한 기술입니다. 버그를 수정하거나, 기능을 추가하거나, 문서를 개선하는 등 어떤 작업을 하든 기여하는 과정은 체계적이고 효율적인 협업을 가능하게 합니다.

리포지토리를 포크하고, 분기를 만들고, 끌어오기 요청을 제출하는 GitHub 흐름에 따르면, 다른 사용자의 작업을 방해하지 않고도 프로젝트에 변경 내용을 제안하고 피드백을 받을 수 있습니다.

이 가이드에서는 GitHub UI 및 명령줄을 사용하여 프로젝트에 기여하는 방법에 대한 지침을 제공합니다. GitHub Desktop에 기여하는 방법에 대한 자세한 내용은 [GitHub Desktop에서 리포지토리 복제 및 포크](/ko/desktop/adding-and-cloning-repositories/cloning-and-forking-repositories-from-github-desktop) 참조하세요. GitHub CLI(명령줄 인터페이스)와 동일한 내용은 [GITHUB CLI 빠른 시작](/ko/enterprise-server@3.22/github-cli/github-cli/quickstart) 참조하세요.

## 포크 정보

다른 사람의 프로젝트에 기여하고 싶지만 직접 변경할 수 있는 권한이 없는 경우 프로젝트의 복사본을 직접 만들고, 업데이트를 만든 다음, 기본 프로젝트에 포함하도록 해당 업데이트를 제안할 수 있습니다. 이 프로세스를 “포크 및 끌어오기 요청” 워크플로라고도 합니다.

프로젝트의 고유한 복사본(또는 “포크”)을 만들 때 원래 프로젝트와 코드를 공유하는 새 작업 영역을 만드는 것과 같습니다. 이는 오픈 소스 프로젝트 또는 원래 프로젝트에 대한 쓰기 권한이 없는 경우에 유용합니다.

복사본에 변경 내용을 적용한 후 끌어오기 요청으로 제출할 수 있습니다. 이는 기본 프로젝트에 변경 내용을 다시 제안하는 방법입니다. 자세한 내용은 [리포지토리를 포크하다](/ko/enterprise-server@3.22/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo)을(를) 참조하세요.

## 프로젝트의 고유한 복사본 만들기

이 자습서에서는 포크 및 끌어오기 요청 워크플로를 테스트할 수 있는 GitHub에서 호스트되는 테스트 리포지토리인 [Spoon-Knife 프로젝트](https://github.com/octocat/Spoon-Knife)를 사용합니다.

1. `Spoon-Knife`에서 <https://github.com/octocat/Spoon-Knife> 프로젝트로 이동합니다.
2. 페이지의 오른쪽 상단에서 **Fork**(포크)를 클릭합니다.

   ![리포지토리의 기본 페이지 스크린샷 포크 아이콘과 "포크 59.3k"가 함께 레이블된 버튼은 진한 주황색 윤곽선으로 둘러싸여 있습니다.](/assets/images/help/repository/fork-button.png)
3. "소유자"에서 드롭다운 메뉴를 선택하고 포크된 리포지토리의 소유자를 선택합니다.
   > \[!NOTE] 만약 사용자의 이름이 회색으로 표시되어 있다면 포크가 이미 존재하기 때문입니다. 대신 기존 포크를 최신 상태로 유지해야 합니다. 자세한 내용은 [포크 동기화](/ko/enterprise-server@3.22/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork#syncing-a-fork-branch-from-the-web-ui)을(를) 참조하세요.
4. 기본적으로 포크의 이름은 업스트림 리포지토리와 동일합니다. 필요에 따라 포크를 더 구분하려면, "리포지토리 이름" 필드에 이름을 입력합니다.
5. 필요에 따라 ‘설명’ 필드에 포크 설명을 입력합니다.
6. 필요에 따라 **DEFAULT 분기만 복사**를 선택합니다.

   오픈 소스 프로젝트에 기여하는 것과 같은 많은 포크 시나리오의 경우 기본 분기만 복사하면 됩니다. 이 옵션을 선택하지 않으면, 모든 브랜치가 새 포크로 복사됩니다.
7. **포크 만들기**를 클릭합니다.

> \[!NOTE]
> 업스트림 리포지토리에서 추가 분기를 복사하려는 경우 **분기** 페이지에서 복사할 수 있습니다. 자세한 내용은 [리포지토리 내에서 분기 관리](/ko/enterprise-server@3.22/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-and-deleting-branches-within-your-repository)을(를) 참조하세요.

## 포크 저장소를 컴퓨터로 복제하기

Spoon-Knife 리포지토리를 성공적으로 복제했지만, 지금까지는 GitHub에만 존재합니다. 프로젝트에서 사용하려면 이를 컴퓨터에 복제해야 합니다.

명령줄, GitHub CLI 또는 GitHub Desktop을 사용하여 포크를 복제할 수 있습니다.

1. GitHub에서 Spoon-Knife 리포지토리의 **당신의 포크**로 이동합니다.

2. 파일 목록 위에서 **<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-code" aria-label="code" role="img"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg> 코드**를 클릭합니다.

   ![리포지토리의 방문 페이지에 있는 파일 목록의 스크린샷. "코드" 단추는 진한 주황색 윤곽선으로 강조 표시됩니다.](/assets/images/help/repository/code-button.png)

3. 리포지토리의 URL을 복사합니다.

   * HTTPS를 사용하여 리포지토리를 복제하려면 "HTTPS"에서 <svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-copy" aria-label="copy icon" role="img"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg>를 클릭합니다.
   * 조직의 SSH 인증 기관에서 발급한 인증서를 포함하여 SSH 키를 사용하여 리포지토리를 복제하려면 **SSH**를 클릭한 다음, <svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-copy" aria-label="Copy to clipboard" role="img"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg>를 클릭합니다.
   * GitHub CLI를 사용하여 리포지토리를 복제하려면 **GitHub CLI** 를 클릭한 다음, <svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-copy" aria-label="Copy to clipboard" role="img"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg>을 클릭합니다.

     !["코드" 드롭다운 메뉴의 스크린샷. 리포지토리의 HTTPS URL 오른쪽에 복사 아이콘이 진한 주황색으로 표시됩니다.](/assets/images/help/repository/https-url-clone-cli.png)

4. Mac 또는 Linux에서 터미널을 엽니다. Windows Git Bash를 엽니다.

5. 현재 작업 디렉터리를 복제 대상 디렉터리의 위치로 변경합니다.

6. `git clone`을 입력한 다음 이전에 복사한 URL을 붙여넣습니다. 그러면 다음과 같이 되며, 여기서 `YOUR-USERNAME` 대신 GitHub 사용자 이름을 사용합니다.

   ```shell
   git clone https://HOSTNAME/YOUR-USERNAME/Spoon-Knife
   ```

7. **Enter** 키를 누릅니다. 로컬 복제본이 만들어집니다.

   ```shell
   $ git clone https://HOSTNAME/YOUR-USERNAME/Spoon-Knife
   > Cloning into `Spoon-Knife`...
   > remote: Counting objects: 10, done.
   > remote: Compressing objects: 100% (8/8), done.
   > remove: Total 10 (delta 1), reused 10 (delta 1)
   > Unpacking objects: 100% (10/10), done.
   ```

## 작업할 브랜치 만들기

프로젝트를 변경하기 전에 새 분기를 만들고 체크 아웃해야 합니다. 자체 분기의 변경 내용을 유지하여 GitHub 흐름을 따르고 나중에 동일한 프로젝트에 더 쉽게 기여할 수 있는지 확인합니다.
[GitHub 플로우](/ko/enterprise-server@3.22/get-started/using-github/github-flow#following-github-flow)을(를) 참조하세요.

```shell
git branch BRANCH-NAME
git checkout BRANCH-NAME
```

## 변경 사항 수정 및 반영하기

[Visual Studio Code](https://code.visualstudio.com)과(와) 같이 즐겨찾는 텍스트 편집기를 사용하여 프로젝트 내용을 몇 가지 변경합니다. 예를 들어 `index.html`에서 텍스트를 변경하여 GitHub 사용자 이름을 추가할 수 있습니다.

변경 내용을 제출할 준비가 되면 변경 내용을 스테이징하고 커밋합니다.
`git add .`는 Git에 다음 커밋에 모든 변경 내용을 포함하도록 지시합니다.
`git commit`은 변경 내용의 스냅샷을 만듭니다.

```shell
git add .
git commit -m "a short description of the change"
```

파일을 스테이징하고 커밋하면 Git에 “내 변경 사항의 스냅샷을 만들어 줘”라고 전달하는 셈입니다. 계속해서 더 많은 변경을 수행하고 더 많은 커밋 스냅샷을 만들 수 있습니다.

현재, 변경 내용은 로컬에만 존재합니다. GitHub까지 변경 내용을 푸시할 준비가 되면 변경 내용을 원격으로 푸시합니다.

```shell
git push
```

## 끌어오기 요청

끌어오기 요청을 생성하는 것은 다른 사람의 프로젝트의 포크를 제작하는 과정에서의 마지막 단계입니다. 유익한 변경을 수행하고 원래 리포지토리에 제안하려는 경우, 유지 관리자가 검토할 수 있도록 끌어오기 요청을 만듭니다.

이렇게 하려면 프로젝트가 있는 GitHub의 리포지토리로 이동합니다. 이 예시에서는 `https://github.com/<your_username>/Spoon-Knife`에 있을 것입니다. `octocat:main`의 앞에 분기가 앞에 하나의 커밋임을 나타내는 배너가 표시됩니다.
**Contribute**를 클릭하고 **Open a pull request**를 엽니다.

GitHub를 통해 포크와 `octocat/Spoon-Knife` 리포지토리 간의 차이점을 보여 주는 페이지로 이동합니다.
**\[끌어오기 요청 만들기]** 를 클릭합니다.

GitHub를 통해 변경 내용에 대한 제목과 설명을 입력할 수 있는 페이지로 이동합니다. 처음에 이 끌어오기 요청을 만드는 이유에 대한 유용한 정보와 근거를 최대한 제공하는 것이 중요합니다. 변경 내용이 생각만큼 모든 사람에게 유용한지 프로젝트 소유자가 확인할 수 있어야 합니다. 마지막으로, **Create pull request**(끌어오기 요청 만들기)를 클릭합니다.