<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Practice on DevOps Way - Практические гайды</title>
    <link>https://devopsway.ru/tags/practice/</link>
    <description>Recent content in Practice on DevOps Way - Практические гайды</description>
    <image>
      <title>DevOps Way - Практические гайды</title>
      <url>https://devopsway.ru/images/devopsway-og.png</url>
      <link>https://devopsway.ru/images/devopsway-og.png</link>
    </image>
    <generator>Hugo -- 0.160.1</generator>
    <language>ru</language>
    <lastBuildDate>Thu, 16 Apr 2026 13:12:41 -0400</lastBuildDate>
    <atom:link href="https://devopsway.ru/tags/practice/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Git Mastery Challenge: сломанный репозиторий для практики</title>
      <link>https://devopsway.ru/posts/git-master-final-challenge/</link>
      <pubDate>Thu, 16 Apr 2026 12:00:00 +0300</pubDate>
      <guid>https://devopsway.ru/posts/git-master-final-challenge/</guid>
      <description>Сломанный enterprise-репозиторий с 10 проблемами: грязная история, merge-конфликты, утечки секретов, раздутые бинарники, потеря контекста. Практика после 9 уроков серии Git Mastery.</description>
      <content:encoded><![CDATA[<h2 id="зачем">Зачем</h2>
<p>9 уроков серии дают навыки по одному за раз в стерильных sandbox-репозиториях. В реальности проблемы наваливаются слоями: мусорная история <strong>и</strong> утекший секрет <strong>и</strong> merge-конфликт <strong>и</strong> два worktree в разных состояниях — всё одновременно.</p>
<p>Challenge — один заранее сломанный репозиторий с 10 такими проблемами. Вы проходите его руками и проверяете прогресс автоматическим скриптом.</p>
<hr>
<h2 id="что-внутри">Что внутри</h2>
<p>Репозиторий собирается скриптом <code>setup-challenge.sh</code> из чистого состояния и содержит:</p>
<ol>
<li><strong>Грязная история коммитов</strong> — сообщения <code>fix</code>, <code>oops</code>, <code>update stuff</code> (урок 1)</li>
<li><strong>Потерянный коммит в reflog</strong> — кто-то сделал <code>reset --hard</code>, в рабочем дереве его нет (урок 2)</li>
<li><strong>Merge-конфликт в одном файле от трёх веток</strong> (уроки 3, 4)</li>
<li><strong>Активная ребейс-цепочка, прерванная на конфликте</strong> — нужно продолжить или отменить (урок 4)</li>
<li><strong>API-ключ и приватный RSA в истории</strong> — нужно вычистить и подстраховаться хуком (урок 5)</li>
<li><strong>Серия из пяти WIP-коммитов перед merge</strong> — нужен rebase -i squash (урок 4)</li>
<li><strong>Регрессия в 20 коммитах</strong> — ищется bisect&rsquo;ом за 5 шагов (урок 6)</li>
<li><strong>Коммит из чужой ветки нужен в вашей</strong> — cherry-pick с конфликтом + rerere запомнит решение (урок 7)</li>
<li><strong>Параллельная задача без потери WIP</strong> — решается worktree (урок 8)</li>
<li><strong>Старый хлам в <code>.git/worktrees/</code></strong> — осиротевшие записи, нужен <code>worktree prune</code> (урок 8)</li>
</ol>
<p>Задачи 7, 8, 9 — бонус: там есть submodules, огромные бинарные файлы и устаревший Git Flow. Эти темы не в наших 9 уроках, но решаются накопленным инструментарием (фильтрация истории, переход на package manager, распутывание веток).</p>
<hr>
<h2 id="как-начать">Как начать</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. Клон репозитория челленджа</span>
</span></span><span class="line"><span class="cl">git clone https://github.com/devitway/git-master-challenge.git
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> git-master-challenge
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. Скрипты исполняемыми</span>
</span></span><span class="line"><span class="cl">chmod +x *.sh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. Создать сломанный репо</span>
</span></span><span class="line"><span class="cl">./setup-challenge.sh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. Войти в него</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> broken-enterprise-repo
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. Оценить текущее состояние</span>
</span></span><span class="line"><span class="cl">git status
</span></span><span class="line"><span class="cl">git log --oneline -10
</span></span><span class="line"><span class="cl">git branch -a
</span></span></code></pre></div><p>Каждый раз, когда думаете, что одну проблему починили — из корня <code>git-master-challenge/</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./check-fixes.sh
</span></span></code></pre></div><p>Скрипт пробегает все 10 проверок и печатает, что зачтено, а что нет.</p>
<hr>
<h2 id="требования-к-окружению">Требования к окружению</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git --version          <span class="c1"># 2.25+</span>
</span></span><span class="line"><span class="cl">bash --version         <span class="c1"># 4.0+</span>
</span></span><span class="line"><span class="cl">node --version         <span class="c1"># нужен для теста bisect (P7)</span>
</span></span></code></pre></div><p>Git LFS и GitHub CLI — <strong>не нужны</strong>. Всё решается стандартным git + bash + node.</p>
<hr>
<h2 id="на-что-смотреть-по-ходу">На что смотреть по ходу</h2>
<ul>
<li><strong>Один коммит — одна проблема.</strong> Не чините пятью сразу — потом не восстановите цепочку мысли, и код-ревью превратится в ад.</li>
<li><strong><code>git status</code> после каждой операции.</strong> Особенно в середине rebase или bisect: легко забыть, где вы, и сделать <code>commit</code>, когда нужно <code>rebase --continue</code>.</li>
<li><strong>Reflog — ваша страховка.</strong> Если что-то пошло не так, <code>git reflog</code> покажет все HEAD-позиции за последние 90 дней. Восстановить почти всегда можно (урок 2).</li>
<li><strong>Не используйте <code>--force</code> по умолчанию.</strong> Если алгоритм требует force — в 90% случаев вы не дописали операцию: либо не сделали <code>--continue</code>, либо не <code>add</code>&lsquo;нули разрешённые конфликты. Притормозите.</li>
</ul>
<hr>
<h2 id="что-это-даёт">Что это даёт</h2>
<p>Не баллы, не «сертификат Git Master». Вы увидите, <strong>как накапливается git-долг в реальной команде</strong>, и выработаете рефлексы: какой инструмент применить в какой ситуации, где остановиться и не усугубить, где безопасно отступить через <code>reset --hard ORIG_HEAD</code>.</p>
<p>После Challenge 10-секундные git-ситуации перестают быть 10-секундными:</p>
<ul>
<li>«нужно перенести один коммит» — рука сама тянется к <code>cherry-pick</code>, не к «перепишу заново»</li>
<li>«надо параллельно фичу и хотфикс» — рука к <code>worktree add</code>, не к <code>stash</code> с риском потерять его среди 20 других</li>
<li>«регрессия появилась за последние две недели» — <code>git bi HEAD~100 ./test.sh</code> против «давайте перебирать руками»</li>
</ul>
<hr>
<h2 id="что-дальше">Что дальше</h2>
<ul>
<li><strong>Ваши заметки по решениям</strong> — файл <code>SOLUTIONS.md</code> в своём форке репозитория. Через полгода вы вернётесь и обнаружите, что <strong>те же</strong> проблемы всплывают в других проектах. Личный справочник обгоняет любой общий курс.</li>
<li><strong>Системно с нуля</strong> → <strong><a href="https://devitway.ru">«Курс молодого бойца» DevIT Academy</a></strong> — git в контексте Linux, Docker, Kubernetes и CI/CD, как рабочий поток, а не набор команд.</li>
<li><strong>Обратная связь</strong> — если нашли косяки в условии или <code>check-fixes.sh</code> даёт ложный позитив, issue на <a href="https://github.com/devitway/git-master-challenge/issues">GitHub</a> или письмо в <a href="https://t.me/DevITWay">@DevITWay</a>.</li>
</ul>
<hr>
<h2 id="серия-целиком">Серия целиком</h2>
<ul>
<li><a href="/posts/day-00-ssh/">День 0: SSH</a> — ключи, агент, config</li>
<li><a href="/posts/day-01-three-states/">День 1: три состояния + чистые коммиты</a></li>
<li><a href="/posts/day-02-reset-recovery/">День 2: reset, reflog, восстановление</a></li>
<li><a href="/posts/day-03-branches-merge/">День 3: ветки и merge</a> — ff vs &ndash;no-ff</li>
<li><a href="/posts/day-04-rebase/">День 4: rebase vs merge</a> — когда переписывать</li>
<li><a href="/posts/day-05-hooks/">День 5: hooks</a> — pre-commit, commit-msg, core.hooksPath</li>
<li><a href="/posts/git-bisect/">День 6: bisect</a> — бинарный поиск регрессии</li>
<li><a href="/posts/git-cherrypick-rerere/">День 7: cherry-pick + rerere</a> — точечный перенос и память о конфликтах</li>
<li><a href="/posts/day-08-worktree/">День 8: worktree</a> — параллельная работа</li>
<li><strong>Challenge</strong> — вы здесь.</li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
