{"title":"使用 Git 和 GitHub 工作","version":"6.1","locale":"zh-hans","docname":"internals/contributing/writing-code/working-with-git","url":"/zh-hans/6.1/internals/contributing/writing-code/working-with-git/","canonical":"https://djangodocs.dev/zh-hans/6.1/internals/contributing/writing-code/working-with-git/","summary":"This section explains how the community can contribute code to Django via pull requests. If you're interested in how mergers handle them, see 处理 pull 请求 .…","html":"<h1>使用 Git 和 GitHub 工作<a class=\"heading-anchor\" href=\"#working-with-git-and-github\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>This section explains how the community can contribute code to Django via pull\nrequests. If you're interested in how <a class=\"reference internal\" href=\"/zh-hans/6.1/internals/organization/#mergers-team\"><span class=\"std std-ref\">mergers</span></a> handle\nthem, see <a class=\"reference internal\" href=\"/zh-hans/6.1/internals/contributing/committing-code/#handling-pull-requests\"><span class=\"std std-ref\">处理 pull 请求</span></a>.</p>\n<p>接下来，我们将展示如何创建一个包含 Trac 问题 #xxxxx 的更改的 GitHub 拉取请求。通过创建一个完全准备好的拉取请求，你将会让审阅者的工作更容易，这意味着你的工作更有可能被合并到 Django 中。</p>\n<p>您也可以将传统的补丁程序上传到 Trac ，但对于评论来说不太实用。</p>\n<section id=\"installing-git\">\n<h2>安装 Git<a class=\"heading-anchor\" href=\"#installing-git\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django 使用 <a class=\"reference external\" href=\"https://git-scm.com/\">Git</a> 进行源代码控制。你可以从 <a class=\"reference external\" href=\"https://git-scm.com/download\">这里下载</a> Git，但通常更容易使用你的操作系统的包管理器进行安装。</p>\n<p>Django的 <a class=\"reference external\" href=\"https://github.com/django/django/\">Git 仓库</a>  托管在  <a class=\"reference external\" href=\"https://github.com/\">GitHub</a> 上，建议您也使用GitHub。</p>\n<p>在安装 Git 后，你首先要做的事情是设置你的姓名和电子邮件地址：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$<span class=\"w\"> </span>git<span class=\"w\"> </span>config<span class=\"w\"> </span>--global<span class=\"w\"> </span>user.name<span class=\"w\"> </span><span class=\"s2\">&quot;Your Real Name&quot;</span>\n$<span class=\"w\"> </span>git<span class=\"w\"> </span>config<span class=\"w\"> </span>--global<span class=\"w\"> </span>user.email<span class=\"w\"> </span><span class=\"s2\">&quot;you@email.com&quot;</span>\n</code></pre></div>\n<p>请注意， <code class=\"docutils literal notranslate\"><span class=\"pre\">user.name</span></code> 应该是您的真实姓名，而不是您的GitHub昵称。 GitHub应该知道您在 <code class=\"docutils literal notranslate\"><span class=\"pre\">user.email</span></code> 字段中使用的电子邮件，因为这将用于将提交与GitHub账户相关联。</p>\n</section>\n<section id=\"setting-up-local-repository\">\n<h2>设置本地仓库<a class=\"heading-anchor\" href=\"#setting-up-local-repository\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>当你创建了你的 GitHub 帐户，使用昵称 &quot;GitHub_nick&quot;，并且 <a class=\"reference external\" href=\"https://github.com/django/django/fork\">fork 了 Django 的存储库</a>，创建你的 fork 的本地副本：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>clone<span class=\"w\"> </span>https://github.com/GitHub_nick/django.git\n</code></pre></div>\n<p>这将创建一个新的目录 &quot;django&quot;，其中包含你 GitHub 存储库的克隆。此页面上的其余 Git 命令都需要在克隆的目录中运行，所以现在切换到该目录：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"nb\">cd</span><span class=\"w\"> </span>django\n</code></pre></div>\n<p>在 Git 中，你的 Github 仓库会被称做“origin”。</p>\n<p>你还应该将 <code class=\"docutils literal notranslate\"><span class=\"pre\">django/django</span></code> 设置为一个 &quot;upstream&quot; 远程仓库（也就是告诉 Git 参照 Django 的存储库作为你 fork 的源头）：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>remote<span class=\"w\"> </span>add<span class=\"w\"> </span>upstream<span class=\"w\"> </span>https://github.com/django/django.git\ngit<span class=\"w\"> </span>fetch<span class=\"w\"> </span>upstream\n</code></pre></div>\n<p>你可以以类似的方式添加其他远程仓库，例如：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>remote<span class=\"w\"> </span>add<span class=\"w\"> </span>akaariai<span class=\"w\"> </span>https://github.com/akaariai/django.git\n</code></pre></div>\n</section>\n<section id=\"working-on-a-ticket\">\n<h2>在工单上工作<a class=\"heading-anchor\" href=\"#working-on-a-ticket\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>在处理一个问题时，为这项工作创建一个新的分支，并以 <code class=\"docutils literal notranslate\"><span class=\"pre\">upstream/main</span></code> 为基础进行工作：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>-b<span class=\"w\"> </span>ticket_xxxxx<span class=\"w\"> </span>upstream/main\n</code></pre></div>\n<p>-b 参数在本地为您创建一个新分支。 即使是最小的事情，也不要犹豫创建新分支——这就是它们的用途。</p>\n<p>如果你正在为 1.4 分支上的修复工作，你会执行如下操作：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>-b<span class=\"w\"> </span>ticket_xxxxx_1_4<span class=\"w\"> </span>upstream/stable/1.4.x\n</code></pre></div>\n<p>假设工作是在 ticket_xxxxx 分支上进行的。进行一些更改并提交它们：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>commit\n</code></pre></div>\n<p>在编写提交消息时，遵循 <a class=\"reference internal\" href=\"/zh-hans/6.1/internals/contributing/committing-code/#committing-guidelines\"><span class=\"std std-ref\">提交消息指南</span></a> 以便让合并者的工作更容易。如果你不太擅长英语，至少尽量准确描述提交的操作。</p>\n<p>如果需要在你的分支上进行额外的工作，根据需要进行多次提交：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>commit<span class=\"w\"> </span>-m<span class=\"w\"> </span><span class=\"s1\">&#39;Added two more tests for edge cases.&#39;</span>\n</code></pre></div>\n<section id=\"publishing-work\">\n<h3>发布工作成果<a class=\"heading-anchor\" href=\"#publishing-work\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>你可以通过运行以下命令将你的工作发布到 GitHub：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>push<span class=\"w\"> </span>origin<span class=\"w\"> </span>ticket_xxxxx\n</code></pre></div>\n<p>当你访问你的 GitHub 页面时，你会注意到已经创建了一个新的分支。</p>\n<p>如果你正在处理一个 Trac 问题，你应该在问题中提到你的工作可以在你的 GitHub 存储库的 ticket_xxxxx 分支中找到。包括一个指向你的分支的链接。</p>\n<p>请注意，在Git中，上述分支称为“主题分支”。 您可以自由地重写该分支的历史记录，例如，使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">rebase</span></code> 变更基本。 其他人不应在这样的分支上进行工作，因为当您编辑提交时，他们的副本会损坏。</p>\n<p>还有&quot;公共分支&quot;。其他人应该 fork 这些分支，因此这些分支的历史永远不应该更改。<code class=\"docutils literal notranslate\"><span class=\"pre\">django/django</span></code> 存储库中的 &quot;main&quot; 和 &quot;stable/A.B.x&quot; 分支就是很好的公共分支的示例。</p>\n<p>当您准备将工作成果并入Django时，应在GitHub上创建一个pull请求。好的拉取请求要求：</p>\n<ul class=\"simple\">\n<li><p>commits with one logical change in each, following the\n<a class=\"reference internal\" href=\"/zh-hans/6.1/internals/contributing/writing-code/coding-style/\"><span class=\"doc\">coding style</span></a>,</p></li>\n<li><p>每次提交的格式正确的消息：摘要行，其后以72个字符包装的段落——有关详细信息，请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/internals/contributing/committing-code/#committing-guidelines\"><span class=\"std std-ref\">committing guidelines</span></a> 。</p></li>\n<li><p>如果需要，带有文档和测试——实际上一直需要测试，除了文档更改外。</p></li>\n</ul>\n<p>测试套件必须通过，并且文档的构建必须没有警告。</p>\n<p>一旦你创建了拉取请求，你应该在相关的 Trac 问题中添加一个评论，解释你所做的事情。特别是，你应该注明你运行测试的环境，例如：&quot;在 SQLite 和 MySQL 下都通过了所有测试&quot;。</p>\n<p>GitHub 上的拉取请求只有两种状态：打开和关闭。将处理你的拉取请求的合并者只有两个选项：合并它或关闭它。因此，在代码准备好合并或足够接近以便合并者可以自己完成之前，创建拉取请求并没有太大的用处。</p>\n</section>\n<section id=\"editing-commit-messages\">\n<span id=\"id1\"></span><h3>Editing commit messages<a class=\"heading-anchor\" href=\"#editing-commit-messages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>To change the message of the most recent commit, run:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>commit<span class=\"w\"> </span>--amend\n</code></pre></div>\n<p>This opens an editor with the current commit message. Edit it, save, and close\nto update the commit.</p>\n<p>To change the message of an earlier commit, use the &quot;reword&quot; option in\ninteractive rebase. For example, to reword one of the last three commits:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>rebase<span class=\"w\"> </span>-i<span class=\"w\"> </span>HEAD~3\n</code></pre></div>\n<p>This opens an editor listing the three commits, each prefixed with the word\n&quot;pick&quot;. Change &quot;pick&quot; to &quot;reword&quot; (or &quot;r&quot;) on the line of the commit you want\nto change, then save and close. A new editor will open for each commit marked\nas &quot;reword&quot;, allowing you to update the message.</p>\n<p>See <a class=\"reference internal\" href=\"/zh-hans/6.1/internals/contributing/committing-code/#committing-guidelines\"><span class=\"std std-ref\">提交指南</span></a> for the required commit message format.</p>\n<p>After rewriting a commit that has already been pushed to GitHub, you will need\nto force-push your branch:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>push<span class=\"w\"> </span>--force-with-lease<span class=\"w\"> </span>origin<span class=\"w\"> </span>ticket_xxxxx\n</code></pre></div>\n</section>\n<section id=\"rebasing-branches\">\n<h3>分支变基<a class=\"heading-anchor\" href=\"#rebasing-branches\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>In the example above, you created two commits, the &quot;Fixed #xxxxx  -- ...&quot;\ncommit and the &quot;Added two more tests ...&quot; commit.</p>\n<p>我们不想在您的代码库中拥有您工作过程的全部历史记录。您的提交“添加了两个以上的测试”将毫无助益。相反，我们只希望一次提交包含您的所有工作。</p>\n<p>要重塑你的分支历史，你可以使用交互式变基将多个提交合并成一个：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>rebase<span class=\"w\"> </span>-i<span class=\"w\"> </span>HEAD~2\n</code></pre></div>\n<p>上面的 HEAD~2 是最近两次提交的简写。 上面的命令将打开一个编辑器，显示两个提交，前缀为 &quot;pick&quot; 。</p>\n<p>将第二行的 &quot;pick&quot; 更改为 &quot;squash&quot;。这将保留第一个提交，并将第二个提交合并到第一个提交中。保存并退出编辑器。然后会打开第二个编辑器窗口，以便你可以修改包含两个步骤的提交消息。</p>\n<p>你也可以在变基中使用 &quot;edit&quot; 选项。这样你可以修改单个提交，例如修复文档字符串中的拼写错误：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>rebase<span class=\"w\"> </span>-i<span class=\"w\"> </span>HEAD~3\n<span class=\"c1\"># Choose edit, pick, pick for the commits</span>\n<span class=\"c1\"># Now you are able to rework the commit (use git add normally to add changes)</span>\n<span class=\"c1\"># When finished, commit work with &quot;--amend&quot; and continue</span>\ngit<span class=\"w\"> </span>commit<span class=\"w\"> </span>--amend\n<span class=\"c1\"># Reword the commit message if needed</span>\ngit<span class=\"w\"> </span>rebase<span class=\"w\"> </span>--continue\n<span class=\"c1\"># The second and third commits should be applied.</span>\n</code></pre></div>\n<p>如果你的主题分支已经在 GitHub 上发布，例如，如果你正在进行小的更改以考虑审查意见，你将需要强制推送这些更改：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>push<span class=\"w\"> </span>--force-with-lease<span class=\"w\"> </span>origin<span class=\"w\"> </span>ticket_xxxxx\n</code></pre></div>\n<p>请注意，这将重写 ticket_xxxxx 的历史 - 如果你在 GitHub 上操作之前和之后检查提交哈希值，你会注意到提交哈希值不再匹配。这是可以接受的，因为这个分支是一个主题分支，没有人应该以它为基础进行工作。</p>\n</section>\n<section id=\"after-upstream-has-changed\">\n<h3>在上游发生变化之后<a class=\"heading-anchor\" href=\"#after-upstream-has-changed\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>当上游（<code class=\"docutils literal notranslate\"><span class=\"pre\">django/django</span></code>）发生变化时，你应该重新基于你的工作。要做到这一点，使用以下命令：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>fetch<span class=\"w\"> </span>upstream\ngit<span class=\"w\"> </span>rebase<span class=\"w\"> </span>upstream/main\n</code></pre></div>\n<p>工作会自动使用你 fork 的分支进行重新基于，在示例中使用的是 <code class=\"docutils literal notranslate\"><span class=\"pre\">upstream/main</span></code>。</p>\n<p>rebase命令暂时删除所有本地提交，应用上游提交，然后在工作上再次应用本地提交。</p>\n<p>如果出现合并冲突，你需要解决它们，然后使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">rebase</span> <span class=\"pre\">--continue</span></code>。在任何时候，你都可以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">rebase</span> <span class=\"pre\">--abort</span></code> 返回到原始状态。</p>\n<p>请注意，您想在上游 <em>变基</em> ，而不是 <em>合并</em> 上游。</p>\n<p>这样做的原因是，通过重新定基，您的提交将始终在上游工作的*基础*上，而不是与上游所做的更改*混合在一起*。这样，您的分支将只包含与其主题相关的提交，这使得压缩更加容易。</p>\n</section>\n<section id=\"after-review\">\n<h3>审阅之后<a class=\"heading-anchor\" href=\"#after-review\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>在审核者未要求更改的情况下，将任何不重要的代码放入内核是很不正常的。 在这种情况下，通常最好将更改添加为对工作的一次增量提交。 这使审阅者可以轻松地检查您所做的更改。</p>\n<p>在这种情况下，按照审阅者要求进行更改。根据需要进行多次提交。在发布更改之前，重新基于你的工作。如果你添加了两个提交，你可以运行以下命令：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>rebase<span class=\"w\"> </span>-i<span class=\"w\"> </span>HEAD~2\n</code></pre></div>\n<p>将第二个提交合并到第一个提交中。编写一个类似以下的提交消息：</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>Made changes asked in review by &lt;reviewer&gt;.\n\n- Fixed whitespace errors in foobar.\n- Reworded the docstring of bar().\n</code></pre></div>\n<p>最后，将你的工作推送回你的 GitHub 存储库。由于在重新基于过程中没有触及公共提交，你应该不需要强制推送：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>push<span class=\"w\"> </span>origin<span class=\"w\"> </span>ticket_xxxxx\n</code></pre></div>\n<p>您的拉取请求现在也应该包含新的提交。</p>\n<p>请注意，合并者在提交代码时很可能会将审阅提交合并到之前的提交中。</p>\n</section>\n</section>\n<section id=\"working-on-a-patch\">\n<h2>工作在一个补丁上<a class=\"heading-anchor\" href=\"#working-on-a-patch\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>开发者可以通过审查补丁的方式之一来为 Django 做出贡献。这些补丁通常会作为 GitHub 上的拉取请求存在，可以轻松地集成到你的本地存储库中：</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>git<span class=\"w\"> </span>checkout<span class=\"w\"> </span>-b<span class=\"w\"> </span>pull_xxxxx<span class=\"w\"> </span>upstream/main\ncurl<span class=\"w\"> </span>-L<span class=\"w\"> </span>https://github.com/django/django/pull/xxxxx.patch<span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span>git<span class=\"w\"> </span>am\n</code></pre></div>\n<p>这将创建一个新的分支，然后将拉取请求中的更改应用到该分支上。在这一点上，你可以运行测试或进行其他必要的操作来调查补丁的质量。</p>\n<p>有关与拉取请求一起工作的更多详细信息，请参阅 <a class=\"reference internal\" href=\"/zh-hans/6.1/internals/contributing/committing-code/#handling-pull-requests\"><span class=\"std std-ref\">合并者指南</span></a>。</p>\n</section>\n<section id=\"summary\">\n<h2>概览<a class=\"heading-anchor\" href=\"#summary\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul class=\"simple\">\n<li><p>如果可以，请在GitHub上工作。</p></li>\n<li><p>通过链接到您的GitHub分支来宣布您在Trac工单上的工作。</p></li>\n<li><p>准备就绪后，请提出拉取请求。</p></li>\n<li><p>使您的拉取请求尽可能地好。</p></li>\n<li><p>在对您的工作进行修复时，请使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">rebase</span> <span class=\"pre\">-i</span></code> 压缩提交。</p></li>\n<li><p>当上游发生变化时，请执行 <code class=\"docutils literal notranslate\"><span class=\"pre\">git</span> <span class=\"pre\">fetch</span> <span class=\"pre\">upstream;</span> <span class=\"pre\">git</span> <span class=\"pre\">rebase</span></code>。</p></li>\n</ul>\n</section>","rootId":"working-with-git-and-github","toc":[{"title":"安装 Git","anchor":"installing-git","children":[]},{"title":"设置本地仓库","anchor":"setting-up-local-repository","children":[]},{"title":"在工单上工作","anchor":"working-on-a-ticket","children":[{"title":"发布工作成果","anchor":"publishing-work","children":[]},{"title":"Editing commit messages","anchor":"editing-commit-messages","children":[]},{"title":"分支变基","anchor":"rebasing-branches","children":[]},{"title":"在上游发生变化之后","anchor":"after-upstream-has-changed","children":[]},{"title":"审阅之后","anchor":"after-review","children":[]}]},{"title":"工作在一个补丁上","anchor":"working-on-a-patch","children":[]},{"title":"概览","anchor":"summary","children":[]}],"breadcrumbs":[{"docname":"internals/index","title":"Django内部","url":"/zh-hans/6.1/internals/"},{"docname":"internals/contributing/index","title":"为 Django 做贡献","url":"/zh-hans/6.1/internals/contributing/"},{"docname":"internals/contributing/writing-code/index","title":"贡献代码","url":"/zh-hans/6.1/internals/contributing/writing-code/"}],"prev":{"docname":"internals/contributing/writing-code/unit-tests","title":"单元测试集","url":"/zh-hans/6.1/internals/contributing/writing-code/unit-tests/"},"next":{"docname":"internals/contributing/writing-code/coding-style","title":"编码风格","url":"/zh-hans/6.1/internals/contributing/writing-code/coding-style/"},"formats":{"html":"/zh-hans/6.1/internals/contributing/writing-code/working-with-git/","markdown":"/zh-hans/6.1/internals/contributing/writing-code/working-with-git.md","json":"/zh-hans/6.1/internals/contributing/writing-code/working-with-git.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/internals/contributing/writing-code/working-with-git.txt","official":"https://docs.djangoproject.com/zh-hans/6.1/internals/contributing/writing-code/working-with-git/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}