$ sudo teach|
    $ sudo teach|
    IT school
  • Telegram
  • Партнёрам
  • Все курсы
$ sudo teach IT
OOO "SALEPROFIT"Контакты и реквизитыIT-Park Logo

Школа

  • Блог
  • Проверить сертификат

Сотрудничество

  • Стать учителем
  • Партнёрская программа
  • О проекте

Право

  • Оферта
  • Политика конфиденциальности

© 2023–2026 $ sudo teach IT™. All Rights Reserved. Public user contributions licensed under CC BY-SA 4.0 license with attribution required
TelegramGitHubYouTube
ГлавнаяБлогПервые шаги в Git для разработки: ветки, PR и безопасный откат

Первые шаги в Git для разработки: ветки, PR и безопасный откат

$ sudo teach IT
·25 июля 2026 г.·10 мин·49
Первые шаги в Git для разработки: ветки, PR и безопасный откат

Разберём базовые принципы работы с ветками, pull request’ами и откатом изменений так, чтобы не ломать историю и не терять правки. Практика на типовых сценариях: исправить после PR, откатить коммит, перенести изменения в новую ветку.

Содержание
Ментальная модель: ветки как рабочие контуры, а не «папки»Ветка — это указатель на коммитЧем merge отличается от rebase (в контексте новичка)Базовые операции с ветками: как начать и не запутатьсяСоздание ветки под задачуПроверка статуса и состоянияКогда коммиты нужно делать частоPull Request: зачем он нужен и как его “не сломать”PR — это не магия, а контракт измененийСамый безопасный поток действийТипичные ошибки на старте PRБезопасный откат после PR: исправить или признать ошибкуСценарий 1: исправить после PR (и не трогать чужую историю)Важно: PR обновляется автоматически при новых коммитах в вашей веткеКогда стоит обновить PR после мёржинга в targetСценарий 2: откатить коммит, но не потерять правкиОткатить один коммит через revertЕсли коммит был в вашей ветке PR и PR ещё не смёрженrevert серии коммитовСценарий 3: перенести изменения в новую ветку (когда вы ошиблись веткой)Вариант A: коммиты уже сделаны в “не той” веткеВариант B: коммиты уже запушены (опасно переписывать историю)Вариант C: изменения не закоммиченыВажное правило: не используйте reset/rebase вслепуюКогда safe (обычно) использовать resetКогда лучше revert“Исправить после merge”: что делать, если баг нашли слишком поздноБыстрый откат через revert на mainПолноценное исправление через новый PRТиповые подводные камни при работе с ветками и PRКонфликты при обновлении ветки перед PRСмешивание форматирования и логикиОпора на git pull без понимания upstreamПрактические шпаргалки: команды “на каждый день”Создать ветку и подготовиться к PRОбновить ветку через merge (без переписывания)Откатить коммит в публичной веткеЗабрать изменения в новую ветку (если ошиблись веткой)Вывод: безопасная дисциплина вместо “магии команд”

Git для разработчика — это не просто «хранилище кода», а система принятия решений: когда и как менять историю, как изолировать эксперименты, как согласовывать изменения с командой и как откатывать ошибки так, чтобы не потерять работу и не испортить остальным людям жизнь. Новички часто начинают с git commit и сталкиваются с тем, что дальше всё становится сложнее: появляется merge, rebase, reset, pull request’ы, и любая ошибка может привести к сломанной истории или пропаже правок.

Эта статья — практическое руководство по базовым принципам работы с ветками, pull request’ами и безопасным откатом изменений. Мы разберём типовые сценарии, где люди обычно “ломают” Git, и закрепим подходы на рабочих командах.


Ментальная модель: ветки как рабочие контуры, а не «папки»

Ветка — это указатель на коммит

В Git ветка — это просто ссылka (pointer) на конкретный коммит. Когда вы делаете commit, Git сохраняет новый снапшот (точнее — объект коммит + ссылка на дерево), и ветка двигается вперёд на новый коммит. Всё остальное — производные механики.

Отсюда важные следствия:

  • переключение на другую ветку (git checkout branch / git switch branch) — это переключение “указателя” на другой коммит;
  • ветки можно создавать сколько угодно — они дешёвые;
  • “сломать историю” чаще всего означает переместить ветку назад/в сторону так, что общий контур истории перестаёт быть согласованным с тем, что уже увидели остальные.

Чем merge отличается от rebase (в контексте новичка)

На практике для старта полезно помнить одно правило:

  • Merge добавляет новый коммит, сохраняя существующую историю как есть.
  • Rebase переписывает коммиты: история становится “другой”, и это опасно, если ветка уже опубликована (её видят другие).

Новичкам обычно проще и безопаснее начинать с merge и использовать rebase только понимая последствия.


Базовые операции с ветками: как начать и не запутаться

Создание ветки под задачу

Типовой сценарий: вы на main, хотите исправить баг или добавить фичу.

code
git switch main
git pull --ff-only
git switch -c fix/pr-typo

Что здесь важно:

  • --ff-only помогает не смешать изменения “тихо”. Если fast-forward невозможен, команда подскажет, что вы не в том состоянии;
  • fix/pr-typo — название ветки отражает смысл. Это снижает когнитивную нагрузку, особенно в командах.

Проверка статуса и состояния

Перед любыми действиями полезно быстро понимать, что у вас локально «не закоммичено».

code
git status
git log --oneline --decorate --graph -n 20

git log --graph часто быстрее любого текста объясняет, где вы находитесь и что за история накопилась.

Когда коммиты нужно делать часто

Git не требует “огромного коммита на всё”. Практика разработки обычно лучше работает с серией небольших коммитов, например:

  • фикс конкретного бага;
  • отдельный коммит на форматирование/линтер (если команда так делает);
  • коммит на тесты.

Это напрямую влияет на то, как будет выглядеть PR и насколько удобно ревьюить изменения.


Pull Request: зачем он нужен и как его “не сломать”

PR — это не магия, а контракт изменений

Pull Request (в GitHub/GitLab/Bitbucket) — это механизм согласования: вы объявляете, что ваша ветка содержит изменения, и просите команду проверить их. В техническом смысле PR — это “сравнение двух точек”: база (target branch) и head (ваша ветка).

Самый безопасный поток действий

  1. Обновить целевую ветку (main/develop).
  2. Синхронизироваться в своей ветке, не переписывая историю.
  3. Отправить ветку в remote.
  4. Открыть PR.

Пример синхронизации с main через merge (без rebase):

code
git switch fix/pr-typo
git fetch origin
git merge origin/main
git push -u origin fix/pr-typo

Если в вашем workflow PR должны быть “чистыми”, merge-коммиты иногда выглядят нежелательно, но в начале они часто помогают избежать переписывания публичной истории.

Типичные ошибки на старте PR

Ошибка 1: забыли запушить ветку
Лечится git push -u origin <branch>.

Ошибка 2: PR основан на устаревшей базе
Симптом: ревьюер видит конфликты или “старые” контуры истории. Решение: обновить ветку (merge/rebase — зависит от правил команды).

Ошибка 3: попытка “откатить PR” коммитами в main руками
Опасно. Основной принцип: вы должны откатывать изменения в правильном месте и безопасным образом — об этом дальше.


Безопасный откат после PR: исправить или признать ошибку

Наиболее распространённые ситуации:

  1. Вы уже открыли PR.
  2. В ревью/CI обнаружили проблему.
  3. Нужно либо исправить, либо отменить часть изменений.

Разберём сценарии: «исправить после PR», «откатить коммит», «перенести изменения в новую ветку».


Сценарий 1: исправить после PR (и не трогать чужую историю)

Важно: PR обновляется автоматически при новых коммитах в вашей ветке

Если вы продолжаете работать в той же ветке fix/pr-typo, то PR подтянет новые коммиты. Поэтому “исправить после PR” обычно означает: сделать дополнительный коммит(ы) в той же ветке и запушить.

Практика: добавить фикс и пушнуть

code
git switch fix/pr-typo
# правим файлы
git add -A
git commit -m "Fix: address review comment"
git push

Когда стоит обновить PR после мёржинга в target

Если PR уже смёрджен, и вы обнаружили проблему после merge — это другой случай: править нужно main (или целевую ветку) уже через новый PR, либо через экстренный патч.

Так или иначе — думайте о состоянии: ваша ветка может быть “приватной”, а целевая — уже опубликована и используется другими.


Сценарий 2: откатить коммит, но не потерять правки

Откат — тема, где новички чаще всего путают “отменить изменения” и “удалить коммиты”. Git различает два принципиально разных подхода:

  1. Откат по истории (history rewrite) — опасно для публичных веток.
  2. Откат через новый коммит (revert) — безопасно и сохраняет историю.

Для новичка и командной разработки почти всегда лучше начать с git revert: он делает “противоположный коммит” и не переписывает историю.

Откатить один коммит через revert

Допустим, у вас в PR оказался плохой коммит abc1234. Его нужно отменить, сохранив историю.

code
git switch main
git pull --ff-only
git revert abc1234
git push

Что происходит:

  • Git применяет патч, который отменяет изменения данного коммита;
  • создаётся новый коммит в main, который “нейтрализует” эффект.

Если коммит был в вашей ветке PR и PR ещё не смёржен

В этом случае обычно проще сделать всё в вашей ветке: отменить влияние через revert или откатить до нужной точки, но аккуратно.

Например, если нужно отменить конкретные изменения и продолжить работу:

code
git switch fix/pr-typo
git revert abc1234
git push

revert серии коммитов

Если проблема — в нескольких коммитах (контур A..B), можно revert’ить диапазон:

code
git switch main
git pull --ff-only
git revert <old_commit>^..<new_commit>
git push

Подводные камни:

  • если коммиты зависят друг от друга, возможны конфликты revert — Git попросит их разрешить;
  • итоговая история будет содержать несколько revert-коммитов, что нормально для воспроизводимости.

Сценарий 3: перенести изменения в новую ветку (когда вы ошиблись веткой)

Классика: вы начали коммитить изменения, но сделали это в неправильной ветке — например, в main или в ветке другого задания. Либо вы поняли, что изменения должны жить в новой ветке.

Здесь важны два состояния рабочего дерева:

  • изменения уже закоммичены;
  • изменения не закоммичены.

Рассмотрим оба.


Вариант A: коммиты уже сделаны в “не той” ветке

Допустим, вы случайно работали в main и сделали 3 коммита. Нужно забрать их в новую ветку feature/new.

Самый надёжный способ — создать новую ветку из текущего состояния и вернуть main в прежний вид (в зависимости от того, было ли это запушено).

Если изменения локальные и не запушены

Сначала создаём новую ветку от текущего состояния:

code
git switch -c feature/new

Дальше возвращаем main к состоянию, как было до этих коммитов. Для этого надо знать “точку до”: обозначим её old — это коммит, который был последним в main до вашей ошибочной работы.

  1. Узнать old:
code
git log --oneline --decorate --graph --max-count=30
  1. Вернуть main назад через reset только если ветка не опубликована:
code
git switch main
git reset --hard old
  1. Пушить только новую ветку (или ничего, если всё локально):
code
git push -u origin feature/new

⚠️ Почему reset --hard здесь допустим только для непубличной истории: если вы уже запушили main, вы рискуете сломать всем остальным синхронизацию. В такой ситуации — лучше сделать новый PR и/или revert вместо переписывания.


Вариант B: коммиты уже запушены (опасно переписывать историю)

Если вы изменили main и запушили, то корректный путь обычно такой:

  • не переписывать main;
  • создать новую ветку и “забрать” нужные изменения через cherry-pick, либо откатить main через revert, чтобы убрать эффект.

1) Создать новую ветку и перенести изменения cherry-pick

Допустим, вы знаете диапазон коммитов c1..c3. Тогда:

code
git switch -c feature/new origin/main
git cherry-pick c1 c2 c3
git push -u origin feature/new

2) Исправить main, если изменения там уже не должны оставаться

Если изменения нежелательны, откатите их через revert (без rewrite):

code
git switch main
git revert <hash1> <hash2> <hash3>
git push

Это сохраняет историю и не ломает остальным их локальные клоны.


Вариант C: изменения не закоммичены

Иногда вы только правили файлы и поняли, что “надо в другую ветку”, не делая коммитов. Тогда решения проще:

  • создать новую ветку,
  • перенести изменения в неё,
  • вернуться и очистить то, что вы не хотели коммитить.

Практический ход:

code
git switch -c feature/new
# Теперь вы в новой ветке с теми же незафиксированными изменениями (Git переносит рабочее состояние)

Если вы уже случайно сделали часть коммитов — вернитесь к вариантам A/B. Если нет — этот способ самый простой.


Важное правило: не используйте reset/rebase вслепую

В Git есть инструменты, которые “выглядят” как откат, но на деле переписывают историю:

  • git reset --hard (особенно после push),
  • интерактивный git rebase,
  • git rebase без понимания, кто “потребляет” эту ветку.

Когда safe (обычно) использовать reset

  • только на локальных ветках;
  • особенно когда вы уверены, что никто другой не тянул эту ветку из удалённого репозитория.

Когда лучше revert

  • когда изменения уже в main/develop и их видят другие;
  • когда вы хотите прозрачный и воспроизводимый “анти-коммит”.

“Исправить после merge”: что делать, если баг нашли слишком поздно

Допустим, ваш PR уже смёрджен в main. После этого вы нашли проблему. Здесь есть два сценария:

  1. Баг можно быстро отменить revert’ом.
  2. Нужно полноценное новое исправление.

Быстрый откат через revert на main

Если баг полностью объясняется одним коммитом или понятной группой:

code
git switch main
git pull --ff-only
git revert <bad_commit_hash>
git push

Если плохих коммитов несколько — revert диапазона.

Полноценное исправление через новый PR

Часто лучше не “ломать” историю отменами, а сделать корректный патч и открыть новый PR:

code
git switch -c fix/after-merge-bug
# правим
git add -A
git commit -m "Fix: address regression"
git push -u origin fix/after-merge-bug
# открываем PR на main

Это даёт ревьюеру ясность: что именно вы изменили и почему.


Типовые подводные камни при работе с ветками и PR

Конфликты при обновлении ветки перед PR

Если в вашей ветке много расхождений с main, merge origin/main может создать конфликты. Это не ошибка Git — это реальность. Вопрос в процессе:

  • разрешайте конфликты осознанно;
  • после разрешения сделайте коммит;
  • убедитесь, что тесты прошли.

Смешивание форматирования и логики

Если в PR пришли и “перепаковка пробелов”, и функциональные изменения, ревьюер будет тратить время на шум. Хорошая практика — разделять коммиты (или хотя бы фокусировать PR).

Опора на git pull без понимания upstream

git pull может вести себя неожиданно в зависимости от настроек. Для дисциплины:

  • используйте git fetch отдельно,
  • затем явно выбирайте стратегию: merge или rebase.

Практические шпаргалки: команды “на каждый день”

Создать ветку и подготовиться к PR

code
git switch main
git pull --ff-only
git switch -c feature/xyz

Обновить ветку через merge (без переписывания)

code
git fetch origin
git merge origin/main
git push

Откатить коммит в публичной ветке

code
git switch main
git pull --ff-only
git revert <hash>
git push

Забрать изменения в новую ветку (если ошиблись веткой)

Если коммиты уже есть:

code
git switch -c feature/new
# или cherry-pick нужных коммитов на новую ветку

Если нужно пересобрать с известной точкой:

code
git switch main
git reset --hard <old>   # только если локально/не опубликовано

Вывод: безопасная дисциплина вместо “магии команд”

Правильная работа с Git на старте — это не знание всех флагов reset и rebase, а дисциплина:

  • Ветки используйте как изоляцию задач, а не как “папки”.
  • PR делайте осознанно, опираясь на актуальную базу.
  • Откатывайте безопасно: revert — когда история публичная; reset/rewrite — только когда вы уверены, что ветка не нужна другим.
  • Если ошиблись веткой — переносите изменения, чаще через новую ветку и cherry-pick, а не через разрушение main.

Если вы хотите системно разобрать и закрепить эти сценарии (включая более продвинутые практики вроде подготовки PR под ревью и аккуратного разрешения конфликтов), полезным следующим шагом может стать курс: https://sudo.teachit.ru/course/. Но даже без него ключ к уверенности — повторять описанные сценарии на своём тестовом репозитории и держать в голове базовую мысль: Git — это управление историей, и ваша задача — делать её предсказуемой для себя и команды.

Войдите, чтобы поставить лайк и оставить комментарий.

Автор

$ sudo teach IT

Продолжите обучение

Все курсы
Python – для начинающих!

Python – для начинающих!

С нуля до профессионального уровня. Подходит для всех. Учитесь каждый день и овладейте самым популярным языком программирования.

Перейти к курсу
Приложения для iPhone и Apple Watch на SwiftUI

Приложения для iPhone и Apple Watch на SwiftUI

Разработка приложений для iPhone и Apple Watch на SwiftUI: навигация, SwiftData, виджеты, часы, выпуск. Нужен Mac с Xcode 27, сами устройства не нужны.

Перейти к курсу
Ботостроение Telegram

Ботостроение Telegram

Лёгкий, быстрый и доступный способ познакомиться с миром ботостроения в Telegram. Видео, конспекты, практика и помощь – всё у нас на курсе.

Перейти к курсу
Приложения для macOS на SwiftUI

Приложения для macOS на SwiftUI

Разработка приложений для Mac на SwiftUI: окна и меню, Liquid Glass, SwiftData, сеть, выпуск. Нужен Mac с macOS 27 и Xcode 27.

Перейти к курсу

Другие статьи

Первые шаги в Linux-правках: права на файлы, umask и безопасное выполнение скриптов
первые

Первые шаги в Linux-правках: права на файлы, umask и безопасное выполнение скриптов

Соберём практическую шпаргалку по правам доступа: rwx, владельцы, группы, umask, chown/chmod/chgrp и безопасные шаблоны для запуска bash-скриптов. Статья поможет избежать типичных ошибок, когда «скрипт не работает из-за прав».

27 июля 2026 г.
580
TypeScript и типобезопасный UI/API: как строить схемы данных без ручного маппинга
typescript

TypeScript и типобезопасный UI/API: как строить схемы данных без ручного маппинга

Поговорим о подходе “types-first” и о том, как уменьшить количество ручных преобразований между слоями. Рассмотрим проверяемые границы: DTO, ответы сервера, формы и нормализацию данных.

25 июля 2026 г.
530
Создание Telegram бота в 2026 легко и просто! Полный курсы!
создание

Создание Telegram бота в 2026 легко и просто! Полный курсы!

19 июня 2026 г.
1421
Как выбрать, куда идти в IT: веб, боты, данные — без хаоса
выбрать

Как выбрать, куда идти в IT: веб, боты, данные — без хаоса

Разберём самые понятные направления для новичка (веб, боты, аналитика/данные) и чем они отличаются по шагам обучения. В конце вы получите простой план, как проверить, что вам подходит, и какой стартовый путь выбрать.

5 октября 2026 г.
580
Путь от README до демо: как собрать портфолио разработчика, чтобы его хотели смотреть
путь

Путь от README до демо: как собрать портфолио разработчика, чтобы его хотели смотреть

Разберём структуру репозитория, как упаковать проект в понятную историю (проблема → решение → запуск → метрики качества) и какие артефакты повышают доверие: скринкасты, архитектурная схема, чек-лист продакшн-готовности.

17 сентября 2026 г.
1070
Как понять, какой язык программирования учить первым: простой тест и выбор
понять

Как понять, какой язык программирования учить первым: простой тест и выбор

Помогу новичку выбрать первый язык без стресса: объясню варианты по целям (веб, боты, анализ данных), что учить в первую очередь и как не потратить месяцы впустую. В конце — краткий план старта на ближайшие недели.

2 октября 2026 г.
620

Комментарии

Станьте первым в обсуждении

Поделитесь мнением о статье или задайте вопрос автору

Содержание

Ментальная модель: ветки как рабочие контуры, а не «папки»Ветка — это указатель на коммитЧем merge отличается от rebase (в контексте новичка)Базовые операции с ветками: как начать и не запутатьсяСоздание ветки под задачуПроверка статуса и состоянияКогда коммиты нужно делать частоPull Request: зачем он нужен и как его “не сломать”PR — это не магия, а контракт измененийСамый безопасный поток действийТипичные ошибки на старте PRБезопасный откат после PR: исправить или признать ошибкуСценарий 1: исправить после PR (и не трогать чужую историю)Важно: PR обновляется автоматически при новых коммитах в вашей веткеКогда стоит обновить PR после мёржинга в targetСценарий 2: откатить коммит, но не потерять правкиОткатить один коммит через revertЕсли коммит был в вашей ветке PR и PR ещё не смёрженrevert серии коммитовСценарий 3: перенести изменения в новую ветку (когда вы ошиблись веткой)Вариант A: коммиты уже сделаны в “не той” веткеВариант B: коммиты уже запушены (опасно переписывать историю)Вариант C: изменения не закоммиченыВажное правило: не используйте reset/rebase вслепуюКогда safe (обычно) использовать resetКогда лучше revert“Исправить после merge”: что делать, если баг нашли слишком поздноБыстрый откат через revert на mainПолноценное исправление через новый PRТиповые подводные камни при работе с ветками и PRКонфликты при обновлении ветки перед PRСмешивание форматирования и логикиОпора на git pull без понимания upstreamПрактические шпаргалки: команды “на каждый день”Создать ветку и подготовиться к PRОбновить ветку через merge (без переписывания)Откатить коммит в публичной веткеЗабрать изменения в новую ветку (если ошиблись веткой)Вывод: безопасная дисциплина вместо “магии команд”