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
| merge | rebase | |
|---|---|---|
| История | сохраняет реальный ход работы | линейная и чистая |
| 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/mainCherry-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.0Git переключит вас на средний коммит. Проверьте и сообщите результат:
git bisect goodgit bisect badЧерез несколько шагов Git назовет виновный коммит. Завершение:
git bisect resetС автоматическим тестом: git bisect run ./test.sh.
Кто и когда изменил строку
git blame файлgit log -S"функция" --onelinegit log -p -- файлgit shortlog -sngit 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Подмодули требуют аккуратности, используйте их только когда нет менеджера зависимостей.
