Mercurial - Как перенести текущий набор изменений в ветку по умолчанию

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

Другими словами:

  1. Я вытащил из ветки по умолчанию несколько недель назад и внес серьезные изменения
  2. С тех пор я закончил свою работу
  3. Затем я объединил код из исходной ветки по умолчанию (только код, HG по-прежнему установлен на «NewBranch»
  4. Теперь, когда код работает, я хочу зафиксировать и отправить эти изменения обратно в ветку по умолчанию и продолжить разработку оттуда.

Но я не могу найти информации, как это сделать. Если я переключаю ветки, я теряю все свои наборы изменений, так как я все еще нахожусь в NewBranch. Я не могу понять, что делают rebase или transplant, и не могу найти руководств, объясняющих сценарии того, для чего они могут быть использованы ... Так что, надеюсь, кто-то здесь знает, что делать!

Я специально использую Mercurial в Eclipse, но я могу делать это в командной строке, если это проще.


person E.S.    schedule 05.09.2013    source источник


Ответы (1)


merge - это способ переноса изменений из одной ветки в другую. Я знаю, что вы объединили default в функцию, но теперь вы пошли другим путем. Вот пример, когда пронумерованные ревизии поступают от других людей, а помеченные буквами ревизии - от вас:

Прежде чем что-либо делать, вы клонируете и получаете следующее:

[1]---[2]---[3]---[4]   (default branch)

затем вы создаете свою ветку с именем 'feature' и делаете две фиксации на ней, что дает:

[1]---[2]---[3]---[4]           (default branch)
                    \
                     [A]---[B]  ('feature' branch)

затем вы hg pull, чтобы получить изменения по умолчанию, поскольку вы разошлись в своем локальном репозитории:

[1]---[2]---[3]---[4]---[5]---[6]  (default branch)
                    \
                     [A]---[B]     ('feature' branch)

теперь вы хотите, чтобы их изменения (5 и 6) были интегрированы в вашу ветку, поэтому вы должны:

hg checkout feature   # make sure you're looking at the he head of your branch
hg merge default      # merge default into your branch

что дает:

[1]---[2]---[3]---[4]---[5]---[6]        (default branch)
                    \           \
                     [A]---[B]---[C]     ('feature' branch)

Если я правильно понимаю, вы уже сделали все это, поэтому теперь вам просто нужно привести свою ветку, включая новую фиксацию слияния, C, в состояние по умолчанию, что снова делается с помощью слияния:

hg checkout default   # hop back to default, files look like [6] and [A] and [B] are missing
hg merge feature      # merge feature into default brining [A] and [B] in

что дает:

[1]---[2]---[3]---[4]---[5]---[6]---[7]   (default branch)
                    \           \   /
                     [A]---[B]---[C]      ('feature' branch)

Похоже, что таким образом проделано много работы, но на практике это обычно просто:

hg branch feature
....work....
hg commit
hg pull
hg merge default
hg checkout default
hg merge feature

и если pull не привел к новой работе от других, вы можете пропустить слияние default с вашим.

Это создает два новых набора изменений слияния. Их легко спрятать на hg log, если вы сочтете их бесполезными (некоторым людям нравится записывать, в каком направлении происходило каждое слияние), но если вы хотите полностью их избежать, вы можете использовать bookmarks (очень похоже на ветки git) вместо «named ветки »для ваших функций - тогда вы избежите набора изменений слияния, когда вернетесь, поскольку это будет духовным эквивалентом того, что git называет слиянием« быстрой перемотки вперед ».

person Ry4an Brase    schedule 06.09.2013
comment
Ах конечно! Мне просто нужно слиться в другом направлении и подтолкнуть. Ба! :) - person E.S.; 09.09.2013