↓Перейти к содержанию
  1. Git: руководства и команды/

Клонирование конкретной ветки Git

·8 минут·

По умолчанию git clone клонирует всё — когда это неудобно #

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

Когда полный clone неудобен #

Большие репозитории с глубокой историей. Некоторые проекты (например, Linux kernel или Chromium) содержат сотни гигабайтов истории. Загрузка может занять часы.

Медленное интернет-соединение. На мобильном интернете или в странах с ограниченной пропускной способностью полный clone неэффективен.

CI/CD конвейеры. Когда сервер автоматизации просто собирает проект или прогоняет тесты, нужна только одна ветка. Загрузка лишних данных замедляет build.

Работа с одной веткой. Вам нужна только ветка develop, но Git загружает также main, feature/*, release/* и другие ветки.

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

К счастью, Git предоставляет несколько механизмов для оптимизации процесса клонирования.

Клонирование конкретной ветки #

Если вам нужна только одна конкретная ветка (не ветка по умолчанию), используйте флаг --branch (или сокращение -b):

# Клонировать ветку feature-login
git clone --branch feature-login https://github.com/user/repo.git

# Сокращённый вариант
git clone -b feature-login https://github.com/user/repo.git

# Клонировать ветку develop
git clone -b develop https://github.com/user/repo.git

# Можно также клонировать тег (как версию)
git clone -b v2.0.0 https://github.com/user/repo.git

# Указать кастомное имя директории
git clone -b main https://github.com/user/repo.git my-project

Важное замечание о полной истории #

Флаг --branch выбирает, какую ветку проверить в рабочую директорию, но история всё равно загружается полностью. Если репозиторий имеет 50 ГБ истории, при использовании --branch будет загружено почти столько же. Этот флаг экономит время только на выборе ветки при checkout.

Если вам нужно сэкономить трафик и время, комбинируйте --branch с --depth (см. ниже).

Shallow clone — только последние N коммитов #

Для серьёзной экономии используйте shallow clone с флагом --depth:

# Загрузить только последний коммит (самый быстрый способ)
git clone --depth 1 https://github.com/user/repo.git

# Загрузить последние 10 коммитов
git clone --depth 10 https://github.com/user/repo.git

# Загрузить последние 50 коммитов
git clone --depth 50 https://github.com/user/repo.git

# Комбинация: конкретная ветка + shallow clone
git clone --depth 1 --branch main https://github.com/user/repo.git

# С указанием директории
git clone --depth 1 -b develop https://github.com/user/repo.git myapp

Как это работает #

Shallow clone загружает только последние N коммитов истории вместо всей истории репозитория. Это снижает размер загрузки в десятки раз для больших проектов.

Размер загрузки: вместо 50 ГБ истории вы загружаете только последние коммиты (обычно несколько МБ).

Время клонирования: сокращается с часов до минут или даже секунд.

Ограничения shallow clone #

Shallow clone — это компромисс между скоростью и функциональностью:

  • git blame не работает полностью. Вы не сможете увидеть автора и дату для старых версий файла (до времени shallow clone).
  • git rebase может быть ограничен. Если вы пытаетесь выполнить rebase далеко в историю, Git может отказать.
  • Некоторые merge операции могут быть невозможны.
  • История не полная. Это неполный репозиторий, хотя для большинства операций это не проблема.

Когда использовать shallow clone #

CI/CD конвейеры. Для автоматических сборок, тестов и развёртывания shallow clone идеален. Серверу нужно только собрать проект, он не анализирует историю.

# В файле .github/workflows/build.yml для GitHub Actions
git clone --depth 1 --branch main https://github.com/user/repo.git

Огромные репозитории. Linux kernel, Chromium, Blender и другие проекты с многолетней историей загружаются в разы быстрее с --depth 1.

Разработка на удаленных серверах. Когда вы работаете на сервере с ограниченным интернетом, shallow clone помогает сэкономить трафик.

Локальная работа над новыми проектами. Если вы только началась работу над проектом и вам нужен быстрый старт, --depth 1 ускорит процесс.

Partial clone — без больших объектов #

Partial clone — это более гибкий подход, чем shallow clone. Вместо загрузки только последних коммитов, Git загружает полную историю, но без больших файлов и объектов. Большие файлы загружаются по требованию, когда они вам действительно нужны.

# Клонировать без больших файлов (blob:none)
# История загружается, но большие файлы — нет
git clone --filter=blob:none https://github.com/user/repo.git

# Клонировать только файлы и историю, без структуры каталогов (tree:0)
git clone --filter=tree:0 https://github.com/user/repo.git

# Комбинация: partial clone + shallow clone
git clone --depth 1 --filter=blob:none https://github.com/user/repo.git

Преимущества partial clone #

  • Полная история доступна. git log и git blame работают со всей историей.
  • Большие файлы загружаются позже. Если вам нужен файл, Git автоматически загрузит его.
  • Меньше дискового пространства. Для репозиториев с большими бинарниками (изображения, видео, модели ML).
  • Работает с rebase. В отличие от shallow clone, можно делать rebase на любую точку в истории.

Partial clone идеален для репозиториев, где история важна, но есть большие файлы, которые не всегда нужны.

Sparse checkout — клонировать только нужные директории #

Если вам нужна только часть репозитория (например, только папка src/frontend из монорепо), используйте sparse checkout:

# Шаг 1: клонировать без checkout рабочих файлов
git clone --no-checkout https://github.com/user/repo.git
cd repo

# Шаг 2: инициализировать sparse checkout
git sparse-checkout init

# Шаг 3: указать, какие директории нужны
git sparse-checkout set src/frontend docs/

# Шаг 4: проверить выбранную ветку (загрузятся только выбранные папки)
git checkout main

Как это работает #

Sparse checkout позволяет Git загрузить в рабочую директорию только выбранные файлы и папки, но история остаётся полной. Это полезно для больших монорепо (как Microsoft/terminal, google/monorepo и др.).

# Добавить ещё одну папку к sparse checkout
git sparse-checkout add src/backend

# Посмотреть текущие правила
git sparse-checkout list

# Отключить sparse checkout и загрузить всё
git sparse-checkout disable

Превратить shallow clone в полный #

Если вы клонировали репозиторий с --depth 1, но позже вам нужна полная история, используйте git fetch --unshallow:

# Проверить, что это shallow clone
git rev-parse --is-shallow-repository
# Выведет: true

# Загрузить полную историю
git fetch --unshallow

# Или более новый способ
git fetch --unshallow origin

# Проверить результат
git rev-parse --is-shallow-repository
# Выведет: false

Команда git fetch --unshallow загружает всю недостающую историю. Это может занять время для больших репозиториев, но часто быстрее, чем переклонировать полностью.

Сравнительная таблица: методы клонирования #

МетодЧто загружаетсяСкоростьИсторияРазмерЛучше всего для
Полный cloneВсёМедленноПолнаяБольшойЛокальная разработка, анализ истории
–branchВсё, но другая веткаМедленноПолнаяБольшойВыбор нужной ветки (если нет –depth)
–depth 1Последний коммитОчень быстроТолько последнийМалыйCI/CD, быстрый старт
–depth 1010 последних коммитовБыстроЧастичнаяМаленькийЛокальная работа, когда история нужна но недалеко
–filter=blob:noneИстория + только метаданные файловБыстроПолнаяСреднийМонорепо, большие бинарники
–sparse-checkoutВыбранные папкиЗависитПолнаяСреднийРабота с частью монорепо

Практические примеры #

Пример 1: CI/CD конвейер #

# В скрипте автоматического развёртывания
git clone --depth 1 --branch main \
  https://github.com/company/product.git /app/current

cd /app/current
npm install
npm run build
npm run test

Shallow clone ускорит clone в 10-100 раз по сравнению с полным.

Пример 2: Работа с монорепо #

# Клонируем монорепо, но загружаем только микросервис
git clone --no-checkout https://github.com/company/monorepo.git
cd monorepo

git sparse-checkout init
git sparse-checkout set packages/user-service docs/

git checkout main
# Теперь в рабочей директории только packages/user-service и docs/

Пример 3: Экономия места для огромного репозитория #

# Репозиторий весит 100 ГБ
# Partial clone без больших файлов: ~5 ГБ
git clone --filter=blob:none https://github.com/torvalds/linux.git

# После этого git объекты займут ~5 ГБ
# Когда вам нужен большой файл, он загружается автоматически

Часто задаваемые вопросы #

Как клонировать конкретную ветку git? #

Используйте флаг --branch или его сокращение -b:

git clone --branch feature-login https://github.com/user/repo.git
git clone -b develop https://github.com/user/repo.git

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

Что такое shallow clone в git? #

Shallow clone — это клонирование репозитория без полной истории коммитов. Загружаются только последние N коммитов (указано в --depth). Это экономит трафик и место на диске, но некоторые операции (например, git blame на старый код) будут недоступны.

git clone --depth 1 https://github.com/user/repo.git  # Только последний коммит

Как ускорить git clone? #

Есть несколько способов:

  1. –depth 1 — загрузить только последний коммит
  2. –filter=blob:none — загрузить историю без больших файлов
  3. –single-branch — загрузить только одну ветку (не все ветки)
  4. Использовать SSH вместо HTTPS (часто быстрее)
# Быстрое клонирование: только последний коммит одной ветки
git clone --depth 1 --single-branch https://github.com/user/repo.git

Можно ли сделать git push из shallow clone? #

Да, git push работает из shallow clone без проблем. Вы можете полностью разрабатывать, делать коммиты и отправлять их в удалённый репозиторий. Ограничения shallow clone касаются истории и некоторых операций с логом, но не push/pull.

# Клонировали с --depth 1
git clone --depth 1 -b main https://github.com/user/repo.git
cd repo

# Делаем изменения и отправляем — всё работает
git add .
git commit -m "Fix bug"
git push  # Работает нормально!

Что такое –depth 1 в git clone? #

Флаг --depth 1 означает загрузить только последний коммит истории. Это самый быстрый способ клонирования для больших репозиториев. Вместо загрузки многолетней истории загружается только текущее состояние проекта.

Размер: репозиторий весом 50 ГБ может быть загружен как ~500 МБ. Время: вместо часа — несколько минут.

Как скачать только одну папку из репозитория? #

Используйте sparse checkout:

git clone --no-checkout https://github.com/user/repo.git
cd repo
git sparse-checkout init
git sparse-checkout set path/to/folder
git checkout main

Теперь в рабочей директории будет только path/to/folder из репозитория.

Другой способ (для GitHub) — использовать инструмент github-cli:

# Если установлен gh
gh repo clone user/repo -- --depth 1
# А потом sparse checkout

Совет для ускорения git операций #

Если вы часто клонируете большие репозитории, рассмотрите:

  1. SSH вместо HTTPS — обычно быстрее
  2. Установите git с поддержкой curl — может быть быстрее
  3. Используйте локальное зеркало — если клонируете один и тот же репозиторий несколько раз
# Создать зеркало репозитория (загружается один раз полностью)
git clone --mirror https://github.com/user/repo.git repo.git

# Клонировать из локального зеркала (очень быстро)
git clone /path/to/repo.git my-working-copy

Сочетание методов для максимальной эффективности #

Для максимально быстрого и экономного клонирования комбинируйте методы:

# Самый быстрый способ: shallow clone + single branch + partial clone
git clone --depth 1 \
          --single-branch \
          --filter=blob:none \
          --branch main \
          https://github.com/user/repo.git

# Или через SSH (часто быстрее)
git clone --depth 1 \
          --single-branch \
          --filter=blob:none \
          --branch main \
          [email protected]:user/repo.git

Эта команда загружает минимум данных: только последний коммит, только одну ветку, без больших файлов.

Заключение #

Выбор метода клонирования зависит от вашей ситуации:

  • Локальная разработка — используйте полный clone или shallow clone с --depth 10
  • CI/CD, автоматизация — --depth 1 для скорости
  • Монорепо — sparse checkout для загрузки только нужных частей
  • Большие бинарники — --filter=blob:none для истории без файлов
  • Нужна одна ветка — комбинируйте --branch и --depth 1

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

Дополнительно прочитайте /ru/git/kak-skachat-proekt-github/ для других способов получить код с GitHub, и /ru/git/git-tags/ для работы с версиями в Git.