Программирование и IT

git clone

Команда git clone забирает репозиторий с сервера целиком — со всей историей, ветками и тегами — и кладёт копию в новую папку на твоём компьютере. С неё начинается работа с любым уже существующим проектом, своим или чужим.

Обновлено
В этой статье

Что происходит при клонировании#

Клонирование делает три вещи за один раз. Создаёт папку, скачивает в неё
служебный каталог .git со всей историей коммитов и всеми ветками, а затем
раскладывает рядом файлы последней версии — то, что называют рабочим
каталогом. Копия получается полноценной: историю можно листать без сети,
создавать ветки и делать коммиты, даже если сервер недоступен.

Заодно git запоминает адрес, откуда взял данные, под именем origin — это
имя потом подставляется по умолчанию во все команды обмена с сервером.
Клонируют репозиторий один раз; за свежими коммитами ходят через
git pull, а не повторным клонированием.

Синтаксис и ключи#

git clone <адрес> [папка]

Адрес бывает трёх видов: https://… (проще всего, пароль или токен спросят
при первой отправке), git@сервер:владелец/проект.git (по SSH-ключу) и
обычный путь к папке на диске. Если имя папки не указать, git возьмёт
последнюю часть адреса без .git.

Ключ Зачем нужен
-b <имя>, --branch <имя> взять не ветку по умолчанию, а указанную; можно передать и тег
--depth <N> скачать только N последних коммитов вместо всей истории
--single-branch забрать одну ветку, а не все
--recurse-submodules сразу выкачать вложенные репозитории
--filter=blob:none история целиком, а файлы старых версий — по требованию
-o <имя> назвать источник не origin, а как-то иначе
--bare копия без рабочих файлов, только служебные данные

Пример: обычная копия#

git clone https://github.com/example/notes.git
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. Проверить, что связь с сервером записана, можно
так:

cd notes
git remote -v
origin	https://github.com/example/notes.git (fetch)
origin	https://github.com/example/notes.git (push)

Пример: быстрая копия без истории#

Когда нужен только текущий код — например, чтобы собрать проект, — тянуть
десять лет истории незачем:

git clone --depth 1 --branch release https://github.com/example/notes.git notes-build

Папка будет называться notes-build, внутри — один коммит ветки release.
Такую копию называют поверхностной: часть команд истории в ней работать не
будет. Если история всё-таки понадобилась, её дозагружают:

git fetch --unshallow

Отдельная тонкость: если в --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.

План по этапам

  1. Взять адрес репозиторияНа странице проекта кнопка Code или Clone; https проще, SSH требует ключа.
  2. Выбрать папкуПерейти в каталог, где должна появиться копия: клон создаст в нём подпапку.
  3. Выполнить git cloneДождаться строк Receiving objects и Resolving deltas — это конец загрузки.
  4. Зайти внутрь и проверитьcd в папку, git remote -v и git log --oneline -5: адрес записан, история на месте.
  5. Решить про глубинуНужен только код — --depth 1; нужна история — обычный клон.

Начать изучать эту тему у себя

План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.

Начать план

Проверь себя

1.Какая команда положит копию репозитория в папку work, а не в notes?

2.Что делает ключ --depth 1?

3.Под каким именем git сохраняет адрес, с которого сделан клон?

Источники

Было полезно?

Ещё темы

Программирование и IT Как создать репозиторий с нуля Репозиторий — это папка проекта плюс скрытая папка `.git`, в которой хранится вся история. Создаётся одной командой, но между ней и первым осмысленным коммитом есть несколько шагов, которые потом трудно переделать: имя ветки, список игнорируемых файлов, привязка к серверу. Программирование и IT git merge Слияние переносит работу из одной ветки в другую. Команда git merge берёт указанную ветку и соединяет её историю с текущей — иногда просто сдвигая указатель, иногда создавая отдельный коммит, а иногда останавливаясь и прося помощи. Программирование и IT git push Пока ты не выполнил git push, твои коммиты существуют только на твоём диске. Команда отправляет их в удалённый репозиторий и сдвигает там указатель ветки — поэтому она же чаще всего и отказывает, если кто-то успел отправить своё раньше. Программирование и IT git commit Коммит — это сохранённое состояние проекта с автором, временем и сообщением. Команда git commit берёт то, что ты заранее отобрал командой git add, и записывает это в историю одной неделимой порцией. Программирование и IT git stash Заначка — временная полка для незаконченных правок. Ты кладёшь туда всё, что наработал, получаешь чистую рабочую копию, делаешь срочное дело и возвращаешь отложенное обратно. Полка общая на весь репозиторий и устроена как стопка: последнее положенное лежит сверху. Программирование и IT git branch Ветка в git — это подвижный указатель на коммит, а не копия файлов. Поэтому завести её ничего не стоит, а команда git branch отвечает за список веток, их создание, переименование и удаление.

Ещё сценарии