Введение в сопровождение проекта с Git
Помимо эффективного участия в проекте, важно уметь его сопровождать. Сопровождение включает принятие и применение патчей, созданных с помощью git format-patch и отправленных по почте, а также интеграцию изменений из удалённых веток. Независимо от того, поддерживаете ли вы канонический репозиторий или помогаете в проверке патчей, важно знать, как принимать работу так, чтобы это было удобно для всех участников и приемлемо в долгосрочной перспективе. Эти навыки становятся всё более востребованными в распределённых командах.
Работа с тематическими ветками
Перед интеграцией изменений рекомендуется проверять их в тематической ветке — временной ветке, созданной для тестирования. Это позволяет применять патчи по одному, пропуская неработающие, и возвращаться к ним позже. Используйте короткие, понятные названия, например, ruby_client. Сопровождающие часто применяют пространства имён, добавляя префикс, например, sc/ruby_client (где sc — инициалы автора).
Создайте ветку на основе базовой, например:
$ git branch sc/ruby_client master Для немедленного переключения используйте:
$ git checkout -b sc/ruby_client master Теперь добавляйте изменения и решайте, стоит ли сливать их в долгосрочные ветки.
Применение патчей, полученных по почте
Полученные по почте патчи требуют анализа в тематической ветке. Есть два основных способа: git apply и git am.
Применение патча командой git apply
Если патч создан с git diff или diff (что не рекомендуется), используйте git apply. Предположим, патч сохранён как /tmp/patch-ruby-client.patch:
$ git apply /tmp/patch-ruby-client.patch Это изменит файлы в рабочем каталоге, аналогично patch -p1, но с большей строгостью. git apply поддерживает добавления, удаления и переименования из формата git diff, чего patch не делает, и использует модель «всё или ничего». Коммит не создаётся — его нужно сделать вручную.
Проверьте патч перед применением:
$ git apply --check 0001-see-if-this-helps-the-gem.patch
error: patch failed: ticgit.gemspec:1
error: ticgit.gemspec: patch does not apply Отсутствие ошибок указывает на возможность применения.
Применение патча командой git am
Если патч создан с git format-patch, используйте git am (от «apply mailbox»). Он читает mbox-файл с письмами, например:
From 330090432754092d704da8e76ca5c05c198e71a8 Mon Sep 22 00:00:00 2022
From: Bill Gates
Date: Sun, 6 Apr 2008 10:17:23 -0700
Subject: [PATCH 1/2] Add limit to log function
Limit log functionality to the first 20 Примените патч:
$ git am 0001-limit-log-function.patch
Applying: Add limit to log function Коммит создаётся автоматически с данными автора из From и Date, а сообщение — из Subject и тела письма. При конфликте вы получите подсказку:
$ git am 0001-see-if-this-helps-the-gem.patch
Applying: See if this helps the gem
error: patch failed: ticgit.gemspec:1
Patch failed at 0001.
When you have resolved this problem run "git am --resolved". Исправьте конфликты, добавьте файлы в индекс и выполните:
$ git add ticgit.gemspec
$ git am --resolved Опция -3 позволяет провести трёхстороннее слияние, если базовый коммит доступен.
Извлечение удалённых веток
Если участник отправил ссылку на ветку в своём репозитории, добавьте его как удалённый:
$ git remote add bill git://github.com/bill/myproject.git
$ git fetch bill
$ git checkout -b rubyclient bill/ruby-client Для разовых операций используйте git pull с URL:
$ git pull https://github.com/onetimeguy/project Это сохраняет историю коммитов, что упрощает слияние.
Определение применяемых изменений
Просмотрите коммиты в тематической ветке, не входящие в основную:
$ git log contrib --not master
commit 5b6235bd297351589efc4d73316f0a68d484f118
Author: Mark Zuckerberg
Date: Fri Dec 24 19:53:59 2022 -0700
See if this helps the gem Для разницы используйте:
$ git diff master...contrib Интеграция совместной работы
После проверки выберите способ интеграции: слияние, перебазирование или отбор.
Схемы слияния
Простое слияние в master подходит для небольших проектов. Для стабильности используйте двухступенчатый цикл с master и develop, где develop принимает новые изменения, а master — стабильные релизы.
Схема с перебазированием и отбором
Перебазируйте ветку:
$ git rebase master Или отберите коммит:
$ git cherry-pick e43a6 Дополнительные возможности
Включите rerere для повторного использования разрешений конфликтов:
$ git config --global rerere.enabled true Пометьте релизы тегами:
$ git tag -s v1.5 -m 'my signed 1.5 tag' Создайте архив:
$ git archive master --prefix='project/' | gzip > `git describe master`.tar.gz Сформируйте сводку:
$ git shortlog --no-merges master --not v1.0.1 Заключение
Сопровождение проекта с Git требует знания работы с патчами, ветками и интеграцией. Эти навыки обеспечивают стабильность и эффективность в любом проекте.
Отзывы