<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Максим Кузнецов: заметки с тегом git</title>
<link>https://maxkuznetsov.ru/tags/git/</link>
<description>Простыми словами о веб-разработке</description>
<author>Максим Кузнецов</author>
<language>ru</language>
<generator>E2 (v3559; Aegea)</generator>

<itunes:owner>
<itunes:name>Максим Кузнецов</itunes:name>
<itunes:email></itunes:email>
</itunes:owner>
<itunes:subtitle>Простыми словами о веб-разработке</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>[Инструкция] Как работать с Git</title>
<guid isPermaLink="false">49</guid>
<link>https://maxkuznetsov.ru/all/instrukciya-kak-rabotat-s-git/</link>
<pubDate>Tue, 15 Jul 2025 11:15:15 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/instrukciya-kak-rabotat-s-git/</comments>
<description>
&lt;p&gt;(Это инструкция, которую приходится копировать из проекта в проект, поэтому размещаю и в блоге.)&lt;/p&gt;
&lt;h2&gt;Gitflow&lt;/h2&gt;
&lt;p&gt;Идейно система работы с ветками берётся из Gitflow, но с упрощениями.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://maxkuznetsov.ru/pictures/gitflow.png" width="1043" height="371" alt="" /&gt;
&lt;/div&gt;
&lt;h2&gt;Общее&lt;/h2&gt;
&lt;p&gt;В нашем проекте ветка &lt;b&gt;develop&lt;/b&gt; — ветка, которая содержит стабильный результат, который можно зарелизить на прод.&lt;/p&gt;
&lt;p&gt;Следуя этому принципу, в рамках работы по спринту в ветку develop вливаются фичи/задачи:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;стабильного качества (по мнению разработчика (всегда) и менеджера (аппрув менеджера требуется, если этого требует конкретная задача);&lt;/li&gt;
&lt;li&gt;из спринта, который в работе (то есть те задачи, которые должны быть в ближайшем релизе).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Если ведется работа по фиче, которая не войдет в ближайший релиз, она не вливается в develop.  Тестирование такой задачи можно проводить, подключая ветку фичи на свободную дев площадку (не вливая ее в develop ветку).&lt;/p&gt;
&lt;h2&gt;Правила именования&lt;/h2&gt;
&lt;p&gt;Каждый коммит и пулл-реквест должны именоваться в следующем формате:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[Sentry] EDS-1004: &lt;пояснение&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;В квадратных скобках можно указать часть системы, которая затрагивается — это упростит поиск коммита, если что-то сломается. Списка частей системы нет, выбирайте на свой вкус. Из общих советов — это должно быть что-то широкое, чтобы был понятен контекст, но не слишком широкое, чтобы не терялся смысл.&lt;/p&gt;
&lt;p&gt;EDS-1004 — даёт понимание по какой задаче была изменена строка в кода (через git blame), а потом по задаче можно найти ПОЧЕМУ это было сделано.&lt;br /&gt;
Плюс почти все таск-трекеры позволяют сконнектиться с Gitlab/Github/etc, и тогда коммиты и ПРы будут показываться в таск-трекре. А в Gitlab/Github все упоминания задач будут отображаться ссылками на таск-трекер автоматически.&lt;/p&gt;
&lt;h2&gt;Работа с ветками&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Из ветки main (или аналогичных prod/master) создается ветка develop.&lt;/li&gt;
&lt;li&gt;На каждую фичу создаётся новая ветка вида feature/XXX-short-description от ветки develop. XXX — номер задачи из таск-трекера, &lt;short-description&gt; — краткое описание задачи на английском языке. Например: `feature/TASK-1777-change-forms-for-clients`.&lt;/li&gt;
&lt;li&gt;Когда фича готова (это значит, что разработчик считает, что фича выполнена корректно и протестирована локально) ветка фичи отправляется через Пулл-реквест в ветку develop. При создании Пулл-реквеста обязательно нужно выбрать галку «удалить ветку после мерджа», чтобы не разводить кладбище веток в git.&lt;/li&gt;
&lt;li&gt;Разработчик не забывает регулярно подтягивать ветку develop в свою ветку фичи в процессе разработки, чтобы уменьшить количество конфликтов при последующем MR в develop.&lt;/li&gt;
&lt;li&gt;Для релиза ветку develop мерджим в ветку main через MR в Gitlab/Githab/etc.&lt;/li&gt;
&lt;li&gt;Если в ветке prod обнаруживается критичный баг, то от main создается ветка hotfix/XXX-short-description.&lt;/li&gt;
&lt;li&gt;Как только исправление на ветке hotfix завершено, она мержится с ветками main, а затем с develop.&lt;/li&gt;
&lt;li&gt;После каждого мерджа тестируем в первую очередь новый функционал, потом все остальное.&lt;/li&gt;
&lt;li&gt;Если разработчик не успевает сделать свою задачу до релиза, то ветка фичи не мерджится в ветку develop.&lt;/li&gt;
&lt;li&gt;Если фича большая и не попадает в ближайший релиз, то разработку продолжаем в той же ветке под фичу, пока ее полностью не сделаем. Не забываем делать git pull, чтобы подтягивать все изменения c ветки develop. Это позволит подтягивать все изменения текущего спринта и разрешать конфликты как можно быстрее. Свою задачу можно протестировать на стейдже, залив её туда без мерджа.&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>

<item>
<title>Удаление старых локальных веток в Git-репозитории</title>
<guid isPermaLink="false">47</guid>
<link>https://maxkuznetsov.ru/all/udalenie-staryh-lokalnyh-vetok-v-git-repozitorii/</link>
<pubDate>Thu, 27 Feb 2025 22:57:05 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/udalenie-staryh-lokalnyh-vetok-v-git-repozitorii/</comments>
<description>
&lt;p&gt;На долгих проектах при следовании gitflow или похожих подходов с feature-ветками часто накапливаются локальные ветки, которые уже были смёрджены в develop.&lt;/p&gt;
&lt;p&gt;Старые ненужные ветки можно удалить одной командой:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;git branch --merged develop | grep -v &amp;quot;^\*\\|develop\\|main\\|master&amp;quot; | xargs -n 1 git branch -d&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;При этом текущие ветки, несмердженные в develop, останутся.&lt;/p&gt;
</description>
</item>

<item>
<title>Как быстро изучить Git с нуля</title>
<guid isPermaLink="false">30</guid>
<link>https://maxkuznetsov.ru/all/git-intro/</link>
<pubDate>Tue, 28 Apr 2020 16:22:21 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/git-intro/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://maxkuznetsov.ru/pictures/git-intro.png" width="1748" height="692" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Git — это система версионирования документов. Она позволяет пользователям создавать несколько параллельных версий, независимо управлять ими и сливать друг в друга с автоматическим нахождением конфликтных строк.&lt;/p&gt;
&lt;p&gt;Когда документ правит один человек, то никаких проблем не возникает, хотя иногда хочется видеть историю изменений с возможностью вернуться на предыдущую версию. А что, если над документом работают два человека?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;— Вась, только что залил новую версию отчёта. Добавил одну страницу в третью главу.&lt;br /&gt;
— Ёпт, а я третью главу уже с нуля переписал...&lt;br /&gt;
— ...&lt;br /&gt;
— Ладно, давай подходи к моему компу со своим файлом, счас вместе глянем как это разрулить.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Раньше приходилось либо разбивать такой документ на несколько, чтобы можно было менять каждую часть независимо, либо договариваться, кто что правит, либо слать файл со своими правками, а потом ждать, когда человек пришлёт версию с его внесёнными правками.&lt;/p&gt;
&lt;p&gt;А что, если документ содержит сто страниц и его будут править десять человек?&lt;/p&gt;
&lt;h2&gt;Git&lt;/h2&gt;
&lt;p class="remark"&gt;&lt;b&gt;Первая версия Git&lt;/b&gt; была создана Линусом Торвальдсом — автором операционной системы Linux. Собственно, с помощью Git она и разрабатывалась.&lt;/p&gt;
&lt;p&gt;Первыми с проблемой параллельного редактирования файлов столкнулись программисты, они и разработали решение — Git. Он позволяет хранить файлы в общем хранилище, а также каждому участнику создавать их копию локально. Можно менять файлы, создавать свои версии, откатываться на предыдущие, а потом отправлять финальную версию в хранилище. Гит самостоятельно объединит версии разных людей, либо укажет на конфликт, если, например, оба человека изменили одну и ту же строку. По такому же принципу работает Google Docs и подобные сервисы.&lt;/p&gt;
&lt;h3&gt;Курсы&lt;/h3&gt;
&lt;p&gt;Для изучения Git достаточно изучить&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[4h] &lt;a href="https://githowto.com/ru"&gt;Githowto&lt;/a&gt; — курс на русском, нужно пройти хотя бы первые 38 уроков, чтобы можно было использовать git в реальной жизни.&lt;/li&gt;
&lt;li&gt;[15m] &lt;a href="https://danielkummer.github.io/git-flow-cheatsheet/index.ru_RU.html"&gt;Шпаргалка по gitflow&lt;/a&gt; — способ организации веток, чтобы в них не запутаться на средних и больших проектах.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В Githowto сразу же рассказывают, как установить git. Иногда git уже включён в систему по умолчанию, поэтому можно и не устанавливать. Проверить его наличие можно командой в терминале:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$ git --version
git version 2.24.1 (Apple Git-126)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если ничего не вывелось, значит git не установлен.&lt;/p&gt;
&lt;h3&gt;Вопросы для самопроверки после курса&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Что такое unstaged, staged и commited состояния у файлов?&lt;/li&gt;
&lt;li&gt;Что такое ветки, как создавать их, переключаться между ними и объединять?&lt;/li&gt;
&lt;li&gt;Как нужно именовать ветки согласно gitflow (master, develop, feature, hotfix, release)?&lt;/li&gt;
&lt;li&gt;В каких случаях git самостоятельно сливает файлы, а в каких создаёт конфликты?&lt;/li&gt;
&lt;li&gt;Как выглядит конфликт и что нужно сделать, чтобы его разрешить?&lt;/li&gt;
&lt;li&gt;Как откатить изменения закоммиченного файла?&lt;/li&gt;
&lt;li&gt;Как откатить изменения закоммиченного и запушенного в удалённый реп файла?&lt;/li&gt;
&lt;li&gt;Что такое git stash и как им пользоваться?&lt;/li&gt;
&lt;li&gt;Что такое репозитории — локальные и удалённые? Как склонировать репозиторий? Как запушить в реп?&lt;/li&gt;
&lt;li&gt;Для каких файлов GIT подходит, а с какими работает плохо: текстовые и бинарные файлы?&lt;/li&gt;
&lt;li&gt;Как исключить файлы из-под контроля Git (.gitignore)?&lt;/li&gt;
&lt;li&gt;Установите алиасы для частых комманд: git ci, git st, git hist, git br, git co.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Дополнительная практика [1h]&lt;/h2&gt;
&lt;p&gt;Для начала создайте папку проекта с двумя файлами в разметке Markdown. Если не работали с markdown, то считайте их обычными текстовыми файлами.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;README.md&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="markdown"&gt;# Знакомство с GIT
Есть отличные курсы:
- http://gitimmersion.com/
- https://githowto.com/ru

А также статья в блоге https://maxkuznetsov.ru/.&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;CHANGELOG.md&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="markdown"&gt;- Изучен курс GitHowTo
- Ознакомился с Git flow подходом
- Прочитал статью https://maxkuznetsov.ru/all/git-intro и сделал задания&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Задачи&lt;/h3&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Добавьте поддержку Git в этот проект. Сделайте первый коммит, включающий оба этих файла.&lt;/li&gt;
&lt;li&gt;Создайте от мастера новую feature/md-updates-vasya.  &lt;br /&gt;
&lt;i&gt;В реальной жизни master используется только для продакшена, а для основной разработки — ветка develop. Новые правки лучше всегда делать в отдельной feature/* ветке, а потом сливать её в develop или master, если вы работаете без develop.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Зарегистрируйтесь в github.com и создайте пустой репозиторий.&lt;/li&gt;
&lt;li&gt;Запушьте локальный репозиторий в созданный удалённый репозиторий.&lt;/li&gt;
&lt;li&gt;Измените первые строки в обоих файлах. Сделайте коммит, включив в него только изменения из CHANGELOG.md.  &lt;br /&gt;
&lt;i&gt;Случай из жизни: мы сделали кучу изменений в файлах, а потом поняли, что надо бы сохранить последнюю рабочую версию, но без последних лишних измнений.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Откатите (soft) последний коммит и сделайте новый, но уже с изменениями из обоих файлов. Попробуйте также вариант без отката: «git commit —amend».&lt;/li&gt;
&lt;li&gt;Запушьте ветку в удаленный репозиторий и создайте там Pull Request в master.&lt;/li&gt;
&lt;li&gt;Создайте локально новую папку, куда склонируйте ваш удалённый репозиторий. У вас должно быть на компьютере две папки, смотрящие на один и тот же репозиторий. Этим мы имитируем ситуацию, когда два человека с разных компьютеров работают с одним репом. Назовём эти два локальных репозитория: первый — репозиторий Васи, второй — Пети.&lt;/li&gt;
&lt;li&gt;В новом репо Пети создайте ветку feature/md-updates-petya из master.&lt;/li&gt;
&lt;li&gt;Измените первые строки в обоих файлах (иначе, чем в feature/md-updates-vasya), закоммитьте, запушьте и создайте PullRequest на Github.&lt;/li&gt;
&lt;li&gt;В интерфейсе Github примите первый Pull-Request из ветки Васи, а потом убедитесь, что получили конфликт в Пулл-реквесте от Пети.  &lt;br /&gt;
&lt;i&gt;Так часто бывает в жизни, когда над одним кодом работает больше одного человека. Чем больше команда, тем чаще конфликты.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Разрулите конфликт в локальном репозитории в ветке Пети и обновите Пулл-реквест.&lt;/li&gt;
&lt;li&gt;Примите в github.com обновлённый Пулл-реквест от Пети.&lt;/li&gt;
&lt;li&gt;В репозитории Васи переключитесь в master и сделайте git pull. Убедитесь, что ветка feature/md-updates-vasya удалена.&lt;/li&gt;
&lt;li&gt;Оказалось, что вмёрдженная ветка от Пети содержала баги, поэтому нужно её откатить. Откатите её в репозитории Пети с помощью revert и c полной перезаписью публичной истории. Можно делать без Пулл-реквеста в этот раз.&lt;/li&gt;
&lt;li&gt;Посмотрите, как изменилась история в репозитории Васи до git pull и после git pull.&lt;/li&gt;
&lt;li&gt;В репозитории Васи добавьте в .gitignore файл CHANGELOG.md, чтобы Git перестал его отслеживать. (Подсказка: «git rm» с флагом «—cached».) Запушьте в удалённый реп.&lt;/li&gt;
&lt;li&gt;Зайдите в Github и проверьте, что CHANGELOG.md больше нет в репозитории.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;GUI клиенты&lt;/h2&gt;
&lt;p&gt;В реальной жизни работать с гитом через консоль приходится редко. Есть клиенты Git с визуальным интерфейсом, например:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;встроенные в IDE&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sourcetreeapp.com/"&gt;Sourcetree&lt;/a&gt; — мой личный выбор&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gitkraken.com/"&gt;Git Kraken&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tortoisegit.org/"&gt;Git Tortoise&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Но ими проще пользоваться, когда ты понимаешь, что они делают под капотом.&lt;/p&gt;
</description>
</item>


</channel>
</rss>