Основные команды терминала Git: локальная и удаленная работа
Основные команды терминала Git: локальная и удаленная работа
Переход от графических интерфейсов (GUI) к интерфейсу командной строки (CLI) — важный шаг в развитии QA-инженера. Графические клиенты удобны для визуализации истории, но терминал дает полный контроль над процессами, позволяет автоматизировать рутинные задачи в CI/CD и является стандартом де-факто на технических собеседованиях. Глубокое понимание консольных команд отличает уверенного инженера от новичка.
Локальный рабочий процесс: три состояния файла
Чтобы уверенно работать в терминале, необходимо понимать архитектуру Git. В отличие от других систем контроля версий, Git оперирует тремя основными локальными зонами:
- Рабочая директория (Working Directory) — файлы на вашем жестком диске, с которыми вы работаете прямо сейчас.
- Индекс (Staging Area) — промежуточная зона, где собираются изменения, подготовленные для следующего сохранения.
- Локальный репозиторий (Local Repository) — скрытая папка
.git, где хранится вся история изменений.
Перемещение файлов между этими зонами осуществляется базовыми командами:
git add <файл>— переносит изменения из рабочей директории в индекс.git commit -m "сообщение"— фиксирует проиндексированные изменения в локальном репозитории, создавая коммит (снимок состояния проекта).
Коммиты должны быть атомарными. Один коммит — одна логическая задача. Это упрощает поиск ошибок и откат изменений в будущем.
Пример из практики 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илиpullGit останавливает процесс и выводит сообщение: CONFLICT (content): Merge conflict in file.txt. - Вы открываете конфликтный файл в текстовом редакторе. Git помечает спорные участки специальными маркерами:
<<<<<<< HEAD
button_color = "red"
=======
button_color = "blue"
>>>>>>> feature-branch
- Ваша задача — удалить маркеры (
<<<<<<<,=======,>>>>>>>) и оставить правильный вариант кода. - После редактирования вы добавляете файл в индекс:
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 снова делит оставшийся отрезок пополам, пока не укажет на конкретный коммит, внесший баг.
Освоение этих команд в терминале не только подготовит вас к каверзным вопросам на собеседованиях, но и значительно ускорит ежедневную работу с тестовыми фреймворками и CI/CD пайплайнами.