Skip to content

Instantly share code, notes, and snippets.

@Qsppl
Last active September 1, 2025 07:27
Show Gist options
  • Select an option

  • Save Qsppl/1922404576e66432aa688b8233f09ddb to your computer and use it in GitHub Desktop.

Select an option

Save Qsppl/1922404576e66432aa688b8233f09ddb to your computer and use it in GitHub Desktop.
Изучение Git

Изучение Git

1. История

Именование комитов

Проект, номер задачи и описание изменений: PROJECT-1234 Добавлена форма регистрации

Слияние

Сохраняем чистую историю:

  • rebase для подтягивания изменений
  • merge для отправки изменений в общую ветку

Из за rebase, нашей веткой никто не сможет пользоваться, поэтому

  • выделяем общую ветку develop на которой делаем только merge
  • и личные feature ветки
  • feature ветки создавать только от develop, но не от других feature

Мелкие изменения можно комитить напрямую в develop без номера задачи

2. Ветки

Локальные ветки — ваши рабочие ветки на компьютере. Remote-tracking (origin/*) — локальные "слепки" удалённых веток, показывающие, что было на сервере при последнем обновлении. Upstream — связь между вашей локальной веткой и remote-tracking, чтобы git push/pull знали, куда работать по умолчанию.

3. Синхронизация

git fetch - только загружает изменения

git pull - загружает и сразу сливает

pull.rebase=true - заставляет Git выполнять git pull как git pull --rebase по умолчанию.

git config pull.rebase true

Причины отказа PUSH:

  1. Non-FF — кто-то уже обновил ветку. Сделай git pull --rebase.
  2. Protected Branch — ветка защищена. Пушить можно только через Merge Request.
  3. CI/CD Failed — пайплайн упал (тесты, линтеры). Почини ошибки.
  4. No Approvals — для мерджа нужны апрувы от команды.
  5. No Permissions — нет прав на запись в репозиторий.

4. Слияния

Fast-forward — это простое перемещение указателя ветки, если история линейна. --no-ff — принудительное создание коммита слияния, чтобы явно сохранить факт ветвления в истории.

Слияние с разрешением конфликтов:

  1. После конфликта слияния исправьте файлы вручную
  2. Добавьте исправленные файлы: git add .
  3. Завершите слияние: git merge --continue
  4. Подтвердите коммит в редакторе

Альтернативы:

  • git merge --abort - отмена слияния
  • git commit - старый аналог continue

Важно: Используйте --continue только после полного разрешения всех конфликтов и добавления файлов.

5. Работа с историей

git commit --amend - исправить последний коммит

Исправляет последний коммит:

git add файл.txt
git commit --amend --no-edit  # добавить изменения
git commit --amend -m "новое сообщение"  # изменить сообщение

git reset - отменить локальные коммиты (еще не push)

  • --soft - отменяет коммит, оставляет изменения в staging
  • --mixed (по умолчанию) - отменяет коммит, оставляет изменения в working dir
  • --hard - опасно! полностью удаляет коммит и изменения
git reset --soft HEAD~1    # отмена с сохранением в staged
git reset HEAD~1           # отмена с сохранением в working dir  
git reset --hard HEAD~1    # полное удаление

git reset <path> - отменить добавление файлов в staged

Убирает файлы из staging (противоположность git add):

git reset файл.txt  # убрать из staged
git reset .         # убрать всё из staged

git revert - безопасно отменить уже опубликованные коммиты

Создает новый коммит, отменяющий изменения указанного коммита:

git revert a1b2c3d        # отменить конкретный коммит
git revert HEAD           # отменить последний коммит
git revert --no-commit a1b2c3d  # отменить без автоматического коммита

git rebase -i - интерактивный rebase

# Просмотр истории
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

Основные команды для rebase -i

# Ребазирование последних N коммитов
git rebase -i HEAD~N

# Ребазирование относительно определенного коммита
git rebase -i <commit-hash>

Ключевые операции в интерактивном режиме

В редакторе вы увидите список коммитов с командами:

  • pick - оставить коммит как есть
  • reword - изменить сообщение коммита
  • edit - изменить сам коммит (изменения)
  • squash - объединить с предыдущим коммитом
  • fixup - объединить и отбросить сообщение
  • drop - удалить коммит

примеры

1. Объединение коммитов
git rebase -i HEAD~3

В редакторе:

pick a1b2c3d Первый коммит
squash e4f5g6h Второй коммит  
squash i7j8k9l Третий коммит
2. Изменение сообщений коммитов
pick a1b2c3d
reword e4f5g6h  # изменится сообщение этого коммита
pick i7j8k9l
3. Перестановка коммитов

Просто измените порядок строк в редакторе.

4. Разделение коммита

Используйте edit для коммита, который хотите разделить:

edit a1b2c3d Большой коммит

После паузы rebase:

git reset HEAD~1
git add -p  # добавить изменения по частям
git commit -m "Первая часть"
git commit -m "Вторая часть"
git rebase --continue

6. Черновики

Основные команды

  • git stash / push — Временно сохранить изменения и очистить рабочую папку.
  • git stash list — Показать список сохранённых "черновиков".
  • git stash apply — Вернуть изменения из stash (не удаляя его).
  • git stash pop — Вернуть и удалить последний stash из списка.
  • git stash drop — Удалить конкретный stash.

Ключевые опции для git stash (что сохранять)

  • -u / --include-untracked — Сохранить + новые файлы (еще не добавленные в git).
  • -a / --all — Сохранить вообще всё (даже файлы из .gitignore).
  • -p / --patchВыбрать какие изменения сохранить, в интерактивном режиме.

git stash branch <имя_ветки>

Создать новую ветку из коммита, где был сделан stash, применить в ней изменения и удалить stash. Идеально, чтобы избежать конфликтов.

7. Тэги

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   # перезапись

1. Lightweight (легкие)

git tag tempbackup

2. Annotated (аннотированные)

  • Полноценный объект Git
  • С метаданными (автор, дата, описание)
  • Создать: git tag -a v1.0 -m "Описание"

Как переставить тег

# Локально
git tag -f v1.0 <новый-коммит>

# Синхронизация с удаленным репозиторием (ОСТОРОЖНО!)
git push --force-with-lease origin v1.0

8. Методология

  • Есть график релизов? → GitFlow.
  • Нужна скорость и частые деплои? → TBD.

🗂️ GitFlow (Для плановых релизов)

Суть: Долгоживущие ветки, строгие правила слияния. Цель: Управление релизами, поддержка нескольких версий.

Ветки:

  • main — стабильный продакшен (только релизы).

  • main -> hotfix/ -> main -> develop

  • develop — код для следующего релиза.

  • develop -> feature/ -> develop

  • develop -> release/ -> main (тег) -> develop


🚀 Trunk-Based (TBD)

Правила:

  1. Одна веткаmain (trunk).
  2. Ветки только короткоживущие (< 1-2 дней).
  3. Мелкие инкрементальные изменения.
  4. Рекомендуются:
    • Мощные автотесты (CI).
    • Feature Flags для скрытия недоделанного кода.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment