Git централизованный рабочий процесс
Предположим, что разработчики используют централизованный рабочий процесс git, а github имеет 2 файла a.txt и b.txt.
Теперь dev1 успешно запускает c.txt. Теперь, если dev2 толкает d.txt, это не ускоренная перемотка вперед, и он не может нажать и ПРЯМО ТАК, потому что он должен сначала объединить изменения dev1 локально, а затем нажать.
Теперь еще один сценарий. Предположим, что dev1 создает ветку featureC и содержит файл c.txt вместе с a.txt, b.txt и pushes. Аналогично dev2 создает ветку featureD и содержит файл d.txt вместе с a.txt, b.txt и pushes.
Теперь сделан запрос на объединение FeatureC с мастером, и он успешно выполнен. Снова выдается запрос на объединение FeatureD с мастером, и это НЕ ДОЛЖНО быть успешным, но ЭТО. ЭТОГО НЕ МОЖЕТ БЫТЬ!! КАК ЭТО МОГЛО ПРОИЗОЙТИ? Разве это не соответствует вышеуказанному сценарию?
2 ответа
Существует постоянная разница между толчком и толчком. Когда вы хотите отправить коммиты на удаленную ветку, локальному репо нужны все коммиты с удаленного и, конечно, коммиты, которые вы хотите протолкнуть. Это не тот случай, когда dev2 толкает коммит для d.txt, не зная ничего о предыдущем коммите, который ввел c.txt.
Теперь с запросами на выдачу ситуация иная. Вы всегда можете безопасно извлечь что-нибудь, что не конфликтует, что является случаем, когда коммиты влияют только на разные файлы.
На самом деле это запрос на удаление, в вашем первом случае, когда git говорит dev2 тянуть (объединять), прежде чем он нажмет.
Вы можете всегда вытягивать (ускоренную перемотку вперед или объединять), когда нет конфликтов, но вы можете только подтолкнуть, когда ваша ветка обновлена с удаленной веткой, к которой вы хотите перенести.
Как понять, что совершается
Разработчику в локальном репозитории довольно легко увидеть, какие изменения на самом деле запрашиваются коммитом. Предполагается, что dev1 разветвляется на featureA для разработки какой-то функции от master этим утром. Вечером он хочет увидеть все изменения, которые он сделал, и когда он зарегистрировался, он сделал
git format-patch master..featureA
Все коммиты, пронумерованные по порядку, записываются в файлы NUMBER-TITLE.patch
,
Все эти патчи могут быть объединены с origin/master
независимо от состояния origin/master
(если уже есть новые изменения origin/master
или нет), когда ни один патч не может быть применен к оригиналу / мастеру, упорядоченному по номеру.
Ситуация, которую вы описываете
dev1:
a---b - master
\
c - featureC
DEV2:
a---b - master
\
d - featureD
централизованное репо:
a---b - master
В вашем первом сценарии (с которым вы, похоже, согласны), похоже, что оба разработчика пытаются вытолкнуть непосредственно в одну и ту же ветку в централизованном репо:
После того, как dev1 толкает его master
к централизованному:
a---b---c - master
Тогда, если dev2 имеет локально a---b---d - master
и пытается подтолкнуть это к master
на централизованном репо, git
жалуется. Что это должно сделать?
Это:
a---b---d - master #nope
было бы неправильно, так как c
отбрасывается
Это:
a---b---c #nope
\
+---d
также было бы неправильно, где следует master
указать на? Нет возможности для git
знать. Отсюда жалоба, master
разошлась.
Теперь к вашему второму сценарию.
Я предполагаю, что запросы на извлечение приводят к вытягиванию в централизованном репо.
"сделан запрос на объединение FeatureC с мастером, и он успешно выполнен":
централизованное репо:
c - featureC
/ \
a---b---x - master
Затем "делается запрос на объединение FeatureD с мастером":
c - featureC
/ \
a---b---x---y - master
\ /
+---d - featureD
Я не вижу причин, почему это не должно работать! Так как в централизованном репо, featureD
сливается в master
это актуально, и master
не разошлись.