# 参与项目

了解如何通过复刻参与项目。

在 GitHub 上为项目做贡献，是开发者和协作者为实现共同目标协同工作的一项重要技能。 无论是修复 bug、添加功能，还是改进文档，贡献的过程都有助于实现结构化的高效协作。

通过遵循 GitHub 的工作流（创建仓库分支、创建分支并提交拉取请求），你可以提出项目更改建议，并获得反馈，而不会打扰到他人的工作。

本指南提供有关使用 GitHub UI 和命令行参与项目的说明。 有关使用 GitHub Desktop 参与的详细信息，请参阅 [从 GitHub Desktop 克隆和派生存储库](/zh/desktop/adding-and-cloning-repositories/cloning-and-forking-repositories-from-github-desktop)。 有关 GitHub CLI（命令行接口）的相同功能, 请参阅 [GitHub CLI 快速入门](/zh/enterprise-server@3.22/github-cli/github-cli/quickstart)。

## 关于复刻

如果你想为别人的项目做贡献，但没有直接修改权限，你可以创建该项目的副本，进行更新，然后建议将这些更新合并到主项目中。 这个过程通常被称为“创建分支和拉取请求”工作流。

创建自己的项目副本（或“分支”）时，就像是创建一个与原始项目共享代码的新工作空间。 这对于开源项目或没有原始项目的写入访问权限的任何时候都很有用。

在副本中进行更改后，可以将其作为拉取请求提交，这是向主项目提出更改的一种方式。 有关详细信息，请参阅“[为存储库创建分支](/zh/enterprise-server@3.22/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo)”。

## 创建您自己的项目副本

本教程使用 [Spoon-Knife 项目](https://github.com/octocat/Spoon-Knife)，这是一个托管在 GitHub 上的测试存储库，可让你测试分支和拉取请求工作流。

1. 导航到位于 <https://github.com/octocat/Spoon-Knife> 的 `Spoon-Knife` 项目。
2. 在页面右上角，单击“分支”\*\*\*\*。

   ![存储库的主页的屏幕截图。 带有“Fork”图标和“Fork 59.3k”标签的按钮被深橙色框出。](/assets/images/help/repository/fork-button.png)
3. 在“所有者”下，选择下拉菜单，然后单击分支存储库的所有者。
   > \[!NOTE] 如果用户名灰显，是因为该分支已存在。 这时应改为更新现有的分支。 有关详细信息，请参阅“[同步分支](/zh/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. （可选）选中“仅复制默认分支”\*\*\*\*。

   对于许多分支场景（例如参与开源项目），你只需复制默认分支。 如果未选择此选项，所有分支都将复制到新分支中。
7. 单击“创建分支”\*\*\*\*。

> \[!NOTE]
> 如果要从上游存储库复制其他分支，可从“分支”页执行此操作\*\*\*\*。 有关详细信息，请参阅“[管理存储库中的分支](/zh/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> Code”\*\*\*\*。

   ![存储库登陆页面上的文件列表的屏幕截图。 “代码”按钮以深橙色轮廓突出显示。](/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 Flow](/zh/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` 之前的一个提交。 单击“参与”，然后单击“打开拉取请求” 。

GitHub 会将你带到一个页面，其中显示了分支和 `octocat/Spoon-Knife` 存储库之间的差异。 单击“创建拉取请求”\*\*\*\*。

GitHub 会将你转到一个页面，你可在这里输入更改的标题和说明。 重要的是要提供尽可能多的有用信息，并说明您提出此拉取请求的理由。 项目所有者需要能够确定您的更改是否像您认为的那样对每个人都有用。 最后，单击“创建提交请求”。