23.06.2025

Git Pull, Fetch и Clone - в чем отличие?

Процессы совместной разработки, ведение документации, управление проектами в компаниях не представить без такой технологии, как система контроля версий репозитория. Она позволяет вместо обычных решений с механизмами разграничения мьютекс и ему подобными вести распределенную работу на одним проектом.

Классически схема выглядит так, пользователь обращается к ресурсу и запрашивает доступ к файлу, после чего работает и сохраняет его в том же ресурсе. Однако если два пользователя работали вместе, то тот кто записал последние изменения перезапишет работу предыдущего и материал будет потерян. Как раз для решения этой проблемы Линусом Торвальдсом была разработана система Git! Она позволяет каждому сохранить свою локальную копию на устройстве и затем в формате снимков загрузить свои версии в единый репозиторий.

Одним из процессов работы с репозиториями является управление remote repo и работа с ними, в данном материале рассмотрим разницу между командами pull, fetch и clone.

В чем разница между командами Git?

Напомним, что работа с git устроена по следующей логике: пользователь работает в окружении под названием Working Tree, где хранится сам репозиторий и рабочие файлы. При внесении изменений командой git add . записывается текущее состояние рабочей директории или же Working Tree. После чего файлы формируются в архив или commit и направляются в репозиторий.

Скриншот №1 — Схема работы с репозиториями

Но вот обратный ему процесс выглядит несколько иначе и само скачивание может быть представленным, по схеме ниже.

Скриншот №2 — Схема загрузки репозитория

Три команды git pull, fetch и clone отвечают за работу над скачиванием ресурсов с удаленного репозитория или же remote repo. Но для разных сценариев будет удобно использовать одно из них.

Git clone

Представим, что ваш коллега выполнил команду git push и только загрузил свежую версию репозитория на remote repo. После чего вы хотите скачать ее, не влияя на вашу копию в Working Tree или у вас она отсутствует, значит вам подойдет команда git clone. К примеру команда:

git clone https://github.com/academic-initiative/documentation.git

Она загрузит файлы не изменяя ваше текущее рабочее пространство, а даже если случайно ошибетесь и загрузите копию в ту же директорию с вашим repo, то git выдаст ошибку.

Скриншот №3 — Схема загрузки репозитория

Для корректной работы перейдите в другую директорию или удалите существующий репозиторий, после чего повторите выполнение команды и дождитесь скачивания. При таком способе происходит загрузка и репозитория, и распаковка файлов из него, далее может быть изменена и выгружена с модификациями обратно в remote repo. Однако, если необходима работа с ветками и разными версиями commit, то для таких целей отлично подойдет команда git checkout.

Git pull

Данная команда призвана обновлять данные в существующем репозитории, проводя слияние с текущим локальным репозиторием. Скачивает из основного только отличающиеся файлы и загружает их сразу в рабочую директорию. К примеру, один из пользователей закомитил изменения, которые важны в вашей работе. Для этого выберите нужную ветку командой git checkout <branch> и загрузите изменения:

git pull origin

Скриншот №4 — Дивергентные ветви

Если вы увидите сообщение о дивергентных ветках – это значит, что вы не выбрали способ работы с коммитами: merge или rebase. Для того, чтобы ваша работа и commit проходили слияние пропишите команду:

git config pull. rebase false

Но если вы хотите сохранить текущие наработки и не проводить процесс слияния,то используйте rebase:

git config pull.rebase true

После чего изменения будут зафиксированы и отражены в рабочей директории. Но, что если перед слиянием необходимо просмотреть обновления, которые будут внесены в файлы? Для этого существует команда fetch!

Git fetch

Принцип работы аналогичен команде git pull, но только в данном случае сначала изменения загружаются в локальный репозиторий после чего пользователь решает проводить ли слияние с рабочей директорией. Механизм основан на том, что в локальном репозитории хранятся так же и remote branches или же удаленные ветки. Именно в них записываются обновленные commit, после чего командами git rebase или git merge происходит их слияние.

git fetch origin

Скриншот №5 — Команда fetch

После этого действия обновления записаны в remote branches и ожидают дальнейшего слияния, либо отказа от обновления. Как указано на скриншоте выше изменения сохранены в ветку origin/main, значит перейдем в нее командой.

git checkout origin/main

Скриншот №6 — Просмотр изменений в ветках Git

В самом низу приведены обновления для ветки по сравнению с текущей рабочей директорией, для того чтобы просмотреть изменения введите в рабочей папке ls. Для слияния папок пропишите команду:

git merge

Скриншот №7 — Слияние папок

После чего рабочая директория будет обновлена и продолжить работу будет можно с обновленными файлами из remote repo.