Помогите понять преимущества ветвления в Mercurial - PullRequest
5 голосов
/ 30 июня 2011

Я изо всех сил пытался понять, насколько полезно ветвление. Я не могу подтолкнуть к репо с 2-мя головами или 2-мя ветками ... так зачем мне когда-либо понадобиться / использовать их?

Ответы [ 2 ]

9 голосов
/ 30 июня 2011

Прежде всего, вы можете толкать даже с двумя головами, но, поскольку вы, вероятно, не хотите этого делать, поведение по умолчанию - это запретить вам это делать.Тем не менее, вы можете заставить толчок пройти.

Теперь, что касается ветвления, давайте рассмотрим простой сценарий в нераспределенной системе управления версиями, такой как 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 работает более одного человека, вы получаете ветки, и это хорошо.

1 голос
/ 01 июля 2011

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

Хорошее объяснение ртутных веток: http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/

...