Программирование и IT
git clone
Команда git clone забирает репозиторий с сервера целиком — со всей историей, ветками и тегами — и кладёт копию в новую папку на твоём компьютере. С неё начинается работа с любым уже существующим проектом, своим или чужим.
В этой статье
Что происходит при клонировании#
Клонирование делает три вещи за один раз. Создаёт папку, скачивает в неё
служебный каталог .git со всей историей коммитов и всеми ветками, а затем
раскладывает рядом файлы последней версии — то, что называют рабочим
каталогом. Копия получается полноценной: историю можно листать без сети,
создавать ветки и делать коммиты, даже если сервер недоступен.
Заодно git запоминает адрес, откуда взял данные, под именем origin — это
имя потом подставляется по умолчанию во все команды обмена с сервером.
Клонируют репозиторий один раз; за свежими коммитами ходят через
git pull, а не повторным клонированием.
Синтаксис и ключи#
Адрес бывает трёх видов: https://… (проще всего, пароль или токен спросят
при первой отправке), git@сервер:владелец/проект.git (по SSH-ключу) и
обычный путь к папке на диске. Если имя папки не указать, git возьмёт
последнюю часть адреса без .git.
| Ключ | Зачем нужен |
|---|---|
-b <имя>, --branch <имя> |
взять не ветку по умолчанию, а указанную; можно передать и тег |
--depth <N> |
скачать только N последних коммитов вместо всей истории |
--single-branch |
забрать одну ветку, а не все |
--recurse-submodules |
сразу выкачать вложенные репозитории |
--filter=blob:none |
история целиком, а файлы старых версий — по требованию |
-o <имя> |
назвать источник не origin, а как-то иначе |
--bare |
копия без рабочих файлов, только служебные данные |
Пример: обычная копия#
Cloning into 'notes'...
remote: Enumerating objects: 214, done.
remote: Counting objects: 100% (214/214), done.
remote: Compressing objects: 100% (128/128), done.
remote: Total 214 (delta 71), reused 205 (delta 66)
Receiving objects: 100% (214/214), 46.21 KiB | 3.85 MiB/s, done.
Resolving deltas: 100% (71/71), done.
Появилась папка notes. Проверить, что связь с сервером записана, можно
так:
origin https://github.com/example/notes.git (fetch)
origin https://github.com/example/notes.git (push)
Пример: быстрая копия без истории#
Когда нужен только текущий код — например, чтобы собрать проект, — тянуть
десять лет истории незачем:
Папка будет называться notes-build, внутри — один коммит ветки release.
Такую копию называют поверхностной: часть команд истории в ней работать не
будет. Если история всё-таки понадобилась, её дозагружают:
Отдельная тонкость: если в --branch передать имя тега, а не ветки, git
оставит указатель HEAD отсоединённым и честно об этом напишет. Чтобы
продолжить работу, нужна ветка — как её завести, разобрано в статье про
git branch.
Когда клонирование не удаётся#
fatal: destination path 'notes' already exists and is not an empty directory —
папка с таким именем уже есть и не пуста. Либо задай другое имя последним
аргументом, либо удали старую папку.
Repository not found или fatal: repository '…' not found — чаще всего
опечатка в адресе, а у закрытых репозиториев так же выглядит отказ в
доступе: сервер не подтверждает даже существование того, что тебе не
показывают.
Permission denied (publickey) — SSH-ключ не подошёл. Для разовой копии
проще взять https-адрес того же репозитория.
error: RPC failed … the remote end hung up unexpectedly — обрыв на большом
репозитории. Помогает --depth 1 с последующим git fetch --unshallow.
Как откатиться#
Отменять тут нечего: клон — это новая папка, в остальной системе он ничего
не меняет. Неудачную или ненужную копию просто удаляют вместе с папкой
(rm -rf notes), а если удалили по ошибке — клонируют заново, все коммиты
лежат на сервере. Единственное, что теряется вместе с папкой, — твои
незакоммиченные правки и ветки, которые ты никуда не отправлял.
Остальные команды первого дня собраны в
шпаргалке по командам git.
План по этапам
- Взять адрес репозиторияНа странице проекта кнопка Code или Clone; https проще, SSH требует ключа.
- Выбрать папкуПерейти в каталог, где должна появиться копия: клон создаст в нём подпапку.
- Выполнить git cloneДождаться строк Receiving objects и Resolving deltas — это конец загрузки.
- Зайти внутрь и проверитьcd в папку, git remote -v и git log --oneline -5: адрес записан, история на месте.
- Решить про глубинуНужен только код — --depth 1; нужна история — обычный клон.
Начать изучать эту тему у себя
План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.
Проверь себя
1.Какая команда положит копию репозитория в папку work, а не в notes?
2.Что делает ключ --depth 1?
3.Под каким именем git сохраняет адрес, с которого сделан клон?
Источники
-
Pro Git, книга на русскомГлава «Основы Git» — клонирование и удалённые репозиториибесплатно
-
Справка git cloneПолный список ключей командыбесплатно
Было полезно?