Git: установка, основные команды, работа с ветками и их объединением, удаленные репозитории проектирования

В конце статьи есть тест с ответами для самопроверки!
Git: основные команды, работа с ветками и их объединением, удаленные репозитории проектирования

Введение в Git

Что такое Git?

Git — это бесплатная, открытая и распределенная система управления версиями, позволяющая эффективно управлять исходным кодом в процессе разработки программного обеспечения. Git был разработан Линусом Торвальдсом для управления исходным кодом ядра Linux в 2005 году, несмотря на это, Git стал стандартом de facto для управления версиями в индустрии разработки ПО и сегодня он используется во множестве проектов различных масштабов.

Git позволяет разработчикам сохранять снимки (коммиты) проекта на протяжении его развития, отслеживать изменения, возвращаться к предыдущим версиям, ветвить и сливать различные линии разработки, а также сотрудничать с другими разработчиками.

Установка Git

Windows

  1. Скачайте установочный файл с официального сайта git-scm.com.

  2. Запустите установщик и следуйте инструкциям на экране.

  3. После установки откройте Git Bash (терминал для работы с Git в Windows) для начала работы.

macOS

Git обычно уже предустановлен на macOS. Чтобы проверить его наличие и версию, откройте терминал и введите git --version. Если Git не установлен, его можно установить через Homebrew:

brew install git 

Linux (Debian/Ubuntu)

В терминале выполните:

sudo apt-get update
sudo apt-get install git 

Начало работы с Git

После установки Git, начать работу можно с инициализации нового репозитория или клонирования существующего. Для инициализации в пустом каталоге выполните:

git init 

Для клонирования существующего репозитория используйте:

git clone [url-репозитория] 

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

Работа без онлайн-сервисов

Все основные операции Git (коммиты, ветвления, слияния и т.д.) выполняются локально. Работа с удаленными репозиториями через онлайн-сервисы добавляет удобства в совместной работе и обмене изменениями, но не является обязательной. Вы можете использовать Git полностью локально для управления версиями своих проектов.

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

Инициализация и клонирование репозитория

  • git init

    Инициализирует новый Git репозиторий в текущем каталоге, создавая скрытую папку .git, которая содержит все необходимые метаданные репозитория. Это первый шаг для начала отслеживания версий вашего проекта с Git.

  • git clone [url]

    Клонирует существующий репозиторий по указанному URL. Это создает полную копию репозитория, включая всю историю изменений, на вашем локальном компьютере.

Работа с файлами и коммитами

  • git add [file]

    Добавляет изменения в файле к следующему коммиту. Можно использовать git add . для добавления всех измененных файлов в текущем каталоге.

  • git commit -m "[commit message]"

    Зафиксирует все добавленные изменения в репозитории с сообщением коммита. Сообщение коммита должно быть информативным и отражать сделанные изменения.

Просмотр изменений и истории коммитов

  • git status

    Показывает статус файлов в рабочем каталоге и индексе: какие изменены, какие добавлены в индекс, а какие еще не отслеживаются Git.

  • git log

    Показывает историю коммитов для текущей ветки. git log --oneline представляет историю в сокращенном виде, показывая каждый коммит в одной строке.

Отмена изменений

  • git checkout [file]

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

  • git reset [file]

    Удаляет файл из индекса (staged area), но сохраняет его текущие изменения в рабочем каталоге.

  • git reset --hard [commit]

    Сбрасывает текущую ветку к указанному коммиту, отменяя все изменения в рабочем каталоге и индексе с момента этого коммита.

Работа с ветками

Создание, переключение и удаление веток

  • git branch [branch-name]

    Создает новую ветку.

  • git checkout [branch-name]

    Переключает рабочий каталог на указанную ветку.

  • git branch -d [branch-name]

    Удаляет указанную ветку. Git не позволит удалить ветку, если в ней есть неслитые изменения.

Слияние и решение конфликтов

  • git merge [branch]

    Сливает изменения из указанной ветки в текущую. Если возникают конфликты, Git попросит их разрешить перед завершением слияния.

  • git mergetool

    Запускает утилиту для решения конфликтов слияния, если таковые имеются.

Использование Rebase для чистой истории

  • git rebase [branch]

    Переносит коммиты текущей ветки на вершину указанной ветки. Это полезно для поддержания чистой и линейной истории изменений.

Взаимодействие с удаленными репозиториями

Синхронизация изменений

  • git remote add [name] [url]

    Добавляет новый удаленный репозиторий.

  • git fetch [name]

    Загружает информацию из удаленного репозитория, но не сливает изменения.

  • git pull [name] [branch]

    Извлекает и сливает изменения из указанной ветки удаленного репозитория в текущую ветку.

  • git push [name] [branch]

    Отправляет локальные коммиты в указанную ветку удаленного репозитория.

Удаленные ветки и слияние

  • git push --delete [remote_name] [branch_name]

    Удаляет ветку из удаленного репозитория.

  • git checkout -b [branch-name] [remote_name]/[branch-name]

    Создает новую локальную ветку на основе удаленной ветки.

Дополнительные команды и практики

  • Работа с тегами (git tag).

    Используйте для маркировки важных моментов в истории проекта, таких как релизы.

  • Git Hooks.

    Автоматизируйте различные действия с помощью хуков, которые могут срабатывать на определенных этапах работы с репозиторием.

  • Управление конфигурацией (git config).

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

  • Интерактивное добавление (git add -p).

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

  • Использование git stash.

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

  • Оптимизация репозитория (git gc).

    Улучшите производительность репозитория, сократив его размер и оптимизировав структуру данных.

  • Работа с подмодулями (git submodule).

    Управляйте зависимостями и связанными проектами как подмодулями внутри основного репозитория.

  • Восстановление удаленных веток и отмена коммитов.

    Изучите, как использовать git reflog вместе с git reset и git revert для отката изменений или восстановления потерянных данных.

Проектирование удаленных репозиториев

Стратегии ветвления

  • Git Flow

    Стратегия, организующая ветки для разработки, релизов, хотфиксов и фич.

  • Feature Branch Workflow

    Каждая новая фича разрабатывается в отдельной ветке, затем сливается с основной веткой после код-ревью.

Управление доступом и безопасность

  • Используйте SSH ключи для безопасного доступа к репозиториям.

  • Настраивайте права доступа для команды в настройках репозитория на GitHub, GitLab или Bitbucket.

Pull Requests и Code Reviews

  • Pull Request (PR).

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

Лучшие практики работы с Git

Чистая история коммитов

  • Делайте атомарные коммиты.

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

  • Сообщения коммитов.

    Пишите понятные и детализированные сообщения коммитов, которые четко описывают сделанные изменения и их причину. Следуйте стандартному формату сообщений, например: "Добавляет новую функцию Х для решения проблемы Y".

Ветвление и слияние

  • Ограниченное использование git merge --no-ff

    Используйте слияние без fast-forward (--no-ff) только когда это действительно необходимо, чтобы сохранить историю ветвления. В остальных случаях предпочтительнее использовать fast-forward слияние для чистоты истории.

  • Избегайте долгоживущих веток.

    Регулярно сливайте ветки разработки с основной веткой и избегайте длительного отделения веток разработки от основной линии, чтобы минимизировать сложность слияний.

Работа с удаленными репозиториями

  • Регулярно синхронизируйтесь с основной веткой.

    Регулярное выполнение git pull для основной ветки помогает избежать конфликтов слияния, обновляя вашу локальную копию до последней версии.

  • Использование Pull Requests.

    Всегда используйте pull requests для слияния значительных изменений, особенно в командной работе. Это позволяет провести ревью кода и обсудить изменения перед их интеграцией.

Безопасность и доступ

  • Используйте SSH ключи.

    Для безопасного подключения к удаленным репозиториям используйте SSH ключи вместо паролей.

  • Ограниченный доступ.

    Настройте права доступа к репозиторию, ограничивая возможности изменения кода для недоверенных участников. Используйте защищенные ветки для важных ветвей, таких как main или master, чтобы предотвратить нежелательные изменения.

Обработка ошибок

  • Откат нежелательных изменений.

    Используйте git revert для создания нового коммита, который отменяет изменения предыдущего коммита, вместо того чтобы использовать git reset для удаления истории коммитов.

  • Решение конфликтов слияния.

    При решении конфликтов слияния внимательно проверяйте изменения и обсуждайте их с командой, если необходимо. Используйте git mergetool для удобства решения конфликтов.

Непрерывное обучение

  • Изучайте и применяйте новые возможности Git.

    Git регулярно обновляется и получает новые функции. Оставайтесь в курсе последних обновлений и лучших практик, чтобы максимально эффективно использовать Git в своей работе.

Применяя эти лучшие практики, вы не только улучшите качество управления версиями в своих проектах, но и повысите эффективность сотрудничества в команде. Git предлагает мощные инструменты для управления сложными проектами, и правильное их использование может значительно упростить процесс разработки и обеспечить более высокую надежность и безопасность вашего кода.

Частые ошибки и нелепые ситуации в Git

  1. Удаление продакшн ветки.

    Одна из самых страшных ошибок — случайное удаление ветки main или master в удаленном репозитории. Впрочем, современные системы контроля версий и хостинги репозиториев обычно предусматривают защиту от таких действий для критически важных веток.

  2. Коммит в неправильную ветку.

    Классика: начинаешь вносить изменения, потом понимаешь, что все это время работал в ветке master, а не в новой фича-ветке. Хорошая новость в том, что Git предлагает инструменты для исправления этой ситуации, например, с помощью git stash и git checkout.

  3. Коммит с тестовыми данными.

    Тестовые данные, пароли, личная информация — все это иногда случайно попадает в коммиты. Хотя Git предлагает инструменты для удаления таких данных из истории (git filter-branch или BFG Repo-Cleaner), лучше всего — внимательность и использование .gitignore файлов.

  4. "Git push --force" без предварительной синхронизации.

    Использование git push --force может перезаписать историю в удаленном репозитории, потенциально удаляя чужие изменения. Это действие следует использовать с крайней осторожностью и только после согласования с командой.

  5. Забыть настроить .gitignore

    Добавление временных файлов, зависимостей проекта или личной информации к отслеживанию — распространенная ошибка новичков. Важно настроить файл .gitignore перед началом проекта, чтобы исключить ненужные файлы из репозитория.

Истории из жизни

  • Бесконечный цикл между ветками.

    Новички иногда впадают в панику, когда пытаются переключиться между ветками, но Git не позволяет это сделать из-за незакоммиченных изменений. Решение — либо закоммитить изменения, либо использовать git stash.

  • "Я случайно нажал git init в корневом каталоге моего компьютера".

    Это может привести к инициализации репозитория Git на всем компьютере, что вызывает массу путаницы. К счастью, удаление скрытой папки .git в корне исправляет ситуацию.

Тест для самопроверки с ответами

Вопрос 1

Вопрос 1

Правильный ответ здесь - это:

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

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

 

Вопрос 2

Вопрос 2

Из предложенных вариантов ответов наиболее корректная последовательность команд для выполнения данных действий будет:

git checkout -b new-feature (создать и переключиться на новую ветку)
git add . (добавить все измененные файлы в индекс)
git commit -m "Added new feature" (совершить коммит с сообщением)
git pull origin main (обновить текущую ветку последними изменениями из основной ветки)
git push origin new-feature (отправить новую ветку в удаленный репозиторий)

Таким образом, правильный ответ из предложенных вариантов будет третьим:

git branch new-feature | ... | git commit -m "Added new feature" | git push origin new-feature | git pull origin main

 

 

Вопрос 3

Вопрос 3

Для того чтобы файлы не отслеживались Git и не попадали в коммиты, необходимо использовать файл .gitignore. В этот файл вносятся пути к файлам и директориям, которые должны быть проигнорированы.

Правильная последовательность действий из предложенных вариантов будет следующей:

  1. Открыть файл .gitignore в любом текстовом редакторе.

  2. Добавить пути к файлам/директориям, которые нужно игнорировать.

  3. Сохранить и закрыть файл .gitignore.

Таким образом, правильный ответ на вопрос, согласно предложенным вариантам, это:

"Открыть файл .gitignore в любом текстовом редакторе и добавить пути к файлам/директориям, которые нужно игнорировать".

 

Вопрос 4

Вопрос 4

Из всех предложенных вариантов, практика, которой стоит избегать при организации работы над командным проектом, чтобы минимизировать ошибки — это "Использование одной общей ветки". Это может привести к конфликтам при слиянии, затруднить откат изменений и сделать историю коммитов запутанной. Лучше использовать множество веток для разных задач и фич, а также pull-requests для ревью кода перед слиянием изменений.
 

Вопрос 5

Вопрос 5

Правильный ответ здесь - git add -p. Эта команда позволяет выборочно добавить части изменённых файлов в индекс перед коммитом. Используя git add -p, вы можете просматривать изменения по частям (hunks) и решать, какие из них добавлять в коммит. Это идеально подходит для ситуации, когда нужно закоммитить только определённую часть изменений.

 

Вопрос 6

Вопрос 6

Правильный ответ здесь — git reset --hard HEAD. Эта команда сбросит состояние вашего текущего рабочего дерева и индекса до состояния последнего коммита, при этом отменив все изменения в рабочей директории.

 

Вопрос 7

Вопрос 7

Правильный ответ на вопрос — git merge. Эта команда используется для слияния изменений из одной ветки в другую. Если в процессе возникает конфликт, Git остановит слияние и позволит вам решить конфликты вручную. После разрешения конфликтов вам нужно будет выполнить команды git add для добавления разрешенных файлов в индекс и git commit для сохранения слияния.

 

Вопрос 8

Вопрос 8

Для приведения в порядок истории проекта и создания понятной визуальной истории наиболее подходящим вариантом будет "Применение команды git rebase для перемещения коммитов из одной ветки в другую и создания линейной истории коммитов". Это позволит упорядочить коммиты в хронологическом порядке, как если бы они были сделаны последовательно, что упростит понимание истории изменений.
 
 

Вопрос 9

Вопрос 9

Правильный ответ для переноса конкретного коммита из одной ветки в другую - это использование команды git cherry-pick commit-id. Это позволит выбрать один коммит по его идентификатору (commit-id) и применить изменения, которые были сделаны в этом коммите, к текущей ветке.

 

Вопрос 10

Вопрос 10

Для индивидуальной разработки может быть уместно использование любого из этих методов в зависимости от конкретной задачи. Однако, если цель состоит в том, чтобы поддерживать чистую историю коммитов, часто используют:

  • Rebase для перебазирования ветки и создания линейной истории коммитов.

  • Amend для корректировки последнего коммита, если требуется добавить изменения или исправить сообщение коммита.

  • Squash может быть использован для объединения нескольких коммитов в один перед слиянием в основную ветку, если хочется, чтобы история была максимально лаконичной.

  • Cherry-pick применяется, когда нужно перенести конкретные коммиты из одной ветки в другую.

  • Merge применяется для слияния веток, но в контексте индивидуальной разработки его использование может быть не так часто необходимо, если разработчик не создает отдельные ветки для различных функций.

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

 

Вопрос 11

Вопрос 11

Для выполнения объединения изменений в Git используется команда git merge branchname. Эта команда позволяет вам взять изменения из одной ветки (указанной в команде) и внедрить их в ту ветку, в которой вы в данный момент находитесь.

 

Вопрос 12

Вопрос 12

Из предложенных вариантов команд для этой задачи подходит команда:

git fetch

Эта команда загружает новые данные из удаленного репозитория (например, новые коммиты, ветки и теги), но не изменяет вашу текущую рабочую копию. Вы сможете увидеть эти обновления, например, с помощью git log или других команд для просмотра репозитория, но ваши файлы останутся без изменений до тех пор, пока вы явно не объедините эти изменения в вашу ветку с помощью git merge или git pull.

Git — это мощный инструмент для управления версиями, который обеспечивает гибкость и контроль над разработкой программного обеспечения. Овладение основными командами Git, понимание работы с ветками и удаленными репозиториями, а также применение эффективных стратегий ветвления позволяет командам разработчиков повысить эффективность и качество своей работы. Постоянное изучение и практика — ключ к успешному использованию Git в ваших проектах.

Shape
Личные кабинеты и сервисы
Делаем сложные проекты для государства и бизнеса, подключаем ЕСИА, ЭЦП и многое другое.
laravel, vue.js, PHP, Python, CI/CD, Docker
Мобильные приложения
Делаем одно приложение для нескольких платформ одновременно, за счет чего сокращаем издержки.
React native, flutter, Kotlin, Swift, .NET MAUI
Разработка сайтов
Делаем сайты и магазины с ультраплавными 3D‍-‍анимациями. Любые платежные системы и эквайринг. Сложная структура и дизайн.
Greensock, Canvas, webgl, MODX, 1с-битрикс
No-code cайты
Делаем понятные и продающие сайты и магазины c большой конверсией. Минимальные сроки разработки от 2-х дней.
Tilda, 1С-Битрикс
Чат-боты
Автоматизируем общение с клиентами в telegram, whatsapp, instagram. Сложный функционал и оплата.
Telegram, messenger, whatsapp
Контекстная реклама под ключ
Рекламная кампания с максимально возможной конверсией. Приведем первых клиентов уже через 3 дня!
Google Adwords, Yandex Директ
Интеграция AI
Сокращаем продуктовые издержки, подключая и настраивая нейросети в проектах.
ChatGPT, Mid-journey, CustomGPT