Git — распределённая система контроля версий, стандарт де-факто в разработке ПО. Для QA-инженера Git необходим для работы с тестовой документацией, автотестами, баг-репортами в репозитории, а также для понимания процесса разработки и код-ревью.
1. Зачем тестировщику Git
Задача
Описание
Хранение автотестов
Тестовые скрипты живут в репозитории вместе с кодом
On branch main
Changes not staged for commit: # Изменённые, но не staged
modified: file1.txt
Changes to be committed: # Staged, готовы к коммиту
new file: file2.txt
Untracked files: # Новые файлы, не отслеживаются
file3.txt
# Получить и слить изменения
git pull
# Получить без слияния (только fetch)
git fetch
# Получить из конкретной ветки
git pull origin develop
Разница между fetch и pull
Команда
Что делает
git fetch
Скачивает изменения, но НЕ сливает с локальной веткой
git pull
Скачивает И сливает (git fetch + git merge)
6. Ветвление (Branching)
Зачем нужны ветки
Каждая задача — в отдельной ветке
Основная ветка (main/master) всегда стабильна
Параллельная работа нескольких людей
Эксперименты без риска сломать основной код
Основные команды
# Список веток (локальных)
git branch
# Список всех веток (включая удалённые)
git branch -a
# Создать новую ветку
git branch feature/login-test
# Переключиться на ветку
git checkout feature/login-test
# Создать и переключиться (одна команда)
git checkout -b feature/login-test
# Современный синтаксис (Git 2.23+)
git switch feature/login-test
git switch -c feature/login-test # создать и переключиться
# Переименовать ветку
git branch -m old-name new-name
# Удалить ветку (локальную)
git branch -d feature/login-test # безопасное удаление
git branch -D feature/login-test # принудительное удаление
# Удалить удалённую ветку
git push origin --delete feature/login-test
Стратегия именования веток
Префикс
Назначение
Пример
feature/
Новый функционал
feature/login-form
fix/
Исправление бага
fix/email-validation
test/
Тестовые задачи
test/api-integration
hotfix/
Срочное исправление
hotfix/security-patch
docs/
Документация
docs/update-readme
7. Слияние (Merge)
# Переключиться на целевую ветку
git checkout main
# Слить изменения из feature-ветки
git merge feature/login-test
# Слить с созданием коммита слияния (без fast-forward)
git merge --no-ff feature/login-test
Типы слияния
Тип
Описание
Когда
Fast-forward
Просто перемещение указателя
Когда main не изменился с момента создания ветки
Recursive (3-way merge)
Создаётся коммит слияния
Когда обе ветки имеют новые коммиты
Rebase — альтернатива merge
# Перебазирование: ваши коммиты поверх актуального main
git checkout feature/login-test
git rebase main
# ⚠️ НЕ делать rebase общих веток (main, develop)!
Merge
Rebase
История
Сохраняет ветвление
Линейная история
Коммиты
Коммит слияния
Без доп. коммитов
Безопасность
Безопасен
⚠️ Опасен для общих веток
8. Разрешение конфликтов
Конфликт возникает, когда два человека изменили одну и ту же строку в одном файле.
Как выглядит конфликт
<<<<<<< HEAD
Строка из текущей ветки (main)
=======
Строка из вливаемой ветки (feature)
>>>>>>> feature/login-test
Пошаговое разрешение
# 1. Увидеть конфликты
git status
# Показывает: both modified: file.txt
# 2. Открыть файл и найти маркеры конфликта
# <<<<<<< HEAD
# =======
# >>>>>>> branch-name
# 3. Редактировать файл вручную:
# - Удалить маркеры (<<<<<<, =======, >>>>>>)
# - Оставить нужную версию или объединить обе
# 4. Добавить исправленный файл в индекс
git add file.txt
# 5. Завершить слияние
git commit
# Git предложит автоматическое сообщение, можно изменить
Инструменты для разрешения конфликтов
# Встроенные инструменты
git mergetool
# VS Code — показывает 3 панели: текущая | результат | входящая
# Позволяет принимать изменения кнопками «Current» / «Incoming» / «Both»
# Просмотр изменений
git diff # Рабочая директория vs индекс
git diff --staged # Индекс vs последний коммит
git diff branch1..branch2 # Разница между ветками
9. Просмотр истории
# Журнал коммитов
git log
# Компактный вид
git log --oneline
# С графом ветвления
git log --oneline --graph --all
# С изменениями файлов
git log --stat
# С diff
git log -p
# История конкретного файла
git log --follow -p -- file.txt
# Поиск по сообщению коммита
git log --grep="bug"
# Поиск по автору
git log --author="Иван"
# Коммиты за период
git log --since="2024-01-01" --until="2024-06-01"
Просмотр изменений
# Что изменено, но не staged
git diff
# Что staged, но не закоммичено
git diff --staged
# Разница с удалённой веткой
git diff origin/main
# Показать конкретный коммит
git show abc1234
10. Отмена изменений
# Отменить изменения в рабочей директории (⚠️ безвозвратно!)
git checkout -- file.txt
# Или современный синтаксис:
git restore file.txt
# Убрать файл из индекса (отменить git add)
git reset HEAD file.txt
# Или современный синтаксис:
git restore --staged file.txt
# Отменить последний коммит (сохранить изменения в рабочей директории)
git reset --soft HEAD~1
# Отменить последний коммит (сохранить изменения в staging)
git reset --mixed HEAD~1
# Отменить последний коммит (⚠️ безвозвратно удалить изменения)
git reset --hard HEAD~1
# Безопасная отмена коммита (создаёт новый «обратный» коммит)
git revert abc1234
Команда
Рабочая директория
Индекс (staging)
История
git restore file
❌ Сброс
—
—
git restore --staged file
—
❌ Сброс
—
git reset --soft HEAD~1
✅ Сохранено
✅ Сохранено
❌ Удалён
git reset --mixed HEAD~1
✅ Сохранено
❌ Сброс
❌ Удалён
git reset --hard HEAD~1
❌ Сброс
❌ Сброс
❌ Удалён
git revert abc123
✅ Изменён
✅ Изменён
✅ Новый коммит
11. .gitignore
Файл .gitignore указывает Git, какие файлы игнорировать.
# Закомментировано
# Примеры типичных игнорируемых файлов:
# ОС
.DS_Store
Thumbs.db
*.swp
# IDE
.idea/
.vscode/
*.iml
# Зависимости
node_modules/
vendor/
__pycache__/
*.pyc
# Секреты (⚠️ НИКОГДА не коммитить!)
.env
*.pem
credentials.json
# Отчёты и артефакты
*.log
allure-results/
target/
build/
dist/
# Персональные настройки
*.local
config.local.yaml
12. Полезные команды-шпаргалки
Задача
Команда
Клонировать репозиторий
git clone <url>
Посмотреть статус
git status
Добавить файлы
git add .
Закоммитить
git commit -m "сообщение"
Отправить на сервер
git push
Получить изменения
git pull
Создать ветку
git switch -c branch-name
Слить ветку
git merge branch-name
Посмотреть историю
git log --oneline --graph
Отменить изменения файла
git restore file
Отменить последний коммит
git reset --soft HEAD~1
Посмотреть diff
git diff
Список веток
git branch -a
Переключиться на ветку
git switch branch-name
Стэш (временно убрать изменения)
git stash / git stash pop
13. Git stash — временная полка
# Сохранить текущие изменения «на полку»
git stash
# Сохранить с описанием
git stash save "WIP: тесты для логина"
# Посмотреть список стэшей
git stash list
# Применить последний стэш (и оставить в списке)
git stash apply
# Применить последний стэш (и удалить из списка)
git stash pop
# Применить конкретный стэш
git stash apply stash@{2}
# Удалить стэш
git stash drop stash@{0}
# Очистить все стэши
git stash clear
Итоги
Операция
Команда
Получить код
git clone
Сохранить изменения
git add → git commit
Отправить
git push
Получить обновления
git pull
Работать в ветке
git switch -c / git switch
Объединить
git merge
Посмотреть историю
git log
Отменить
git restore / git reset / git revert
Базовое владение Git — обязательный навык для современного QA-инженера. Освоение этих команд покрывает 90% повседневных задач.