Рабочая копия помнит адрес общего репозитория и сверяет с ним свою историю.
Общий репозиторий, куда все отправляют коммиты, — bare-репозиторий: в /srv/git/lab-site.git нет рабочих файлов, только история (ls покажет HEAD, objects, refs). Рабочую копию на сервере делают командой git clone /srv/git/lab-site.git <каталог>: git копирует историю и запоминает адрес репозитория под именем origin — его показывает git remote -v.
git pull делает два шага. Сначала git fetch скачивает новые коммиты в ветку origin/main — так рабочая копия видит, что сейчас лежит в репозитории. Рабочие файлы при этом не меняются. Затем pull переносит эти коммиты в твою ветку main и в файлы. В опыте отказ случился на втором шаге: коммит уже скачан, поэтому status и пишет «behind 'origin/main' by 1 commit». Подробнее о fetch, pull и push — в Вики.
В репозитории новый коммит, меняющий lab-site.conf. Ты запускаешь sudo git fetch. Что станет с lab-site.conf в рабочей копии?
-
Маркеры появляются при слиянии, когда обе стороны поменяли одни строки. fetch ничего не сливает и файлов не трогает.
-
Отказ «would be overwritten» случается при переносе в файлы. fetch файлов не касается, поэтому правка ему не мешает.
-
Файлы меняет второй шаг pull — перенос коммитов в ветку. fetch лишь скачивает их в
origin/main:git log HEAD..origin/mainпокажет, что пришло.
git fetch только скачивает коммиты и обновляет origin/main. Рабочие файлы и ветка main не меняются, пока коммиты не перенесёт pull.
Главное в шаге
-
bare-репозиторий хранит общую историю без рабочих файлов; рабочая копия знает его под именем
origin. -
git pull— этоgit fetch(скачать коммиты вorigin/main) и перенос их в свою ветку и файлы. -
git log HEAD..origin/mainпоказывает коммиты, которые скачаны, но ещё не применены.