Rusau LearnВойти

Инструменты тестировщика

Git и GitHub для тестировщика: основные команды, коммиты и ветки

Git – распределённая система контроля версий, которая хранит всю историю изменений проекта в виде коммитов, позволяет работать в отдельных ветках и вернуться к прежней рабочей версии, если в новой нашли критичную ошибку. На GitHub хранятся удалённые репозитории, и в этой паре Git на компьютере работает клиентом, а GitHub сервером. Тестировщику на старте хватает базовых команд git clone, git status, git add, git commit, git push и git pull, а для веток нужны git branch, git checkout и git merge.

Мой видеоурок: #1 Основы Git для тестировщиков с нуляОткрыть на YouTube
Git и GitHub
на собеседовании просят объяснить, что это такое, и спрашивают основные команды
Git Flow
схема веток, в которой тестировщик обычно проверяет релизную ветку
Бесплатно
урок с заданиями в моём базовом курсе

Что такое Git и GitHub и нужен ли Git тестировщику

Система контроля версий хранит историю всех изменений, которые когда-либо вносили в проект. Коммитом становится любое изменение, будь то новый файл, строка кода или удаление, и на линии развития проекта он выглядит отдельной точкой. Если на свежем коммите нашли критичную ошибку, а на предыдущем всё работало стабильно, проект откатывают к стабильной точке, и переписывать код заново не приходится. Поэтому коммиты лучше делать небольшими: при откате теряется меньше работы.

Git называют распределённой системой, потому что репозиторий со всеми ветками и историей любой участник копирует на свой компьютер и работает с ним локально, даже без интернета. Если с главным репозиторием что-то случится, рабочая версия продукта останется на машинах разработчиков. Устроено это по схеме клиент-сервер. Клиент – Git на вашем компьютере, а сервером служит GitHub или внутреннее хранилище кода компании, через которое команда обменивается изменениями.

Нужен ли Git тестировщику, зависит от компании. Где-то с ним не сталкиваются вовсе, а где-то в репозитории лежат автотесты и тестовая документация. На моём проекте там хранились тест-кейсы: их правили в локальном репозитории и отправляли в общий. Если в вакансии указано знание Git на уровне базовых команд, перед собеседованием их стоит повторить. Обычно просят рассказать, что такое Git и GitHub, а потом спрашивают основные команды и сущности вроде репозитория, коммита и ветки.

  • Репозиторий

    Весь проект с файлами, ветками и историей изменений. Репозиториев бывает несколько, например отдельные для веб-версии, Android и iOS.

  • Коммит

    Сохранённое изменение с автором, датой, сообщением и уникальным хешем. По хешу коммит находят в истории и смотрят, что в нём поменялось.

  • Ветка

    Отдельная линия коммитов. Главная ветка (master или main) хранит эталонный код, а разработчик заводит себе ветку под задачу, чтобы не мешать остальным.

  • Merge и merge request

    Merge – слияние ветки с главной. Перед ним отправляют запрос на слияние (на GitHub он называется pull request), и другой разработчик проводит ревью кода, проверяя, нет ли лишних строк и опечаток.

  • Конфликт

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

  • Клонирование

    Копия удалённого репозитория на своём компьютере. С неё начинается работа с любым проектом, и делается она командой git clone.

Установка, настройка и первый коммит

Git скачивают с официального сайта git-scm.com, там есть версии для Windows, macOS и Linux. Я работаю на Windows и при установке оставляю настройки по умолчанию, в том числе Git Bash и Git GUI. Git Bash – отдельная командная строка, где работают те же команды, что и в терминале Linux, и дальше уроки идут в ней. Её открывают правой кнопкой мыши в папке репозитория. Если после установки команда git выводит список команд, всё встало правильно.

Затем Git сообщают имя и почту. Они попадут в каждый коммит, и по ним видно, кто и когда вносил изменения. В папке пользователя создают файл .gitconfig с разделом [user], где указаны email и name. То же самое делают две команды: git config --global user.name "Artem" и git config --global user.email "artem@example.com". Проверить настройки можно командой git config --list --global.

Удалённый репозиторий заводят на GitHub. После регистрации и подтверждения почты создают новый репозиторий, придумывают название, выбирают публичный или приватный доступ и при желании добавляют файл README с описанием проекта. GitHub покажет ссылку на репозиторий, она понадобится для клонирования. В новых репозиториях GitHub главная ветка называется main, а в моих уроках она называется master. Команды от этого не меняются, подставляется только имя ветки.

Первый коммит в уроке проходит такие шаги.

  • 1. Клонировать репозиторий

    Перейти командой cd в папку для проекта, выполнить git clone со ссылкой из GitHub, затем cd test, чтобы оказаться внутри репозитория.

  • 2. Создать файл

    Создать file1.txt и выполнить git status. Файл попадёт в раздел Untracked files: он лежит в папке, но Git его пока не отслеживает.

  • 3. Добавить в индекс

    git add file1.txt говорит Git, что файл нужно отслеживать. В git status он теперь числится как new file и готов к коммиту.

  • 4. Изменить ещё раз

    Если после git add дописать в файл строку, git status покажет его дважды: как new file со старой версией и как modified с новой. Повторный git add берёт в коммит свежую версию.

  • 5. Сделать коммит

    git commit -m "test commit one" сохраняет изменения в локальном репозитории. Сообщение после -m коротко описывает, что изменилось, чтобы следующему человеку было понятно.

  • 6. Отправить на сервер

    git push отправляет коммит в удалённый репозиторий. В первый раз откроется окно входа в GitHub, после чего файл появится на странице репозитория.

Базовые команды Git: история и синхронизация

Изменения приходят и с другой стороны: коллега отправил коммит, или файл поправили прямо на странице GitHub. Локальный репозиторий сам об этом не узнает, и git status скажет, что всё в порядке. Команда git fetch скачивает сведения о новых коммитах, и после неё git status сообщит, что ветка отстаёт от origin/master. Сами файлы обновляет git pull, который забирает изменения и вливает их в текущую ветку.

В именах веток легко запутаться. master – локальная рабочая ветка. Запись origin master через пробел означает ветку master в удалённом репозитории origin, так её пишут в командах вроде git push origin master. Запись origin/master через косую черту обозначает локальную копию того, что было на сервере при последнем git fetch.

Историю удобно смотреть и в графическом виде. Команда gitk & открывает дерево коммитов по веткам с авторами и временем. В окне, которое открывает git gui &, те же действия делают кнопками. Rescan показывает изменения, их добавляют к коммиту, пишут сообщение и нажимают Commit, а затем Push. Знак & оставляет командную строку свободной. Сам я работаю в Git Bash, а графический вид советую тем, у кого много веток и кому нужно видеть изменения глазами.

Перед регрессом релиза приложения доставки тестировщик смотрит, что в нём нового. Команда git log --oneline master..release/2.4 выводит по строке на каждый коммит релизной ветки, которого ещё нет в master, например "Расчёт стоимости доставки" и "Экран корзины", и регресс начинают с этих мест. git show с хешем коммита покажет, какие файлы в нём правили.

  • git status

    Состояние файлов (untracked, new file, modified) и то, отстаёт ли ветка от удалённой. С неё удобно начинать любое действие.

  • git log

    История коммитов: хеш, автор, дата и сообщение. git log --author="Artem" оставит коммиты одного автора. Выйти из просмотра можно клавишей q.

  • git show

    git show с хешем коммита покажет, какие файлы и строки в нём изменились: добавленные отмечены плюсом, удалённые минусом. Без хеша выводится последний коммит. Хеш копируют правой кнопкой мыши, потому что Ctrl+C в терминале прерывает команду.

  • git blame

    git blame file1.txt показывает, кто и когда менял каждую строку файла. С grep, например git blame file1.txt | grep Artem, остаются строки одного автора. Так находят, к кому обратиться при конфликте.

  • git diff

    Изменения в файлах, которые ещё не добавлены через git add: какие строки дописали и какие удалили.

  • echo и cat

    Команды Linux, которые работают в Git Bash. echo "new line" >> file1.txt дописывает строку в конец файла, а cat file1.txt выводит его содержимое.

Как отменить изменения и решить конфликт

Способ отмены зависит от того, докуда дошло изменение: осталось в файле, попало в коммит или ушло на сервер. Отправленный коммит в общей ветке через reset не отменяют, потому что переписанная история разойдётся с копиями коллег. Для этого есть git revert, он создаёт новый коммит, обратный старому.

В уроках разобраны конфликты двух видов. В первом на сервере есть коммиты, которых нет у вас, например кто-то добавил файл через GitHub. Тогда git push отвечает ошибкой, и помогает простой порядок: сначала git pull, потом снова git push. В свежих версиях Git, если способ слияния не настроен, git pull в такой ситуации останавливается с ошибкой Need to specify how to reconcile divergent branches. Тогда один раз выполняют git config --global pull.rebase false, и pull сливает изменения, как в уроке.

Во втором одну и ту же строку изменили и на сервере, и у вас. git pull сообщит о конфликте, а git status покажет файл как both modified. Git сам размечает спорное место. Между <<<<<<< HEAD и ======= стоит ваша версия, а между ======= и >>>>>>> с хешем коммита – пришедшая с сервера. Нужные строки оставляют, метки удаляют, файл сохраняют и выполняют git add, git commit и git push. Если непонятно, чья версия верна, git merge --abort отменит слияние, а решать конфликт лучше вместе с разработчиком.

  • git checkout file1.txt

    Отменяет правки в файле, которые ещё не попали в коммит, а git checkout . откатывает все файлы сразу. В новых версиях Git то же самое делает git restore.

  • git reset HEAD~1

    Отменяет последний коммит, но его изменения остаются в файлах. HEAD~1 означает один шаг назад от текущего коммита.

  • git reset --hard HEAD~1

    Отменяет коммит вместе с изменениями в файлах. Сам коммит ещё можно найти через git reflog и вернуть, а незакоммиченные правки пропадут насовсем, поэтому перед командой стоит заглянуть в git status.

  • git stash

    Прячет незакоммиченные изменения во временное хранилище. git stash pop возвращает их, git stash list показывает, что там лежит, а git stash clear очищает хранилище навсегда. Пример: тестировщик дописывает автотест корзины, и его просят срочно проверить hotfix. git stash прячет недописанный тест, а после проверки ветки исправления git stash pop возвращает его на место.

  • git merge --abort

    Отменяет слияние, на котором случился конфликт, и возвращает файлы в состояние до него.

Ветки, слияние и Git Flow

Ветку заводят, чтобы поработать над задачей и не мешать основной. Новая ветка начинается с последнего коммита текущей, а когда работа закончена, её сливают обратно, и коммиты ветки появляются в главной.

В командах ветки обычно раскладывают по схеме Git Flow, хотя детали в каждой компании свои. В master лежит рабочая версия продукта, та, что сейчас в продакшене. Разработка идёт в develop, а под каждую задачу разработчик заводит feature-ветку и потом вливает её обратно в develop. Когда в develop всё работает стабильно, от неё создают релизную ветку. Тестировщики обычно проверяют именно её: новых функций там не пишут, только исправляют найденные баги. Если критичных дефектов не осталось, релизную ветку сливают в master и develop, и слияние в master становится релизом. Для срочного исправления бага с продакшена есть hotfix-ветка.

Иногда разработчик просит проверить задачу до слияния в develop, например промокоды в интернет-магазине. Тестировщик выполняет git fetch и git checkout feature/promo-codes, и Git создаёт локальную ветку, связанную с удалённой. Приложение запускают из этой ветки и проверяют скидку, истёкший промокод и повторное применение, а найденные баги правят в той же ветке, и в develop они не попадают.

Ниже команды для работы с ветками по шагам.

  • Создать и перейти

    git branch first-branch создаёт ветку, а git branch без имени выводит список, где текущая отмечена звёздочкой. git checkout first-branch переключает на неё, git checkout -b first-branch создаёт и переключает одной командой.

  • Первый push ветки

    Обычный git push ответит ошибкой о том, что у ветки нет upstream, то есть пары на сервере. git push -u origin first-branch создаёт ветку в удалённом репозитории и связывает её с локальной.

  • Слить в главную

    git checkout - возвращает в предыдущую ветку, здесь это master. git merge first-branch вливает изменения, а git push отправляет их на сервер. Если master за это время не менялась, слияние идёт как fast-forward, и история остаётся линейной.

  • Конфликт при слиянии

    Если master успела измениться на сервере, git push после слияния откажет. Помогает git pull, а если в обеих версиях менялась одна строка, файл правят вручную, как при любом конфликте.

  • Переименовать

    git branch -m old-name new-name. Если ветка уже на сервере, старое имя удаляют командой git push origin :old-name и отправляют новое через git push -u origin new-name.

  • Удалить и вернуть

    git branch -d second-branch удаляет слитую локальную ветку, git branch -D удаляет любую. На сервере ветка остаётся, и её возвращают командами git fetch origin second-branch и git checkout second-branch.

Видеоуроки, шпаргалки и задания

Я разбираю Git в мини-курсе из шести уроков на YouTube, от теории и установки до веток, Git GUI, gitk и Git Flow. В 2022 году уроки вышли одним роликом, полным курсом по GitHub для тестировщика. В бесплатном базовом курсе по тестированию тема открывается уроком "Что такое git и github?", и после теории в нём есть задания. Дальше в модуле идут уроки об установке, базовых командах, git commit, reset, checkout и stash, работе с ветками и Git Flow, а завершает его урок "Создание портфолио".

Шпаргалка по Git – справочник с поиском по командам: как посмотреть, что изменил разработчик, забрать нужную ветку, разрешить конфликт и откатить свою ошибку. Шпаргалка по моделям ветвления показывает Git Flow кликабельной схемой и сравнивает его с более лёгкими моделями. В тренажёре по Git отрабатывают команды, ветки и действия после ошибки.

Курсы по теме

Вопросы и ответы

Что такое Git простыми словами?

Система контроля версий, которая хранит всю историю изменений проекта. Каждое изменение сохраняется коммитом с автором, датой и описанием, поэтому к любой прежней версии можно вернуться. Работу ведут в отдельных ветках и потом сливают их с главной.

Чем Git отличается от GitHub?

Git – программа на компьютере, которая ведёт историю изменений локально. На GitHub хранятся удалённые репозитории, и через него команда обменивается кодом. Git выступает клиентом, GitHub сервером, а вместо GitHub бывает и внутренний сервер компании.

Нужен ли Git тестировщику?

Зависит от компании. Где-то тестировщик с ним не сталкивается, а где-то хранит в репозитории автотесты и тестовую документацию. Если в вакансии указано знание Git, перед собеседованием стоит повторить базовые команды и сущности: репозиторий, коммит, ветку.

Какие команды Git нужно знать тестировщику?

git clone, git status, git add, git commit, git push, git fetch, git pull и git log, а для веток git branch, git checkout и git merge. Отменять изменения помогают git checkout с именем файла, git reset и git stash.

Чем git fetch отличается от git pull?

git fetch только скачивает сведения о новых коммитах на сервере и не трогает рабочую ветку. git pull скачивает их и сразу вливает в текущую ветку. После git fetch команда git status покажет, на сколько коммитов ветка отстаёт от удалённой.

Как решить конфликт в Git?

Открыть файл, найти участок между метками <<<<<<<, ======= и >>>>>>>, оставить нужные строки и удалить метки, затем выполнить git add, git commit и git push. Если непонятно, чья версия верна, git merge --abort отменяет слияние, и решение лучше принять вместе с разработчиком.

Посмотреть программы курсов

Программа каждого курса открыта целиком: видны все модули, уроки и число шагов.

Все курсы

Здесь используются cookies: без них сайт не работает, и по ним видно, откуда о платформе узнают.Cookies нужны для входа и учёта переходов. Подробнее