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

Вопрос этой темы связан с тем, что gitguys.com, по-видимому, требует, чтобы объяснить, что "выходные данные статуса git не должны изменяться" в среде нескольких пользователей, работающих с хранилищем NON-NARE ( http://www.gitguys.com/topics/shared-repositories-should-be-bare-repositories/)

На вышеупомянутой веб-странице поясняется, что если кто-то создал "репозиторий git без обнажений, в котором пользователь git репозитория и удаленные пользователи обновляли базу данных объектов git. Создатель репозитория non-bare git использовал бы команду git status одну минуту и посмотрите это: $ git status

# On branch master

nothing to commit (working directory clean)

В следующую минуту удаленный пользователь может внести изменения в не-пустой репозиторий. Затем, когда создатель репозитория git непонятного типа вводит git status, git находит другую базу данных объектов и дает разные результаты для этого прогона состояния git."Учебное пособие завершается следующим утверждением, которое мне сложно объяснить, основываясь на том, что Я знаю:вывод статуса git не должен изменяться, если пользователь не изменил файлы в рабочем каталоге или в своей объектной базе данных!

Я нахожу это "трудно объяснить", потому что это утверждение является обоснованием того, почему голые репозитории (в отличие от непокрытых репозиториев) должны использоваться в среде центрального репозитория, где несколько пользователей совместно используют этот репозиторий. Мне кажется, что это утверждение не является правильным, и поэтому трудно рассуждать, почему в среде разработки для нескольких пользователей требуются пустые репозитории. Это неверно, потому что подразумевает, что на состояние GIT влияет состояние хранилища серверов, так как я думал, что состояние git учитывает только локальные файловые объекты.git и рабочий каталог (т. Е. Не на сервере).

Пожалуйста, обратите внимание, что я пытался объяснить, почему пустые репозитории являются необходимыми, просто не принимая как данность, что пустые репозитории хороши для общей среды - но до сих пор я не делал этого с большим успехом (в том числе на этом сайте, возможно, потому что я не поставил проблему под рукой должным образом, я надеюсь, что на этот раз я понял это правильно, насколько изложил проблему)

Может ли кто-нибудь объяснить, как это может быть, что даже при работе с непокрытыми репозиториями с несколькими пользователями (предположим, 2 пользователя: USER A и USER B), например, USER A может получить 2 разных результата при выдаче состояния git из-за изменения с последующим git push пользователем USER B

1 ответ

Мне кажется, хотя я могу ошибаться, что у вас есть проблемы с пониманием того, как команда может эффективно сотрудничать в проекте через удаленное хранилище.

Я объясню некоторые основные понятия, прежде чем приступить к решению вашей путаницы.


Сначала давайте определим, что именно представляет собой удаленный репозиторий. В мире git удаленный репозиторий - это не что иное, как репозиторий, который вы зарегистрировали в своем локальном репозитории через git remote командование
Этот репозиторий даже не должен иметь общую историю с вашим локальным репозиторием, он не должен быть пустым, он не должен существовать на сервере - он может даже находиться в той же папке на вашем локальном компьютере - он просто нужно зарегистрироваться через git remote в вашем локальном хранилище, чтобы считаться удаленным хранилищем.

Довольно общий, не так ли?

При работе в команде общим рабочим процессом в git будет определение центрального хранилища, которое все разработчики регистрируют как удаленные. При клонировании репозитория (git clone) этот репозиторий будет иметь клонированный репозиторий, зарегистрированный как удаленный репозиторий.

Теперь каждый разработчик может работать локально и вносить свои изменения в этот центральный репозиторий; другие разработчики могут получить эти изменения оттуда.

Но так не должно быть.

Git - это распределенная система контроля версий, это означает, что каждый клон репозитория является полной резервной копией и может функционировать как удаленный репозиторий (если использовать термин git).

Что это значит для нас? Это означает, что рабочий процесс только в центральном репозитории является общим соглашением в команде рассматривать этот репозиторий как истинный.


Теперь вернемся к вашей путанице:

Пока вы, например, следите за рабочим процессом центрального хранилища, никакое нажатие не изменит ваш локальный клон хранилища (означает git status никогда не "изменится сам по себе").

Если я правильно понял ваши комментарии, пользователь B клонировал репозиторий пользователя A. Что мы узнали о клонировании хранилища? Хранилище пользователя A теперь считается удаленным хранилищем в клоне пользователя B.

Это означает, что каждый push-запрос пользователя B будет вносить свои изменения в репозиторий пользователя A - по умолчанию git не разрешает вставки в не-пустые репозитории, но это возможно. Такой толчок может эффективно изменить вывод git status хотя пользователь A не внес никаких изменений, но пользователь B сделал это с его толчком.

Другие вопросы по тегам