git clone <url> [dir] делает четыре вещи за один заход:
git initв указанной директории (по умолчанию - имя репо).- Добавляет remote с именем
originи URL клонирования. git fetch origin- скачивает все объекты и refs.- Делает checkout default-ветки (обычно
main, иногдаmaster).
После этого ты работаешь как с обычным репо: git log, git status, git switch. Прозрачно для пользователя - за этим
стоит вся история проекта.
Форматы URL
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, но не запрашивает пароль каждый раз. В корпоративных репах часто используют SSH ради этого.
Полезные флаги
git clone --depth 1 <url> # shallow: только последний коммит
git clone --branch dev <url> # сразу на ветке dev, а не main
git clone --filter=blob:none <url> # partial: без файлов-блобов до checkout
git clone --bare <url> # без working tree, только .git
git clone --recursive <url> # с 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(на macOSosxkeychain, на Linuxcache, на Windowsmanager-core).- Имя remote по умолчанию
origin. Можно сразу задать другое черезgit clone -o upstream <url>или переименовать после клона:git remote rename origin upstream. - На
git cloneприходит вся история - это иногда гигабайты. Для очень больших репозиториев смотри в сторону--filter=blob:none(partial clone) или--depth(shallow).
- Имя remote по умолчанию