<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>alchemmist — Open-Source</title><link>https://alchemmist.xyz/ru/tags/open-source/</link><description>Последние записи в блоге alchemmist</description><generator>Hugo 0.163.3</generator><language>ru</language><atom:link href="https://alchemmist.xyz/ru/tags/open-source/index.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Sat, 07 Feb 2026 21:25:00 +0300</lastBuildDate><item><title>Как внести свой вклад</title><link>https://alchemmist.xyz/ru/articles/how-we-contribute/</link><pubDate>Sat, 07 Feb 2026 21:25:00 +0300</pubDate><dc:creator>alchemmist</dc:creator><guid>https://alchemmist.xyz/ru/articles/how-we-contribute/</guid><description>Это краткое руководство для начинающих, о том, как работать с открытым исходным кодом в рамках практик GitHub flow. Все примеры будут с платформой GitHub, но можно использовать и другие хостинги репозиториев, которые предоставляют необходимый функционал для реализации GitHub flow. Здесь вы можете найти классический способ внести свой вклад почти в любой проект. А так же узнать несколько советов и хаков.
Итак, с чего же начинается любой вклад. В идеале, с проблемы. Проблемой можно называть что угодно, в том числе нехватка каких-то новых фич, отсутствие либо неполнота страниц документации по определённому вопросу, какой-то вопрос, либо же банальные баги, которые есть везде. Лично вы проблему ни с чем не спутаете, ведь она обязательно будет сопровождать зудящим чувством, что “что-то подбешивает.” Но будет ли это проблемой для других пользователей и разработчиков? Для того, чтобы это понять и синхронизировать ваше представление с представлениями команды, и существует issue.</description><content:encoded><![CDATA[<p>Это краткое руководство для начинающих, о том, как работать
с открытым исходным кодом в рамках практик GitHub flow. Все
примеры будут с платформой GitHub, но можно использовать и другие
хостинги репозиториев, которые предоставляют необходимый
функционал для реализации GitHub flow. Здесь вы можете найти
классический способ внести свой вклад почти в любой проект. А так
же узнать несколько советов и хаков.</p>
<p>Итак, с чего же начинается любой вклад. В идеале, с проблемы.
Проблемой можно называть что угодно, в том числе нехватка
каких-то новых фич, отсутствие либо неполнота страниц
документации по определённому вопросу, какой-то вопрос, либо же
банальные баги, которые есть везде. Лично вы проблему ни с чем не
спутаете, ведь она обязательно будет сопровождать зудящим
чувством, что &ldquo;что-то подбешивает.&rdquo; Но будет ли это проблемой для
других пользователей и разработчиков? Для того, чтобы это понять
и синхронизировать ваше представление с представлениями команды,
и существует issue.</p>





<blockquote class="markdown-alert markdown-alert--caution">
  <div class="markdown-alert__title">
    
      <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/></svg>
    

    
      CONTRIBUTION.md
    
  </div>

  <p>В каждом проекте есть свои собственные устоявшиеся правила
того, как нужно в них участвовать. Эти правило описываются либо
в <code>README.md</code> в отдельном параграфе &ldquo;Contribution&rdquo;, либо
в специальном файле <code>CONTRIBUTION.md</code>. Обязательно прочитайте
его в самом начале. Этот файл имеет первый приоритет. То есть
даже если вы понимаете, что какие-то практики отходят от той
правильной схемы, которую мы рассмотрим ниже, всё равно
следуйте им. Некоторые крупные проекты, такие как <code>Postgres</code>
или <code>linux-kernel</code> вообще до сих пор работает по mail-листам.
Следует уважать те традиции, которые сложились в репозитории,
даже если сейчас это выглядит как legacy.</p>
</blockquote>

<h2 id="1-issue">
  <a class="link" href="#1-issue">
    #
  </a>
  1. Issue
</h2>

<p>Issue представляет из себя тикет, который хранится в репозитории.
Создать его может любой человек, пришедший в репозиторий. Но
я рекомендую вам, перед тем как бросаться описывать, вашу
проблему, сделать несколько попыток по поиску подобных issue,
чтобы не нагружать лишней работой мейнтейнеров репозитория.
Давайте посмотрим как это можно сделать:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh issue list --search <span class="s2">&#34;app crashed&#34;</span>
</span></span></code></pre></div><blockquote class="markdown-blockquote">
  <p>Этот и все дальнейшие примеры будут с использованием
официальной утилиты <code>gh</code>. Она позволяет из консоли выполнять
все базовые операции с GitHub. Рекомендую использовать её для
простых операций, для ускорения работы.</p>

</blockquote>
<p>Параметр <code>search</code> позволяет задавать прям в себе добавлять
различные фильтры поиска. Давайте попробуем их добавить:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh issue list --search <span class="s2">&#34;app crashed is:open label:bug created:&gt;2024-01-01&#34;</span>
</span></span></code></pre></div><p>Вполне возможно, особенно в крупных проектах, что это позволит
вам выйти на уже заведённый тикет по вашей проблеме и даже найти
в нём решение или ответ. Если же нет, то не стесняйтесь
открывать новый issue. Наилучшим образом его структурировать
поможет схема:</p>
<pre class="mermaid">
  graph LR
    A[Excepted] ---&gt; B(&#34;Action (run/click/etc)&#34;)
    B ---&gt; C[Got]
</pre>

<p>В крупных проектах существуют issue templates, которые помогут
вам оформить issue в соответствии с теми стандартными, которые
приняты в этом проекте. Создать issue можно командой:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh issue create
</span></span></code></pre></div><p>Так же отличной практикой является предоставление docker образа,
в котором настроено все окружение, и проблема гарантированно
воспроизводима. Либо хотя бы предоставить лог. Профессиональным
подходом так же будет локализация проблемы, настолько насколько
это возможно. Например, вы получили ошибку в таком файле:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">fruits</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">logistic</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="n">fruits</span><span class="o">.</span><span class="n">Apple</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">basket</span> <span class="o">=</span> <span class="n">fruits</span><span class="o">.</span><span class="n">MakeBasket</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">basket</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">logistic</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">basket</span><span class="p">)</span>
</span></span></code></pre></div><p>Конечно, можно было бы так в issue и написать. Но еще лучше будет
самостоятельно поэкспериментировать с этим кодом и понять, что
именно не так. Например проверить удалось ли добавить яблоко
в корзину:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">basket</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">basket</span><span class="o">.</span><span class="n">content</span><span class="p">())</span>
</span></span></code></pre></div><p>Возможно проблема в том, что мы пытаемся отправить пустую
корзину, что будет означать баг в методе <code>put</code>. Либо же все-таки
проблема в методе <code>send</code>. Таким образом, мы срезаем лишнее,
оставляя в сообщении issue суть проблемы.</p>
<p>Помните, о том, что даже факт заведения успешного issue,
например, предложения ценной фичи или обнаружение реального бага
или уязвимости — это уже вклад в проект, и это уже успех.
А неуспехом будет создание дублирующего issue или перегрузка
мейнтейнеров лишним контекстом.</p>

<h2 id="2-fork">
  <a class="link" href="#2-fork">
    #
  </a>
  2. Fork
</h2>

<p>Когда вы поняли какую проблемы вы решаете и убедились, что это
реально проблема, можно переходить к её решению. Для этого стоит
для начала сделать fork репозитория. Это будет, как ценным
подспорьем для вас если вы, например, будете тестировать CI или
просто сильно опережать оригинальный репозиторий, так и позволит
отправлять pull request-ы, ведь вы, скорее всего, не имеете прав
для внесения изменений в оригинальный репозиторий:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh repo fork &lt;OWNER&gt;/&lt;REPO&gt;
</span></span></code></pre></div><p>Клонировав fork локально вносите изменения в отдельной ветке,
которую будет удобнее назвать номером issue, который вы пытаетесь
закрыть. Почему? Потому что в коротком лаконичном названии ветки
<strong>далеко</strong> не всегда удастся выразить суть проблемы, на которую,
возможно, ушло несколько месяцев обсуждения в тиките. Поэтому
гораздо удобнее просто на него сослаться, через номер issue:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">git switch -c <span class="m">42</span>
</span></span></code></pre></div><p>В GitHub flow мы не создаем сложную структуру из веток, где
у каждой есть свое значение. Вместо этого у нас есть master-ветка
в которую попадают только прошедшие все проверки изменения.
А попадают они туда из множества, так называемых feature-веток,
которые мы предлагаем тут привязывать к конкретным issue. А раз
в какое-то время мы на master ветке выпускаем релиз. В итоге
получается вполне лакончиная структура:</p>
<pre class="mermaid">
  %%{init: {
  &#34;gitGraph&#34;: {
    &#34;tagLabelColor&#34;: &#34;#ffffff&#34;,
    &#34;tagLabelBackground&#34;: &#34;#d73a49&#34;
  }
}}%%
gitGraph
    commit
    commit
    branch &#34;42&#34;
    checkout &#34;42&#34;
    commit
    commit
    checkout main
    merge &#34;42&#34;
    commit tag: &#34;🚩 v1.1.23&#34;

    branch &#34;44&#34;
    checkout &#34;44&#34;
    commit
    commit
    commit
    checkout main
    merge &#34;44&#34;
    commit tag: &#34;🚩 v1.2.0&#34;
</pre>

<p>Так же не забывайте синхронизировать ваш <code>fork</code>, чтобы не
потерять связь с оригинальным проектом:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh repo sync &lt;your-username&gt;/&lt;fork-repo&gt; --branch main
</span></span></code></pre></div>
<h2 id="3-pull-request">
  <a class="link" href="#3-pull-request">
    #
  </a>
  3. Pull request
</h2>

<p>Когда изменения внесены и закоммичены, то можно отправлять pull
request. Удобнее всего просто остаться на вашей ветке и выполнить
команду ниже. <code>gh</code> сам сформирует подходящий pull request:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh pr create
</span></span></code></pre></div><p>После создания PR могут автоматически запуститься проверки, если
в репозитории настроен CI. И это отлично. Потому что проверки
упрощают и ускоряют процесс ревью. Вы сразу можете увидеть, что
в вашем коде например не проходят проверки стилей, или, что вы не
написали тесты на свой код и из-за этого упал code coverage. Не
игнорируйте это, а делайте новой коммиты в той же ветки и после
пуша они автоматически добавятся в PR и проверки будут
перезапущены. Мейнтейнер репозитория даже не начнет ревью вашего
PR, пока все проверки в нем не станут зелёными. Проверить статус
pull request-а вы можете командой:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">gh pr status
</span></span></code></pre></div><p>Так же старайтесь сделать аккуратную историю коммитов в pull
request-е, чтобы упросить процесс review. В этом вам помогут
<a href="https://www.geeksforgeeks.org/git/git-squash/">squash</a> коммиты.</p>
<p>Когда вы прорвались через все авто-проверки, не стесняйтесь
обращаться к архитектору репозитория и просить его ревью. Он либо
сам сделает ревью вашего PR, либо делегирует это кому-то из
команды. На GitHub это делается просто через тег: <code>@username</code>.
Часто уведомления о том, что пришёл новый pull request могут быть
отключены, и тем более архитектор не узнает, когда вы внесете все
правки, чтобы пройти CI. Поэтому скромность здесь может привести
к тому, что ваш pull request просто никто не увидит. Тоже,
кстати, касается и issue.</p>
<p>Если вы понимаете, что ваш pull request полностью закрывает тот
issue, который вы решали, то в сообщениях PR можно указать <code>Close \#49</code>, тогда issue будет автоматически закрыт после слияния pull
request-а.</p>

<h2 id="4-merge">
  <a class="link" href="#4-merge">
    #
  </a>
  4. Merge
</h2>

<p>Итак, когда вы прошли все авто-проверки и ручное ревью, то ваш
код попадет в master-ветку репозитория и вы можете считать себя
полноправным контрибьютором в этот проект. Так держать!</p>
<p>Обратите так же внимание на интересную практику, которая, на мой
взгляд, очень профессиональна. Представим что вы обнаружили
и доложили о каком-то баге в issue. Это уже вклад в репозиторий.
Дальше предлагается создать pull request, в котором вы пишете
тест, который воспроизводит этот баг. Тест конечно-же будет
падать. Но вы присылать pull request, внося тем самым этот тест
в состоянии disabled в кодовую базу. Так же можно оставить <code>TODO</code>
метку. И это станет еще большим вкладом в репозиторий, поскольку
вы добавили содержательный тест, а этом всегда очень полезно.
И наконец вторым pull request-ом вы уже присылаете изменения,
которые чинят код так, чтобы он проходил этот тест. И вновь
увеличиваете ваш вклад. Таким образом вы оставили после себя
массу артефактов в репозитории: issue, усиленная система тестов,
и исправленный баг. Это будет отличным примером реализации TDD
(Test Driven Development) подхода.</p>
<br>
<hr>
<br>
<p>Таким образом мы с вами прошли полный цикл от проблемы до вклада
в master-ветку:</p>
<pre class="mermaid">
  flowchart LR
    BUG[&#34;Find a bug / Need feature&#34;] --&gt; ISSUE[&#34;Create Issue&#34;]
    ISSUE --&gt; DISCUSS[&#34;Discussion / Planning&#34;]
    DISCUSS --&gt; PR[&#34;Open Pull Request&#34;]
    PR --&gt; CI[&#34;PR Checks with CI&#34;]
    CI --&gt; REVIEW[&#34;Reviewer Reviews PR&#34;]
    REVIEW --&gt; MERGE[&#34;Merge PR into main&#34;]
    MERGE --&gt; BUG
</pre>

<p>Вы можете проверить свои силы уже сейчас, найдя подходящий issue
с помощью этих прекрасных сервисов:</p>
<ul>
<li><a href="https://goodfirstissue.dev/">Good First Issue</a> — Issue,
которые отлично подходят для новичков.</li>
<li><a href="https://github.com/MunGell/awesome-for-beginners">Awesome for
Beginners</a>
— Подборка проектов для начинающих.</li>
<li><a href="https://up-for-grabs.net/#/">Up For Grabs</a> — Открытые для
решения задачи по разным технологиям.</li>
<li><a href="https://github.com/firstcontributions/first-contributions">First
Contributions</a>
— Репозиторий с манулом с списком открытых проектов.</li>
<li><a href="https://www.firsttimersonly.com/">First Timers Only</a> — Больше
подобных ресурсов.</li>
</ul>
<p>Не забывайте, что вы и сами можете регистрировать свои проекты на
этих ресурсах, чтобы привлекать к себе новых разработчиков!</p>





<blockquote class="markdown-alert markdown-alert--note">
  <div class="markdown-alert__title">
    
      <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"/></svg>
    

    
      GitHub CLI
    
  </div>

  <p>Если вас заинтересовала продуктивная работа с GitHub из консоли
с помощью утилиты <code>gh</code>, обратите внимание на её
<a href="https://cli.github.com/manual/">документацию</a>. А так же на то,
что <code>gh</code> поддерживает расширения, ознакомиться с которыми вы
можете с помощью команды <code>gh ext browse</code> или написать своё!</p>
</blockquote>
<p>Так же можно почитать по теме:</p>
<ul>
<li><a href="https://opensource.guide/how-to-contribute/">Official GitHub
guideline</a></li>
<li><a href="https://navendu.me/posts/pull-requests-like-a-pro/">Pull Requests like a Pro, Navendu
Pottekkat</a></li>
<li><a href="https://dev.to/helloquash/10-common-mistakes-to-avoid-when-contributing-to-open-source-projects-1mna">10 Common Mistakes to Avoid When Contributing to Open Source
Projects</a></li>
<li><a href="https://github-help-wanted.com/open-source/beginners-guide/">Open Source for
Beginners</a></li>
</ul>
]]></content:encoded><category>open-source</category><category>eosp</category></item></channel></rss>