# git clone _Удалённые репозитории · GitLab Knowledge Base_ **TL;DR:** Создаёт локальную копию удалённого репозитория. Под капотом - `init` + добавление origin + `fetch` всей истории + `checkout` основной ветки. Самая первая команда при работе с чужим проектом. `git clone [dir]` делает четыре вещи за один заход: 1. `git init` в указанной директории (по умолчанию - имя репо). 2. Добавляет remote с именем `origin` и URL клонирования. 3. `git fetch origin` - скачивает все объекты и refs. 4. Делает checkout default-ветки (обычно `main`, иногда `master`). После этого ты работаешь как с обычным репо: `git log`, `git status`, `git switch`. Прозрачно для пользователя - за этим стоит вся история проекта. ## Форматы URL ```bash git clone https://github.com/foo/bar.git # HTTPS git clone git@github.com:foo/bar.git # SSH git clone ssh://user@host/path/to/repo.git # SSH с портом git clone /path/to/local/repo # локальный ``` HTTPS требует логин/токен при push'е (или сохранение через credential helper). SSH требует [ssh-keys-git](/courses/git/kb/ssh-keys-git.md), но не запрашивает пароль каждый раз. В корпоративных репах часто используют SSH ради этого. ## Полезные флаги ```bash git clone --depth 1 # shallow: только последний коммит git clone --branch dev # сразу на ветке dev, а не main git clone --filter=blob:none # partial: без файлов-блобов до checkout git clone --bare # без working tree, только .git git clone --recursive # с submodules (см. главу 13) ``` `--depth 1` экономит трафик и место на больших репах. Цена - ты не видишь старую историю (`git log` уходит только на глубину shallow). Push из shallow клона современный Git разрешает, но операции, завязанные на полную историю (merge со старыми ветками, bisect далеко назад), будут спотыкаться. Подходит для CI, где нужна только текущая версия. ## Что не клонируется - Конфиг `.git/config` локального репо (свой создаётся на клоне). - Локальные ветки источника, которые не были пушнуты в этот URL. - Hooks из `.git/hooks/` - они локальные у каждого клона. - Stash источника. Клонируются: все коммиты, все ветки, все теги (по умолчанию), вся история. ## Подводные камни - Клон по HTTPS без credential helper заставит вводить пароль при каждом push. Решение - `git config --global credential.helper` (на macOS `osxkeychain`, на Linux `cache`, на Windows `manager-core`). - Имя remote по умолчанию `origin`. Можно сразу задать другое через `git clone -o upstream ` или переименовать после клона: `git remote rename origin upstream`. - На `git clone` приходит вся история - это иногда гигабайты. Для очень больших репозиториев смотри в сторону `--filter=blob:none` (partial clone) или `--depth` (shallow). ## Команды ```bash git clone ``` Полный клон с дефолтной ветки ```bash git clone --depth 1 ``` Shallow - только последний коммит, экономит трафик ```bash git clone --branch dev ``` Сразу checkout ветки dev ```bash git clone --recursive ``` Вместе с submodules ## См. также - [git fetch](/courses/git/kb/fetch.md) - [git remote](/courses/git/kb/remote-cmd.md) - [SSH-ключи для Git](/courses/git/kb/ssh-keys-git.md) - [upstream vs origin](/courses/git/kb/upstream-vs-origin.md)