Меркуриальная фиксация и слияние

С Mercurial я часто сталкиваюсь со сценарием, в котором мне нужно постепенно совершать пуши, но если другой человек совершает фиксацию в середине этого, у меня возникают проблемы.

Пример. Предположим, что в репозитории HG есть четыре файла a.txt, b.txt, c.txt, d.txt, и у нас есть два пользователя Микки и Гуфи:

Mickey does:  $ echo "change1" >> a.txt
Mickey does:  $ echo "change2" >> b.txt
Mickey does:  $ echo "change3" >> c.txt
Mickey does:  $ hg commit -m "I am good" a.txt
Goofy does:   $ hg pull -u; echo "change4" >> d.txt; hg commit -m "The Donald change" 

Микки готовится к фиксации и отправке, но должен выполнить слияние: Микки делает: $ hg pull -u

Сейчас у Микки два изменения - в b.txt и c.txt. Предположим, что его изменения в c.txt сложны и не могут быть опубликованы прямо сейчас. Как Микки может зафиксировать и отправить свои изменения в файлах a.txt и b.txt без фиксации c.txt?


person Peter Toft    schedule 04.06.2012    source источник


Ответы (2)


Просто введите имена файлов, которые вы хотите зафиксировать:

hg commit a.txt b.txt -m'partial commit'

Затем нажимайте как обычно.

РЕДАКТИРОВАТЬ: вы можете попробовать сохранить локальные изменения как патч, отменить и извлечь удаленные изменения, а затем применить патч:

hg diff > local.patch
hg revert
hg pull -u
patch -p1 < local.patch
person piwi    schedule 04.06.2012
comment
Не в порядке - Микки нужно слить, прежде чем он сможет зафиксировать, и проблема в том, что c.txt еще не может быть зафиксирован.... - person Peter Toft; 04.06.2012
comment
Плохо, я недостаточно внимательно прочитал вопрос... Тогда как насчет внесения изменений в отдельную ветку (или даже клонирования репо)? - person piwi; 04.06.2012
comment
Я думаю, вам нужен hg revert . после первой разницы hg - person Peter Toft; 04.06.2012
comment
расширение полки может быть более простой альтернативой патчу. - person brandizzi; 17.09.2012

Ваш вопрос мне не совсем понятен, пожалуйста, поправьте меня, если я вас неправильно понял.

В репозитории Микки есть следующее (A — набор изменений Микки с измененным a, D — набор изменений Гуфи с измененным d, w — рабочая копия Микки с измененным b и c):

-- o --- A --- w
    \
     D

Теперь у Микки есть много вариантов. b готов к выпуску, поэтому он немедленно его коммитит:

$ hg ci b.txt -m "Finished working on b.txt"

-- o --- A --- B --- w
    \
     D

Теперь в рабочей копии осталось только c изменений. Микки делает промежуточную фиксацию:

$ hg ci -m "working on c"

-- o --- A --- B --- C' --- w
    \
     D

Рабочая копия чистая. Чтобы убедиться, что C' не включено в слияние, Микки обновляет предыдущий набор изменений, а затем объединяет:

$ hg up B
$ hg merge D
$ hg ci -m "Merged with Goofy"

-- o --- A --- B --- C
    \           \
     D --------- M --- w

Теперь Микки может продолжить работу над C и изменить коммит, когда он будет готов:

$ hg up C
$ echo "final change" >> c.txt
$ hg ci --amend -m "Finished working on c.txt"

Отсюда Микки может либо слиться, либо перебазироваться (кстати, слияние с Гуфи тоже может быть перебазированием).

person Helgi    schedule 04.06.2012
comment
Опцию --amend я никогда не видел - и HG 2.1.2 ее не распознает. Это новый вариант? - person Peter Toft; 06.06.2012
comment
@PeterToft: --amend был представлен в Mercurial 2.2, Около месяца назад. Не то, чтобы эффекта нельзя было добиться другими средствами, но это очень удобно. При отсутствии этой опции можно использовать MQ (qimport, qrefresh, затем qfinish). - person Helgi; 06.06.2012