Прежде всего, вы можете толкать даже с двумя головами, но, поскольку вы, вероятно, не хотите этого делать, поведение по умолчанию - это запретить вам это делать.Тем не менее, вы можете заставить толчок пройти.
Теперь, что касается ветвления, давайте рассмотрим простой сценарий в нераспределенной системе управления версиями, такой как Subversion.
Предположим, выесть коллега, который работает в том же проекте, что и вы.Текущий последний набор изменений в хранилище Subversion - версия 100, вы оба обновляете ее локально, так что теперь у вас обоих одинаковые файлы.
Хорошо, теперь ваш коллега уже работает над своими изменениями для парычасов, и поэтому он совершает.Это приводит к центральному хранилищу до ревизии 101. Вы все еще находитесь на ревизии 100 локально, и вы все еще работаете над своими изменениями.
В какой-то момент вы завершаете и хотите зафиксировать, но Subversionне позволю тебе.В нем говорится, что сначала нужно обновить, поэтому вы начинаете процесс обновления.
Процесс обновления хочет принять ваши изменения и сделать вид, что вы действительно начали с ревизии 101 вместо 100. Если ваши изменения не конфликтуют сЧто бы ни делал ваш коллега, все просто глупо, но если ваши изменения находятся в конфликте , у вас есть проблема.
Теперь вы должны объединить свои изменения с его изменениями и тому подобнымможет сойти с ума.Например, вы можете в конечном итоге объединить один файл OK, второй файл OK или, как вы думаете, и затем третий файл, и вы вдруг обнаружите, что у вас есть некоторые детали неправильно, было бы лучшеобъедините второй файл по-другому.
Если вы не сделали резервную копию своих изменений перед обновлением, и рано или поздно вы забудете, у вас возникнет проблема.
Теперь приведенный выше сценарий на самом деле довольнообщий.Ну, возможно, это не часть слияния, это зависит от того, сколько работает в одной области или файлах в одно и то же время, но часть «необходимо обновить перед фиксацией» довольно часто встречается в Subversion.
Так как жеMercurial делает это?
Ну, Mercurial коммитит локально, он вообще не общается ни с каким удаленным репозиторием, поэтому он не остановит вас от фиксации.
Итак, давайте попробуем вышеСценарий снова, только в Mercurial на этот раз.
Самый последний набор изменений в удаленном репозитории - это ревизия 100. Вы оба клонировали это, и вы оба начинаете работать над изменениями, начиная с ревизии 100.
Ваш коллега завершает свои изменения и фиксирует локально.Затем он отправляет свою ревизию в центральное хранилище, доводя там подсказку до ревизии 101.
Затем вы завершаете свои изменения и фиксируете их также локально, а затем хотите нажать, но вы получаете ошибкусообщение, которое вы уже обнаружили и о котором спрашиваете.
Так чем же это отличается?
Что ж, ваши изменения теперь зафиксированы, и пути нет, если вы действительно не попробуететрудно случайно потерять их или уничтожить их.
Вот 3 репозитория в игре и их текущее состояние:
Colleague ---98---99---100---A
Central ---98---99---100---A
You ---98---99---100---B
Если вам нужно было нажать, и было разрешено это сделать(или принудительно протолкнуть), центральное хранилище будет выглядеть так:
Central ---98---99---100---A
\
+--B
Две головы.Если ваш коллега сейчас вытащил, с какого он должен продолжать работать?Этот вопрос является причиной, по которой Mercurial по умолчанию не позволит вам вызвать это.
Таким образом, вместо этого вы тянете, и вы получаете вышеуказанное состояние в вашем собственном хранилище.
ВДругими словами, вы можете выбрать воздействие на свой собственный репозиторий и создать там несколько голов, но вы не навязываете эту проблему кому-либо еще .
Затем вы объединяете тот же тип операции, что и вы.Это нужно было сделать в Subversion, за исключением того, что ваша ревизия безопасна, она была зафиксирована, и вы не сможете случайно ее испортить или уничтожить.Если в середине слияния вы хотите начать все сначала, вы можете ничего не потерять и не нанести вреда.
После слияния ваш локальный репозиторий выглядит следующим образом:
You ---98---99---100---A----M
\ /
+--B--+
Теперь это безопасно нажимать, и если ваш коллега теперь тянет, он знает, что он должен продолжить с набора изменений M, который объединил его и ваши изменения.это то, что происходит из-за распределенной природы Mercurials.
Вы также можете назвать ветви, чтобы сделать их более постоянными.Например, вы можете назвать ветку «стабильной», чтобы обозначить, что все наборы изменений в этой ветке были тщательно протестированы и безопасны для выпуска клиентам или запуска в производство.Тогда вы можете объединить изменения с этой ветвью только после того, как упомянутое тестирование будет завершено.
Однако характер такой же, как в приведенном выше описании.Всякий раз, когда над проектом с Mercurial работает более одного человека, вы получаете ветки, и это хорошо.