Статьи

Небольшой курс по Git — от первых команд до командной работы и выката в прод

Rebase, cherry-pick и теги

Страница 5 из 8 · 2026-10-25 · 3 мин чтения

Rebase

rebase переносит коммиты вашей ветки на новое основание. История получается линейной, без лишних merge-коммитов.

до:    A---B---C  (main)            \             D---E  (feature)после: A---B---C---D'---E'  (feature)
git switch featuregit fetchgit rebase origin/main

Если возник конфликт:

git add файлgit rebase --continuegit rebase --abortgit rebase --skip

После rebase хэши коммитов меняются, поэтому для отправки нужен force:

git push --force-with-lease

Золотое правило: не делайте rebase для коммитов, которыми уже пользуются другие (общие ветки main, develop). Rebase своих личных веток — нормально.

Merge или rebase

mergerebase
Историясохраняет реальный ход работылинейная и чистая
Merge-коммитыестьнет
Безопасность для общих ветокданет
Типичное применениевлить feature в mainобновить feature свежим main

Частая практика: обновляете свою ветку через rebase, а в main вливаете через Pull Request.

Интерактивный rebase

Позволяет почистить локальные коммиты перед PR:

git rebase -i HEAD~4

Откроется список:

pick a1b2c3d Add login formpick b2c3d4e Fix typopick c3d4e5f WIPpick d4e5f6a Add validation

Замените pick на нужные команды:

КомандаДействие
pickоставить как есть
rewordизменить сообщение
squashобъединить с предыдущим, сообщения склеить
fixupобъединить с предыдущим, сообщение выбросить
dropудалить коммит
editостановиться для правки

Пример:

pick a1b2c3d Add login formfixup b2c3d4e Fix typofixup c3d4e5f WIPreword d4e5f6a Add validation

Удобный прием: создать исправление для конкретного коммита и склеить автоматически:

git commit --fixup a1b2c3dgit rebase -i --autosquash origin/main

Cherry-pick

Копирует отдельный коммит в текущую ветку:

git switch release/1.2git cherry-pick a1b2c3dgit cherry-pick a1b2c3d b2c3d4egit cherry-pick a1b2c3d..d4e5f6agit cherry-pick --abort

Типичный случай: исправление ошибки нужно перенести в релизную ветку, не забирая остальные изменения.

Теги

Тег — постоянная метка на коммите, обычно номер релиза.

git taggit tag v1.0.0git tag -a v1.0.0 -m "Первый релиз"git tag -a v0.9.0 a1b2c3d -m "Бета"git show v1.0.0git push origin v1.0.0git push origin --tagsgit tag -d v1.0.0git push origin --delete v1.0.0git switch --detach v1.0.0
  • Аннотированные теги (-a) хранят автора, дату и сообщение. Используйте их для релизов.
  • Теги не уходят на сервер сами, их нужно отправлять явно.

Семантическое версионирование

Формат MAJOR.MINOR.PATCH, например 2.4.1:

  • MAJOR — несовместимые изменения API;
  • MINOR — новая функциональность, обратно совместимая;
  • PATCH — исправления ошибок.

Поиск ошибки: bisect

Нашли баг, но не знаете, какой коммит его внес. Бинарный поиск по истории:

git bisect startgit bisect badgit bisect good v1.0.0

Git переключит вас на средний коммит. Проверьте и сообщите результат:

git bisect goodgit bisect bad

Через несколько шагов Git назовет виновный коммит. Завершение:

git bisect reset

С автоматическим тестом: git bisect run ./test.sh.

Кто и когда изменил строку

git blame файлgit log -S"функция" --onelinegit log -p -- файлgit shortlog -sn
  • git blame — автор и коммит для каждой строки;
  • git log -S"текст" — коммиты, где добавили или убрали эту строку;
  • git shortlog -sn — число коммитов по авторам.

Worktree

Несколько веток в разных папках одновременно, без stash и переключений:

git worktree add ../project-hotfix hotfix/paymentgit worktree listgit worktree remove ../project-hotfix

Подмодули

Подключение чужого репозитория внутрь проекта:

git submodule add git@github.com:user/lib.git libs/libgit clone --recurse-submodules git@github.com:user/project.gitgit submodule update --init --recursive

Подмодули требуют аккуратности, используйте их только когда нет менеджера зависимостей.