Проект, номер задачи и описание изменений: PROJECT-1234 Добавлена форма регистрации
Сохраняем чистую историю:
- rebase для подтягивания изменений
- merge для отправки изменений в общую ветку
Из за rebase, нашей веткой никто не сможет пользоваться, поэтому
- выделяем общую ветку
developна которой делаем только merge - и личные
featureветки - feature ветки создавать только от develop, но не от других feature
Мелкие изменения можно комитить напрямую в develop без номера задачи
Локальные ветки — ваши рабочие ветки на компьютере. Remote-tracking (origin/*) — локальные "слепки" удалённых веток, показывающие, что было на сервере при последнем обновлении. Upstream — связь между вашей локальной веткой и remote-tracking, чтобы git push/pull знали, куда работать по умолчанию.
git fetch - только загружает изменения
git pull - загружает и сразу сливает
pull.rebase=true - заставляет Git выполнять git pull как git pull --rebase по умолчанию.
git config pull.rebase trueПричины отказа PUSH:
- Non-FF — кто-то уже обновил ветку. Сделай
git pull --rebase. - Protected Branch — ветка защищена. Пушить можно только через Merge Request.
- CI/CD Failed — пайплайн упал (тесты, линтеры). Почини ошибки.
- No Approvals — для мерджа нужны апрувы от команды.
- No Permissions — нет прав на запись в репозиторий.
Fast-forward — это простое перемещение указателя ветки, если история линейна.
--no-ff — принудительное создание коммита слияния, чтобы явно сохранить факт ветвления в истории.
Слияние с разрешением конфликтов:
- После конфликта слияния исправьте файлы вручную
- Добавьте исправленные файлы:
git add . - Завершите слияние:
git merge --continue - Подтвердите коммит в редакторе
Альтернативы:
git merge --abort- отмена слиянияgit commit- старый аналог continue
Важно: Используйте --continue только после полного разрешения всех конфликтов и добавления файлов.
Исправляет последний коммит:
git add файл.txt
git commit --amend --no-edit # добавить изменения
git commit --amend -m "новое сообщение" # изменить сообщение--soft- отменяет коммит, оставляет изменения в staging--mixed(по умолчанию) - отменяет коммит, оставляет изменения в working dir--hard- опасно! полностью удаляет коммит и изменения
git reset --soft HEAD~1 # отмена с сохранением в staged
git reset HEAD~1 # отмена с сохранением в working dir
git reset --hard HEAD~1 # полное удалениеУбирает файлы из staging (противоположность git add):
git reset файл.txt # убрать из staged
git reset . # убрать всё из stagedСоздает новый коммит, отменяющий изменения указанного коммита:
git revert a1b2c3d # отменить конкретный коммит
git revert HEAD # отменить последний коммит
git revert --no-commit a1b2c3d # отменить без автоматического коммита# Просмотр истории
git log --oneline -5
# Начинаем rebase
git rebase -i HEAD~5
# В редакторе:
pick a1b2c3d feat: add user authentication
squash d4e5f6g fix: typo in login form
reword g7h8i9j update readme
pick j1k2l3m chore: cleanup comments
squash m4n5o6p test: add login tests
# После сохранения редактируем сообщения коммитов
# При необходимости force push
git push --force-with-lease# Ребазирование последних N коммитов
git rebase -i HEAD~N
# Ребазирование относительно определенного коммита
git rebase -i <commit-hash>В редакторе вы увидите список коммитов с командами:
- pick - оставить коммит как есть
- reword - изменить сообщение коммита
- edit - изменить сам коммит (изменения)
- squash - объединить с предыдущим коммитом
- fixup - объединить и отбросить сообщение
- drop - удалить коммит
git rebase -i HEAD~3В редакторе:
pick a1b2c3d Первый коммит
squash e4f5g6h Второй коммит
squash i7j8k9l Третий коммитpick a1b2c3d
reword e4f5g6h # изменится сообщение этого коммита
pick i7j8k9lПросто измените порядок строк в редакторе.
Используйте edit для коммита, который хотите разделить:
edit a1b2c3d Большой коммитПосле паузы rebase:
git reset HEAD~1
git add -p # добавить изменения по частям
git commit -m "Первая часть"
git commit -m "Вторая часть"
git rebase --continuegit stash/push— Временно сохранить изменения и очистить рабочую папку.git stash list— Показать список сохранённых "черновиков".git stash apply— Вернуть изменения из stash (не удаляя его).git stash pop— Вернуть и удалить последний stash из списка.git stash drop— Удалить конкретный stash.
-u/--include-untracked— Сохранить + новые файлы (еще не добавленные в git).-a/--all— Сохранить вообще всё (даже файлы из.gitignore).-p/--patch— Выбрать какие изменения сохранить, в интерактивном режиме.
Создать новую ветку из коммита, где был сделан stash, применить в ней изменения и удалить stash. Идеально, чтобы избежать конфликтов.
git fetch --tags # актуализировать
git tag -l # список тегов
git show v1.0 # информация о теге
git push origin :v1.0.0 # удалить тег на удаленке
git tag -f v1.0.0 <новый-коммит> # создать тэг
git push origin v1.0.0 # отправить один тег
git push --tags # отправить все теги
git push -f origin v1.0.0 # перезаписьgit tag tempbackup
- Полноценный объект Git
- С метаданными (автор, дата, описание)
- Создать:
git tag -a v1.0 -m "Описание"
# Локально
git tag -f v1.0 <новый-коммит>
# Синхронизация с удаленным репозиторием (ОСТОРОЖНО!)
git push --force-with-lease origin v1.0- Есть график релизов? → GitFlow.
- Нужна скорость и частые деплои? → TBD.
Суть: Долгоживущие ветки, строгие правила слияния. Цель: Управление релизами, поддержка нескольких версий.
Ветки:
-
main— стабильный продакшен (только релизы). -
main->hotfix/->main->develop -
develop— код для следующего релиза. -
develop->feature/->develop -
develop->release/->main(тег) ->develop
Правила:
- Одна ветка —
main(trunk). - Ветки только короткоживущие (< 1-2 дней).
- Мелкие инкрементальные изменения.
- Рекомендуются:
- Мощные автотесты (CI).
- Feature Flags для скрытия недоделанного кода.