1. Основные команды терминала Git: локальная и удаленная работа
Основные команды терминала Git: локальная и удаленная работа
Переход от графических интерфейсов (GUI) к интерфейсу командной строки (CLI) — важный шаг в развитии QA-инженера. Графические клиенты удобны для визуализации истории, но терминал дает полный контроль над процессами, позволяет автоматизировать рутинные задачи в CI/CD и является стандартом де-факто на технических собеседованиях. Глубокое понимание консольных команд отличает уверенного инженера от новичка.
Локальный рабочий процесс: три состояния файла
Чтобы уверенно работать в терминале, необходимо понимать архитектуру Git. В отличие от других систем контроля версий, Git оперирует тремя основными локальными зонами:
.git, где хранится вся история изменений.Перемещение файлов между этими зонами осуществляется базовыми командами:
* git add <файл> — переносит изменения из рабочей директории в индекс.
* git commit -m "сообщение" — фиксирует проиндексированные изменения в локальном репозитории, создавая коммит (снимок состояния проекта).
> Коммиты должны быть атомарными. Один коммит — одна логическая задача. Это упрощает поиск ошибок и откат изменений в будущем. > > Линус Торвальдс, создатель Git
Пример из практики QA: вы написали два новых автотеста в файлах login_test.py и payment_test.py. Если вы используете команду git add . (добавить всё), оба файла попадут в один коммит. Правильнее будет разделить их: сначала выполнить git add login_test.py и закоммитить с сообщением о логине, а затем повторить процесс для тестов оплаты.
Синхронизация с удаленным репозиторием
Локальный репозиторий изолирован. Для совместной работы используются удаленные репозитории (Remote), такие как GitHub или GitLab.
Связь локального репозитория с удаленным проверяется командой git remote -v. По умолчанию удаленный репозиторий получает имя origin.
Для обмена данными применяются три ключевые команды:
* git fetch — безопасно скачивает метаданные и историю из удаленного репозитория, но не изменяет ваши локальные файлы. Это команда для разведки: она позволяет узнать, что сделали коллеги, прежде чем сливать их код со своим.
* git pull — скачивает изменения и сразу пытается объединить (слить) их с вашей текущей веткой. Фактически это комбинация git fetch и git merge.
* git push — отправляет ваши локальные коммиты в удаленный репозиторий.
На собеседованиях часто спрашивают разницу между fetch и pull. Правильный ответ: fetch только обновляет информацию о состоянии удаленного сервера, оставляя рабочую директорию нетронутой, тогда как pull принудительно модифицирует ваши текущие файлы.
Ветвление: Merge против Rebase
Ветки (Branches) позволяют вести параллельную разработку. Создание новой ветки и переключение на нее выполняется командой git checkout -b <имя_ветки> (в новых версиях Git рекомендуется использовать git switch -c <имя_ветки>).
Когда задача завершена, ветку нужно интегрировать в основную (обычно main или master). Для этого существуют два принципиально разных подхода.
Слияние (Merge)
Команда git merge <имя_ветки> берет историю двух веток и создает новый, объединяющий коммит (merge commit).
Плюсы: сохраняет полную, нетронутую историю того, как развивался проект. Минусы: при активной командной работе история превращается в запутанную сеть из линий слияния.
Перебазирование (Rebase)
Команда git rebase <имя_ветки> работает иначе. Она берет ваши локальные коммиты, временно откладывает их, обновляет вашу ветку до состояния целевой, а затем применяет ваши коммиты поверх нее один за другим.
| Характеристика | git merge | git rebase |
| :--- | :--- | :--- |
| История | Сохраняет хронологию и ветвления | Создает линейную, плоскую историю |
| Новые коммиты | Создает один merge-коммит | Перезаписывает хэши переносимых коммитов |
| Безопасность | Абсолютно безопасно | Опасно для публичных веток |
Золотое правило Git: никогда не используйте rebase для веток, которые уже отправлены в публичный репозиторий и с которыми работают другие люди. Перезапись истории приведет к рассинхронизации у всей команды.
Алгоритм разрешения конфликтов слияния
Конфликт возникает, когда два человека изменили одну и ту же строку в файле, и Git не знает, чью версию оставить. В терминале процесс разрешения конфликта выглядит так:
merge или pull Git останавливает процесс и выводит сообщение: CONFLICT (content): Merge conflict in file.txt.<<<<<<<, =======, >>>>>>>) и оставить правильный вариант кода.git add file.txt.git commit.Просмотр истории и безопасная отмена действий
Для анализа истории используется команда git log. Полезный флаг --oneline выводит каждый коммит в одну строку (хэш и сообщение), что идеально для быстрого поиска.
Если вы допустили ошибку, Git предлагает два пути ее исправления:
Безопасный откат: git revert
Команда git revert <хэш_коммита> создает новый коммит, который делает действия, прямо противоположные указанному коммиту. Если в старом коммите вы добавили строку, revert ее удалит. Это самый безопасный способ отмены изменений, так как старая история не удаляется.
Опасный откат: git reset
Команда git reset перемещает указатель ветки (HEAD) на более старый коммит, стирая историю после него. На собеседованиях обязательно спросят про три режима работы этой команды:
* --soft: перемещает HEAD, но оставляет все изменения в индексе (Staging Area). Удобно, если вы хотите переписать сообщение коммита.
* --mixed (по умолчанию): перемещает HEAD и сбрасывает индекс, но оставляет изменения в рабочей директории. Файлы остаются измененными, но их нужно заново добавлять через git add.
* --hard: полностью уничтожает изменения. Рабочая директория возвращается к состоянию старого коммита. Восстановить удаленные таким образом файлы крайне сложно.
Продвинутые инструменты QA-инженера
Для тестировщиков существуют две команды, которые превращают терминал в мощный инструмент локализации багов.
Точечный перенос: git cherry-pick
Представьте ситуацию: разработчик исправил критический баг в ветке main, но релиз собирается из ветки release-1.0. Вам не нужны все новые функции из main, нужен только один конкретный фикс.
Команда git cherry-pick <хэш_коммита> берет изменения из одного конкретного коммита и применяет их к вашей текущей ветке. Это позволяет "выдергивать" нужные исправления или автотесты без полного слияния веток.
Поиск бага: git bisect
Это ультимативный инструмент для поиска коммита, который сломал проект. git bisect использует алгоритм бинарного поиска.
Сложность бинарного поиска составляет , где — количество коммитов. Это значит, что алгоритм на каждом шаге делит количество подозреваемых коммитов пополам. Если у вас есть 1000 коммитов между рабочей и сломанной версией, так как , вам потребуется максимум 10 проверок, чтобы найти виновника.
Процесс работы:
git bisect start — запуск режима.git bisect bad — отмечаем текущий сломанный коммит.git bisect good <хэш_старого_рабочего_коммита> — указываем коммит, где всё точно работало.После этого Git автоматически переключит вас на коммит ровно посередине между хорошим и плохим. Вы запускаете тесты. Если они падают, пишете git bisect bad. Если проходят — git bisect good. Git снова делит оставшийся отрезок пополам, пока не укажет на конкретный коммит, внесший баг.
!Интерактивная визуализация git bisect
Освоение этих команд в терминале не только подготовит вас к каверзным вопросам на собеседованиях, но и значительно ускорит ежедневную работу с тестовыми фреймворками и CI/CD пайплайнами.