<?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>Status on DevOps Way - Практические гайды</title>
    <link>https://devopsway.ru/tags/status/</link>
    <description>Recent content in Status 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 14:57:46 +0000</lastBuildDate>
    <atom:link href="https://devopsway.ru/tags/status/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>День 1: три состояния Git — где сейчас живёт ваш файл</title>
      <link>https://devopsway.ru/posts/day-01-three-states/</link>
      <pubDate>Thu, 16 Apr 2026 14:00:00 +0300</pubDate>
      <guid>https://devopsway.ru/posts/day-01-three-states/</guid>
      <description>Три состояния файла в Git — working / staging / committed. Как читать git status, зачем git add -p, и почему git add . убивает историю. Sandbox-проверено.</description>
      <content:encoded><![CDATA[<h2 id="цель-урока">Цель урока</h2>
<p>После урока вы <strong>понимаете</strong>, в каком из трёх состояний живёт каждый ваш файл (working / staging / committed), читаете <code>git status</code> как карту и используете <code>git add -p</code> для осознанных коммитов вместо <code>git add .</code>. Знаете, какой командой вернуть файл из каждого состояния.</p>
<table>
  <thead>
      <tr>
          <th>Параметр</th>
          <th>Значение</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Bloom</td>
          <td>Понимание, Применение</td>
      </tr>
      <tr>
          <td>SFIA</td>
          <td>Уровень 2</td>
      </tr>
      <tr>
          <td>Время</td>
          <td>30–40 минут</td>
      </tr>
      <tr>
          <td>Артефакт</td>
          <td><code>~/.gitconfig</code> с алиасами <code>s</code>, <code>d</code>, <code>dc</code> + история из 5 осознанных коммитов</td>
      </tr>
      <tr>
          <td>Проверка</td>
          <td><code>git status</code> → <code>nothing to commit, working tree clean</code>; <code>git log --oneline</code> показывает коммиты в формате <code>type(scope): message</code></td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="теория-за-3-минуты">Теория за 3 минуты</h2>
<p>У файла в Git три состояния, и каждая команда — это переход между ними.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">┌──────────────┐  git add     ┌─────────────┐  git commit   ┌──────────────┐
</span></span><span class="line"><span class="cl">│  working     │ ───────────▶ │   staging   │ ────────────▶ │  committed   │
</span></span><span class="line"><span class="cl">│  (изменён    │              │ (подготовлен│               │  (в истории) │
</span></span><span class="line"><span class="cl">│   на диске)  │              │  к коммиту) │               │              │
</span></span><span class="line"><span class="cl">└──────────────┘              └─────────────┘               └──────────────┘
</span></span><span class="line"><span class="cl">       ▲                            │                               │
</span></span><span class="line"><span class="cl">       │    git restore --staged    │                               │
</span></span><span class="line"><span class="cl">       │ ◀──────────────────────────┘                               │
</span></span><span class="line"><span class="cl">       │                                                            │
</span></span><span class="line"><span class="cl">       │                git restore / git checkout --               │
</span></span><span class="line"><span class="cl">       │ ◀──────────────────────────────────────────────────────────┘
</span></span></code></pre></div><p><strong>Почему три, а не два.</strong> Два было бы: «на диске → в истории». Третье — staging — даёт вам возможность <strong>выбрать</strong>, что именно пойдёт в коммит, даже если в working-дереве пять изменений. Коммит отвечает на один вопрос, а не на пять.</p>
<p><strong><code>git status</code> — это компас.</strong> Он показывает одновременно, что в staging (пойдёт в коммит), что в working (не пойдёт, пока не добавите), и что untracked (Git про файл вообще не знает).</p>
<p><strong>«Щёлкнуло» дня:</strong> <code>git add .</code> — это как «ctrl+A, delete» в чужом документе. Вы не контролируете, что ушло в коммит. <code>git add -p</code> и <code>git add &lt;файл&gt;</code> — контролируете.</p>
<hr>
<h2 id="практика-1-три-состояния-своими-глазами">Практика 1: три состояния своими глазами</h2>
<h3 id="шаг-1-создаём-репозиторий">Шаг 1. Создаём репозиторий</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p /tmp/states-demo <span class="o">&amp;&amp;</span> <span class="nb">cd</span> /tmp/states-demo
</span></span><span class="line"><span class="cl">git init -q
</span></span><span class="line"><span class="cl">git config user.name <span class="s2">&#34;Student&#34;</span>
</span></span><span class="line"><span class="cl">git config user.email <span class="s2">&#34;student@example.com&#34;</span>
</span></span></code></pre></div><h3 id="шаг-2-untracked--git-про-файл-ничего-не-знает">Шаг 2. Untracked — Git про файл ничего не знает</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;hello&#34;</span> &gt; a.txt
</span></span><span class="line"><span class="cl">git status -sb
</span></span></code></pre></div><p>Вывод:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">## No commits yet
</span></span><span class="line"><span class="cl">?? a.txt
</span></span></code></pre></div><p><code>??</code> — это untracked. Файл лежит на диске, Git его видит, но не отслеживает.</p>
<h3 id="шаг-3-working--staging-через-git-add">Шаг 3. Working → staging через <code>git add</code></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git add a.txt
</span></span><span class="line"><span class="cl">git status -sb
</span></span></code></pre></div><p>Вывод:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">## No commits yet
</span></span><span class="line"><span class="cl">A  a.txt
</span></span></code></pre></div><p><code>A</code> (зелёная в терминале) — файл в staging, готов к коммиту.</p>
<h3 id="шаг-4-staging--committed-через-git-commit">Шаг 4. Staging → committed через <code>git commit</code></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git commit -q -m <span class="s2">&#34;feat: add a.txt&#34;</span>
</span></span><span class="line"><span class="cl">git status -sb
</span></span></code></pre></div><p>Вывод:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">## main
</span></span></code></pre></div><p>Чистое дерево — всё в истории.</p>
<h3 id="шаг-5-изменяем--и-видим-два-столбца">Шаг 5. Изменяем → и видим два столбца</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;world&#34;</span> &gt;&gt; a.txt
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;new&#34;</span> &gt; b.txt
</span></span><span class="line"><span class="cl">git add b.txt
</span></span><span class="line"><span class="cl">git status -sb
</span></span></code></pre></div><p>Вывод:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">## main
</span></span><span class="line"><span class="cl"> M a.txt
</span></span><span class="line"><span class="cl">A  b.txt
</span></span></code></pre></div><p>Две колонки: <strong>первая — staging</strong>, <strong>вторая — working</strong>. У <code>a.txt</code> изменения только в working (<code> M</code>), у <code>b.txt</code> — в staging (<code>A</code> ).</p>
<p>Это и есть ответ на вопрос «что попадёт в следующий коммит»: только первая колонка.</p>
<hr>
<h2 id="практика-2-git-add--p--осознанный-коммит">Практика 2: <code>git add -p</code> — осознанный коммит</h2>
<h3 id="шаг-0-зачем-это-вообще-нужно">Шаг 0. Зачем это вообще нужно</h3>
<p>Классический сценарий: вы правили аутентификацию, заодно поправили опечатку в README, и обновили package.json. Это три разных коммита: <code>fix(auth)</code>, <code>docs(readme)</code>, <code>chore(deps)</code>. <code>git add .</code> слепит их в один — история теряет смысл, <code>git bisect</code> и cherry-pick потом не работают.</p>
<p><code>git add -p</code> даёт добавить в staging <strong>кусок файла</strong>, не весь файл.</p>
<h3 id="шаг-1-готовим-три-разных-изменения-в-одной-сессии">Шаг 1. Готовим «три разных изменения в одной сессии»</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /tmp/states-demo
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">cat &gt; auth.js <span class="s">&lt;&lt; &#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">function login(user) {
</span></span></span><span class="line"><span class="cl"><span class="s">  return user.password === &#34;1234&#34;;
</span></span></span><span class="line"><span class="cl"><span class="s">}
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">cat &gt; README.md <span class="s">&lt;&lt; &#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s"># My Project
</span></span></span><span class="line"><span class="cl"><span class="s">Содержит систему логина.
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">cat &gt; package.json <span class="s">&lt;&lt; &#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">{ &#34;name&#34;: &#34;demo&#34;, &#34;version&#34;: &#34;0.1.0&#34; }
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">git add . <span class="o">&amp;&amp;</span> git commit -q -m <span class="s2">&#34;feat: initial scaffold&#34;</span>
</span></span></code></pre></div><h3 id="шаг-2-делаем-три-разных-правки-в-одной-сессии">Шаг 2. Делаем три разных правки в одной сессии</h3>
<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) фикс бага в auth.js (серьёзная правка)</span>
</span></span><span class="line"><span class="cl">cat &gt; auth.js <span class="s">&lt;&lt; &#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">const bcrypt = require(&#39;bcrypt&#39;);
</span></span></span><span class="line"><span class="cl"><span class="s">function login(user, password) {
</span></span></span><span class="line"><span class="cl"><span class="s">  return bcrypt.compareSync(password, user.passwordHash);
</span></span></span><span class="line"><span class="cl"><span class="s">}
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2) опечатка в README.md</span>
</span></span><span class="line"><span class="cl">sed -i <span class="s1">&#39;s/Содержит систему/Содержит безопасную систему/&#39;</span> README.md
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3) апдейт version в package.json</span>
</span></span><span class="line"><span class="cl">sed -i <span class="s1">&#39;s/&#34;0.1.0&#34;/&#34;0.2.0&#34;/&#39;</span> package.json
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">git status -sb
</span></span></code></pre></div><p>Вывод:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">## main
</span></span><span class="line"><span class="cl"> M README.md
</span></span><span class="line"><span class="cl"> M auth.js
</span></span><span class="line"><span class="cl"> M package.json
</span></span></code></pre></div><p>Три файла с правками в working. Если сейчас <code>git add .</code> — один коммит на три несвязанные вещи.</p>
<h3 id="шаг-3-коммитим-по-одной-правке">Шаг 3. Коммитим по одной правке</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git add auth.js
</span></span><span class="line"><span class="cl">git commit -q -m <span class="s2">&#34;fix(auth): replace plain-text compare with bcrypt&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">git add README.md
</span></span><span class="line"><span class="cl">git commit -q -m <span class="s2">&#34;docs(readme): clarify auth is secure&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">git add package.json
</span></span><span class="line"><span class="cl">git commit -q -m <span class="s2">&#34;chore: bump version to 0.2.0&#34;</span>
</span></span></code></pre></div><p>Проверяем:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git log --oneline
</span></span></code></pre></div><p>Вывод:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">abc1234 chore: bump version to 0.2.0
</span></span><span class="line"><span class="cl">def5678 docs(readme): clarify auth is secure
</span></span><span class="line"><span class="cl">9abcdef fix(auth): replace plain-text compare with bcrypt
</span></span><span class="line"><span class="cl">0123456 feat: initial scaffold
</span></span></code></pre></div><p>Четыре коммита, каждый отвечает на один вопрос. Через месяц вы вернётесь и поймёте, <strong>зачем</strong> было изменение — или откатите ровно одно из трёх.</p>
<h3 id="шаг-4-git-add--p--когда-две-правки-в-одном-файле">Шаг 4. <code>git add -p</code> — когда две правки в одном файле</h3>
<p>Сценарий: в <code>auth.js</code> вы и fix сделали, и опечатку в комментарии поправили. Два коммита из одного файла:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat &gt; auth.js <span class="s">&lt;&lt; &#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">// Simple authentication module
</span></span></span><span class="line"><span class="cl"><span class="s">const bcrypt = require(&#39;bcrypt&#39;);
</span></span></span><span class="line"><span class="cl"><span class="s">function login(user, password) {
</span></span></span><span class="line"><span class="cl"><span class="s">  return bcrypt.compareSync(password, user.passwordHash);
</span></span></span><span class="line"><span class="cl"><span class="s">}
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">// TODO: rate limiting
</span></span></span><span class="line"><span class="cl"><span class="s">function logout(session) {
</span></span></span><span class="line"><span class="cl"><span class="s">  // убераем сессию (опечатка: &#34;убираем&#34;)
</span></span></span><span class="line"><span class="cl"><span class="s">  session.destroy();
</span></span></span><span class="line"><span class="cl"><span class="s">}
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">git add auth.js <span class="o">&amp;&amp;</span> git commit -q -m <span class="s2">&#34;feat(auth): add logout&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># делаем два изменения в одном файле</span>
</span></span><span class="line"><span class="cl">sed -i <span class="s1">&#39;s/Simple authentication module/Secure authentication module/&#39;</span> auth.js
</span></span><span class="line"><span class="cl">sed -i <span class="s1">&#39;s/убераем/убираем/&#39;</span> auth.js
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">git diff
</span></span></code></pre></div><p>В выводе два разных hunk&rsquo;а. Теперь добавляем их в staging по отдельности:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git add -p auth.js
</span></span></code></pre></div><p>Git спрашивает по каждому hunk&rsquo;у:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Stage this hunk [y,n,q,a,d,e,?]?
</span></span></code></pre></div><p>Нажимаете <code>y</code> на первый (заголовок), <code>n</code> на второй (опечатка). Коммитим:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git commit -q -m <span class="s2">&#34;docs(auth): clarify module purpose&#34;</span>
</span></span></code></pre></div><p>Теперь оставшееся:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git add auth.js
</span></span><span class="line"><span class="cl">git commit -q -m <span class="s2">&#34;fix(auth): typo in logout comment&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">git log --oneline <span class="p">|</span> head -3
</span></span></code></pre></div><p>Два осмысленных коммита из одного файла.</p>
<hr>
<h2 id="практика-3-возврат-из-каждого-состояния">Практика 3: возврат из каждого состояния</h2>
<p>Три состояния — три способа откатить.</p>
<h3 id="31-из-staging-обратно-в-working">3.1. Из staging обратно в working</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /tmp/states-demo
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;noise&#34;</span> &gt;&gt; auth.js
</span></span><span class="line"><span class="cl">git add auth.js
</span></span><span class="line"><span class="cl">git status -sb
</span></span><span class="line"><span class="cl"><span class="c1"># M  auth.js  — в staging</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">git restore --staged auth.js
</span></span><span class="line"><span class="cl">git status -sb
</span></span><span class="line"><span class="cl"><span class="c1">#  M auth.js  — в working, без staging</span>
</span></span></code></pre></div><h3 id="32-из-working-обратно-к-последнему-коммиту-теряем-правку">3.2. Из working обратно к последнему коммиту (теряем правку)</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git restore auth.js
</span></span><span class="line"><span class="cl">git status -sb
</span></span><span class="line"><span class="cl"><span class="c1"># ## main   — чисто</span>
</span></span></code></pre></div><p>⚠️ <code>git restore</code> без <code>--staged</code> <strong>удаляет</strong> правки из working-дерева. Перед этой командой убедитесь, что правки вам не нужны.</p>
<h3 id="33-уже-закоммиченное--нужен-git-reset-или-git-revert">3.3. Уже закоммиченное — нужен <code>git reset</code> или <code>git revert</code></h3>
<p>Про это — День 3 (reflog + reset). Сейчас важно: <strong>committed</strong> — это точка «назад без потерь только через reflog».</p>
<hr>
<h2 id="артефакт-алиасы-для-быстрого-git-status">Артефакт: алиасы для быстрого <code>git status</code></h2>
<p>Добавьте в <code>~/.gitconfig</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git config --global alias.s <span class="s2">&#34;status -sb&#34;</span>
</span></span><span class="line"><span class="cl">git config --global alias.d <span class="s2">&#34;diff&#34;</span>
</span></span><span class="line"><span class="cl">git config --global alias.dc <span class="s2">&#34;diff --cached&#34;</span>
</span></span><span class="line"><span class="cl">git config --global alias.l <span class="s2">&#34;log --oneline -10&#34;</span>
</span></span></code></pre></div><p>Использование:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git s        <span class="c1"># короткий статус</span>
</span></span><span class="line"><span class="cl">git d        <span class="c1"># что в working (не в staging)</span>
</span></span><span class="line"><span class="cl">git dc       <span class="c1"># что в staging (пойдёт в коммит)</span>
</span></span><span class="line"><span class="cl">git l        <span class="c1"># последние 10 коммитов</span>
</span></span></code></pre></div><p><code>git d</code> и <code>git dc</code> — это <strong>два разных взгляда на две разные очереди</strong>. Первая команда, которую я запускаю перед коммитом: <code>git dc</code> — проверить, <strong>что именно</strong> туда уходит.</p>
<hr>
<h2 id="conventional-commits-минимум">Conventional Commits: минимум</h2>
<p>Формат:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">type(scope): короткое описание до 50 символов
</span></span></code></pre></div><p><strong>Базовые типы (их 5, остальные позже):</strong></p>
<table>
  <thead>
      <tr>
          <th>type</th>
          <th>когда</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>feat</code></td>
          <td>новая функциональность</td>
      </tr>
      <tr>
          <td><code>fix</code></td>
          <td>исправление бага</td>
      </tr>
      <tr>
          <td><code>docs</code></td>
          <td>только документация</td>
      </tr>
      <tr>
          <td><code>refactor</code></td>
          <td>переписали без изменения поведения</td>
      </tr>
      <tr>
          <td><code>chore</code></td>
          <td>версии, зависимости, служебное</td>
      </tr>
  </tbody>
</table>
<p><strong>Scope</strong> (в скобках) — модуль/компонент: <code>auth</code>, <code>api</code>, <code>ui</code>, <code>deps</code>. Опционально.</p>
<p>Плохо: <code>fix</code>, <code>update</code>, <code>asdf</code>, <code>wip</code>.
Хорошо: <code>fix(auth): bcrypt compare вместо прямого сравнения пароля</code>.</p>
<p>Больше типов и автоматическая проверка через <code>commitlint</code> — в Дне 5 (hooks).</p>
<hr>
<h2 id="частые-ошибки">Частые ошибки</h2>
<table>
  <thead>
      <tr>
          <th>Ошибка</th>
          <th>Почему больно</th>
          <th>Как не делать</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>git add .</code> без посмотра</td>
          <td>В коммит улетают <code>node_modules/</code>, <code>.env</code>, случайные логи</td>
          <td><code>git status</code> → <code>git diff</code> → <code>git add &lt;файл&gt;</code></td>
      </tr>
      <tr>
          <td>Один коммит на 10 файлов и 3 несвязанные правки</td>
          <td><code>git bisect</code> не работает, cherry-pick бесполезен</td>
          <td><code>git add -p</code> или несколько <code>git add &lt;файл&gt;</code></td>
      </tr>
      <tr>
          <td><code>git commit -am</code> на незнакомом репо</td>
          <td><code>-a</code> добавляет <strong>все отслеживаемые изменения</strong>, но не untracked. Ломает ментальную модель новичка</td>
          <td>Сначала <code>git status</code>, потом осознанный <code>git add</code></td>
      </tr>
      <tr>
          <td>Сообщение <code>fix</code>/<code>update</code>/<code>wip</code></td>
          <td>Через месяц вы не помните, что было «wip». <code>git log</code> становится бесполезен</td>
          <td>Один тип + одно уточнение: <code>fix(auth): null check</code></td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="-документирование">📝 Документирование</h2>
<p>Создайте <code>~/notes/day-01.md</code> и ответьте:</p>
<ol>
<li><strong>Вашими словами</strong>: три состояния Git и по одной команде для перехода в каждое.</li>
<li><strong>Два взгляда на diff</strong>: чем <code>git diff</code> отличается от <code>git diff --cached</code>? В каком порядке вы их запускаете перед коммитом?</li>
<li><strong>Ваш сценарий</strong>: опишите последнюю сессию кодинга из 3+ правок в разных файлах. Как бы вы разбили её на коммиты?</li>
<li><strong>Когда <code>git add .</code> допустим?</strong> Попробуйте придумать 1–2 ситуации, где это нормально (подсказка: <strong>свежий</strong> untracked).</li>
</ol>
<hr>
<h2 id="мини-тест">Мини-тест</h2>
<ol>
<li>Вы сделали <code>git add README.md</code>, потом <code>echo &quot;x&quot; &gt;&gt; README.md</code>. Что покажет <code>git status</code>?</li>
<li>В staging — файл A, в working — правки в файле A и файле B. Какую команду запустить, чтобы увидеть <strong>только то, что пойдёт в коммит</strong>?</li>
<li>Вы случайно <code>git add secret.env</code>. Коммит ещё не сделан. Как отменить?</li>
<li>Вы сделали коммит с опечаткой в сообщении (но содержимое коммита правильное). Какая команда меняет только сообщение последнего коммита?</li>
</ol>
<p>Ответы — в конце поста.</p>
<hr>
<h2 id="что-дальше">Что дальше</h2>
<ul>
<li><strong>День 2</strong> → три способа смотреть diff: <code>git log -p</code>, <code>git blame</code>, <code>git show</code>. Как читать историю, не запуская IDE</li>
<li><strong>Challenge</strong> → <code>docker run devitway/git-challenge</code>: одна из задач — разобрать 20 непонятных коммитов и переделать в историю, которую можно читать</li>
<li><strong>Системно с нуля</strong> → «Курс молодого бойца» DevIT Academy</li>
</ul>
<hr>
<h2 id="ответы-на-мини-тест">Ответы на мини-тест</h2>
<ol>
<li>
<p>Две строки по <code>README.md</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">M  README.md
</span></span><span class="line"><span class="cl"> M README.md
</span></span></code></pre></div><p>Первая строка (<code>M</code> в первой колонке) — то, что было в staging на момент <code>git add</code>. Вторая (<code> M</code> во второй колонке) — новые правки в working после этого. В коммит пойдёт только <strong>первая</strong> версия.</p>
</li>
<li>
<p><code>git diff --cached</code> (то же что <code>git diff --staged</code>). Без флага <code>git diff</code> показывает working минус staging, то есть как раз то, что <strong>не пойдёт</strong>.</p>
</li>
<li>
<p><code>git restore --staged secret.env</code>. Файл остаётся в working с тем же содержимым, просто уходит из staging. Дальше: добавить <code>secret.env</code> в <code>.gitignore</code>.</p>
</li>
<li>
<p><code>git commit --amend -m &quot;новое сообщение&quot;</code>. ⚠️ Если коммит уже запушен — <code>--amend</code> перепишет хеш, и <code>git push</code> потребует <code>--force-with-lease</code>. На общих ветках так делать не надо.</p>
</li>
</ol>
]]></content:encoded>
    </item>
  </channel>
</rss>
