{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Максим Кузнецов: заметки с тегом git",
    "_rss_description": "Простыми словами о веб-разработке",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/maxkuznetsov.ru\/tags\/git\/",
    "feed_url": "https:\/\/maxkuznetsov.ru\/tags\/git\/json\/",
    "icon": "https:\/\/maxkuznetsov.ru\/user\/userpic@2x.jpg?1586398004",
    "author": {
        "name": "Максим Кузнецов",
        "url": "https:\/\/maxkuznetsov.ru\/",
        "avatar": "https:\/\/maxkuznetsov.ru\/user\/userpic@2x.jpg?1586398004"
    },
    "items": [
        {
            "id": "49",
            "url": "https:\/\/maxkuznetsov.ru\/all\/instrukciya-kak-rabotat-s-git\/",
            "title": "[Инструкция] Как работать с Git",
            "content_html": "<p>(Это инструкция, которую приходится копировать из проекта в проект, поэтому размещаю и в блоге.)<\/p>\n<h2>Gitflow<\/h2>\n<p>Идейно система работы с ветками берётся из Gitflow, но с упрощениями.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/maxkuznetsov.ru\/pictures\/gitflow.png\" width=\"1043\" height=\"371\" alt=\"\" \/>\n<\/div>\n<h2>Общее<\/h2>\n<p>В нашем проекте ветка <b>develop<\/b> — ветка, которая содержит стабильный результат, который можно зарелизить на прод.<\/p>\n<p>Следуя этому принципу, в рамках работы по спринту в ветку develop вливаются фичи\/задачи:<\/p>\n<ul>\n<li>стабильного качества (по мнению разработчика (всегда) и менеджера (аппрув менеджера требуется, если этого требует конкретная задача);<\/li>\n<li>из спринта, который в работе (то есть те задачи, которые должны быть в ближайшем релизе).<\/li>\n<\/ul>\n<p>Если ведется работа по фиче, которая не войдет в ближайший релиз, она не вливается в develop.  Тестирование такой задачи можно проводить, подключая ветку фичи на свободную дев площадку (не вливая ее в develop ветку).<\/p>\n<h2>Правила именования<\/h2>\n<p>Каждый коммит и пулл-реквест должны именоваться в следующем формате:<\/p>\n<blockquote>\n<p>[Sentry] EDS-1004: <пояснение><\/p>\n<\/blockquote>\n<p>В квадратных скобках можно указать часть системы, которая затрагивается — это упростит поиск коммита, если что-то сломается. Списка частей системы нет, выбирайте на свой вкус. Из общих советов — это должно быть что-то широкое, чтобы был понятен контекст, но не слишком широкое, чтобы не терялся смысл.<\/p>\n<p>EDS-1004 — даёт понимание по какой задаче была изменена строка в кода (через git blame), а потом по задаче можно найти ПОЧЕМУ это было сделано.<br \/>\nПлюс почти все таск-трекеры позволяют сконнектиться с Gitlab\/Github\/etc, и тогда коммиты и ПРы будут показываться в таск-трекре. А в Gitlab\/Github все упоминания задач будут отображаться ссылками на таск-трекер автоматически.<\/p>\n<h2>Работа с ветками<\/h2>\n<ol start=\"1\">\n<li>Из ветки main (или аналогичных prod\/master) создается ветка develop.<\/li>\n<li>На каждую фичу создаётся новая ветка вида feature\/XXX-short-description от ветки develop. XXX — номер задачи из таск-трекера, <short-description> — краткое описание задачи на английском языке. Например: `feature\/TASK-1777-change-forms-for-clients`.<\/li>\n<li>Когда фича готова (это значит, что разработчик считает, что фича выполнена корректно и протестирована локально) ветка фичи отправляется через Пулл-реквест в ветку develop. При создании Пулл-реквеста обязательно нужно выбрать галку «удалить ветку после мерджа», чтобы не разводить кладбище веток в git.<\/li>\n<li>Разработчик не забывает регулярно подтягивать ветку develop в свою ветку фичи в процессе разработки, чтобы уменьшить количество конфликтов при последующем MR в develop.<\/li>\n<li>Для релиза ветку develop мерджим в ветку main через MR в Gitlab\/Githab\/etc.<\/li>\n<li>Если в ветке prod обнаруживается критичный баг, то от main создается ветка hotfix\/XXX-short-description.<\/li>\n<li>Как только исправление на ветке hotfix завершено, она мержится с ветками main, а затем с develop.<\/li>\n<li>После каждого мерджа тестируем в первую очередь новый функционал, потом все остальное.<\/li>\n<li>Если разработчик не успевает сделать свою задачу до релиза, то ветка фичи не мерджится в ветку develop.<\/li>\n<li>Если фича большая и не попадает в ближайший релиз, то разработку продолжаем в той же ветке под фичу, пока ее полностью не сделаем. Не забываем делать git pull, чтобы подтягивать все изменения c ветки develop. Это позволит подтягивать все изменения текущего спринта и разрешать конфликты как можно быстрее. Свою задачу можно протестировать на стейдже, залив её туда без мерджа.<\/li>\n<\/ol>\n",
            "date_published": "2025-07-15T11:15:15+03:00",
            "date_modified": "2025-07-15T11:15:05+03:00",
            "image": "https:\/\/maxkuznetsov.ru\/pictures\/gitflow.png",
            "_date_published_rfc2822": "Tue, 15 Jul 2025 11:15:15 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "49",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/maxkuznetsov.ru\/pictures\/gitflow.png"
                ]
            }
        },
        {
            "id": "47",
            "url": "https:\/\/maxkuznetsov.ru\/all\/udalenie-staryh-lokalnyh-vetok-v-git-repozitorii\/",
            "title": "Удаление старых локальных веток в Git-репозитории",
            "content_html": "<p>На долгих проектах при следовании gitflow или похожих подходов с feature-ветками часто накапливаются локальные ветки, которые уже были смёрджены в develop.<\/p>\n<p>Старые ненужные ветки можно удалить одной командой:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">git branch --merged develop | grep -v &quot;^\\*\\\\|develop\\\\|main\\\\|master&quot; | xargs -n 1 git branch -d<\/code><\/pre><p>При этом текущие ветки, несмердженные в develop, останутся.<\/p>\n",
            "date_published": "2025-02-27T22:57:05+03:00",
            "date_modified": "2025-02-27T22:57:00+03:00",
            "_date_published_rfc2822": "Thu, 27 Feb 2025 22:57:05 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "47",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "30",
            "url": "https:\/\/maxkuznetsov.ru\/all\/git-intro\/",
            "title": "Как быстро изучить Git с нуля",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/maxkuznetsov.ru\/pictures\/git-intro.png\" width=\"1748\" height=\"692\" alt=\"\" \/>\n<\/div>\n<p>Git — это система версионирования документов. Она позволяет пользователям создавать несколько параллельных версий, независимо управлять ими и сливать друг в друга с автоматическим нахождением конфликтных строк.<\/p>\n<p>Когда документ правит один человек, то никаких проблем не возникает, хотя иногда хочется видеть историю изменений с возможностью вернуться на предыдущую версию. А что, если над документом работают два человека?<\/p>\n<blockquote>\n<p>— Вась, только что залил новую версию отчёта. Добавил одну страницу в третью главу.<br \/>\n— Ёпт, а я третью главу уже с нуля переписал...<br \/>\n— ...<br \/>\n— Ладно, давай подходи к моему компу со своим файлом, счас вместе глянем как это разрулить.<\/p>\n<\/blockquote>\n<p>Раньше приходилось либо разбивать такой документ на несколько, чтобы можно было менять каждую часть независимо, либо договариваться, кто что правит, либо слать файл со своими правками, а потом ждать, когда человек пришлёт версию с его внесёнными правками.<\/p>\n<p>А что, если документ содержит сто страниц и его будут править десять человек?<\/p>\n<h2>Git<\/h2>\n<p class=\"remark\"><b>Первая версия Git<\/b> была создана Линусом Торвальдсом — автором операционной системы Linux. Собственно, с помощью Git она и разрабатывалась.<\/p>\n<p>Первыми с проблемой параллельного редактирования файлов столкнулись программисты, они и разработали решение — Git. Он позволяет хранить файлы в общем хранилище, а также каждому участнику создавать их копию локально. Можно менять файлы, создавать свои версии, откатываться на предыдущие, а потом отправлять финальную версию в хранилище. Гит самостоятельно объединит версии разных людей, либо укажет на конфликт, если, например, оба человека изменили одну и ту же строку. По такому же принципу работает Google Docs и подобные сервисы.<\/p>\n<h3>Курсы<\/h3>\n<p>Для изучения Git достаточно изучить<\/p>\n<ul>\n<li>[4h] <a href=\"https:\/\/githowto.com\/ru\">Githowto<\/a> — курс на русском, нужно пройти хотя бы первые 38 уроков, чтобы можно было использовать git в реальной жизни.<\/li>\n<li>[15m] <a href=\"https:\/\/danielkummer.github.io\/git-flow-cheatsheet\/index.ru_RU.html\">Шпаргалка по gitflow<\/a> — способ организации веток, чтобы в них не запутаться на средних и больших проектах.<\/li>\n<\/ul>\n<p>В Githowto сразу же рассказывают, как установить git. Иногда git уже включён в систему по умолчанию, поэтому можно и не устанавливать. Проверить его наличие можно командой в терминале:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">$ git --version\r\ngit version 2.24.1 (Apple Git-126)<\/code><\/pre><p>Если ничего не вывелось, значит git не установлен.<\/p>\n<h3>Вопросы для самопроверки после курса<\/h3>\n<ul>\n<li>Что такое unstaged, staged и commited состояния у файлов?<\/li>\n<li>Что такое ветки, как создавать их, переключаться между ними и объединять?<\/li>\n<li>Как нужно именовать ветки согласно gitflow (master, develop, feature, hotfix, release)?<\/li>\n<li>В каких случаях git самостоятельно сливает файлы, а в каких создаёт конфликты?<\/li>\n<li>Как выглядит конфликт и что нужно сделать, чтобы его разрешить?<\/li>\n<li>Как откатить изменения закоммиченного файла?<\/li>\n<li>Как откатить изменения закоммиченного и запушенного в удалённый реп файла?<\/li>\n<li>Что такое git stash и как им пользоваться?<\/li>\n<li>Что такое репозитории — локальные и удалённые? Как склонировать репозиторий? Как запушить в реп?<\/li>\n<li>Для каких файлов GIT подходит, а с какими работает плохо: текстовые и бинарные файлы?<\/li>\n<li>Как исключить файлы из-под контроля Git (.gitignore)?<\/li>\n<li>Установите алиасы для частых комманд: git ci, git st, git hist, git br, git co.<\/li>\n<\/ul>\n<h2>Дополнительная практика [1h]<\/h2>\n<p>Для начала создайте папку проекта с двумя файлами в разметке Markdown. Если не работали с markdown, то считайте их обычными текстовыми файлами.<\/p>\n<ul>\n<li>README.md<\/li>\n<\/ul>\n<pre class=\"e2-text-code\"><code class=\"markdown\"># Знакомство с GIT\r\nЕсть отличные курсы:\r\n- http:\/\/gitimmersion.com\/\r\n- https:\/\/githowto.com\/ru\r\n\r\nА также статья в блоге https:\/\/maxkuznetsov.ru\/.<\/code><\/pre><ul>\n<li>CHANGELOG.md<\/li>\n<\/ul>\n<pre class=\"e2-text-code\"><code class=\"markdown\">- Изучен курс GitHowTo\r\n- Ознакомился с Git flow подходом\r\n- Прочитал статью https:\/\/maxkuznetsov.ru\/all\/git-intro и сделал задания<\/code><\/pre><h3>Задачи<\/h3>\n<ol start=\"1\">\n<li>Добавьте поддержку Git в этот проект. Сделайте первый коммит, включающий оба этих файла.<\/li>\n<li>Создайте от мастера новую feature\/md-updates-vasya.  <br \/>\n<i>В реальной жизни master используется только для продакшена, а для основной разработки — ветка develop. Новые правки лучше всегда делать в отдельной feature\/* ветке, а потом сливать её в develop или master, если вы работаете без develop.<\/i><\/li>\n<li>Зарегистрируйтесь в github.com и создайте пустой репозиторий.<\/li>\n<li>Запушьте локальный репозиторий в созданный удалённый репозиторий.<\/li>\n<li>Измените первые строки в обоих файлах. Сделайте коммит, включив в него только изменения из CHANGELOG.md.  <br \/>\n<i>Случай из жизни: мы сделали кучу изменений в файлах, а потом поняли, что надо бы сохранить последнюю рабочую версию, но без последних лишних измнений.<\/i><\/li>\n<li>Откатите (soft) последний коммит и сделайте новый, но уже с изменениями из обоих файлов. Попробуйте также вариант без отката: «git commit —amend».<\/li>\n<li>Запушьте ветку в удаленный репозиторий и создайте там Pull Request в master.<\/li>\n<li>Создайте локально новую папку, куда склонируйте ваш удалённый репозиторий. У вас должно быть на компьютере две папки, смотрящие на один и тот же репозиторий. Этим мы имитируем ситуацию, когда два человека с разных компьютеров работают с одним репом. Назовём эти два локальных репозитория: первый — репозиторий Васи, второй — Пети.<\/li>\n<li>В новом репо Пети создайте ветку feature\/md-updates-petya из master.<\/li>\n<li>Измените первые строки в обоих файлах (иначе, чем в feature\/md-updates-vasya), закоммитьте, запушьте и создайте PullRequest на Github.<\/li>\n<li>В интерфейсе Github примите первый Pull-Request из ветки Васи, а потом убедитесь, что получили конфликт в Пулл-реквесте от Пети.  <br \/>\n<i>Так часто бывает в жизни, когда над одним кодом работает больше одного человека. Чем больше команда, тем чаще конфликты.<\/i><\/li>\n<li>Разрулите конфликт в локальном репозитории в ветке Пети и обновите Пулл-реквест.<\/li>\n<li>Примите в github.com обновлённый Пулл-реквест от Пети.<\/li>\n<li>В репозитории Васи переключитесь в master и сделайте git pull. Убедитесь, что ветка feature\/md-updates-vasya удалена.<\/li>\n<li>Оказалось, что вмёрдженная ветка от Пети содержала баги, поэтому нужно её откатить. Откатите её в репозитории Пети с помощью revert и c полной перезаписью публичной истории. Можно делать без Пулл-реквеста в этот раз.<\/li>\n<li>Посмотрите, как изменилась история в репозитории Васи до git pull и после git pull.<\/li>\n<li>В репозитории Васи добавьте в .gitignore файл CHANGELOG.md, чтобы Git перестал его отслеживать. (Подсказка: «git rm» с флагом «—cached».) Запушьте в удалённый реп.<\/li>\n<li>Зайдите в Github и проверьте, что CHANGELOG.md больше нет в репозитории.<\/li>\n<\/ol>\n<h2>GUI клиенты<\/h2>\n<p>В реальной жизни работать с гитом через консоль приходится редко. Есть клиенты Git с визуальным интерфейсом, например:<\/p>\n<ul>\n<li>встроенные в IDE<\/li>\n<li><a href=\"https:\/\/www.sourcetreeapp.com\/\">Sourcetree<\/a> — мой личный выбор<\/li>\n<li><a href=\"https:\/\/www.gitkraken.com\/\">Git Kraken<\/a><\/li>\n<li><a href=\"https:\/\/tortoisegit.org\/\">Git Tortoise<\/a><\/li>\n<\/ul>\n<p>Но ими проще пользоваться, когда ты понимаешь, что они делают под капотом.<\/p>\n",
            "date_published": "2020-04-28T16:22:21+03:00",
            "date_modified": "2020-04-28T16:22:14+03:00",
            "image": "https:\/\/maxkuznetsov.ru\/pictures\/git-intro.png",
            "_date_published_rfc2822": "Tue, 28 Apr 2020 16:22:21 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "30",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/maxkuznetsov.ru\/pictures\/git-intro.png"
                ]
            }
        }
    ],
    "_e2_version": 3559,
    "_e2_ua_string": "E2 (v3559; Aegea)"
}