2012-06-13 2 views
2

У меня есть ртутный репозиторий. Это было на rev A. Я внес некоторые изменения, совершенные (до версии B) и нажал. Однако позже я понял, что не хочу вносить эти изменения. Я обновил назад Rev A, и сделал некоторые альтернативные изменения, преподобным C.«Забыть» тупиковая ветвь

C 
| - 
| B 
|/ 
A 

Однако, сейчас я не могу нажать Rev C, потому что он жалуется, что бы создать новую удаленную голову (что было бы). Как заставить удаленный mercurial просто забыть о rev B и всех изменениях в нем, поэтому я могу нажать rev C и продолжить оттуда?

ответ

4

Лично я бы закрыл ветку и заставил толчок (как описывает Тим ​​Хениган), поскольку он оставляет ДАГ в состоянии, которое является правдивым. Однако есть еще один вариант. Выполнение dummy merge. Это слияние, но вы игнорируете входящие изменения.

hg update C 
hg -y merge --tool=internal:fail B 
hg revert --all --rev . 
hg resolve -a -m 
hg ci 

Конечный результат

M 
|\ 
C | 
| | 
| B 
|/ 
A 

... но М не содержит никаких изменений Б.

1

Меркуриальные ветви являются постоянными и регистрируются в самих объектах фиксации. Существуют некоторые (не слишком простые) методы закрытия и/или удаления ветвей, в основном перечислены here. Я даже уже использовал некоторые из них раньше. Обратите внимание, что это несколько отчаянные решения для людей, которые использовали ветви, думая, что они могут быть временными.

Однако, если вы действительно хотите временных ветвей, используйте bookmarks.

+2

Закладки - это только временные метки ветви, а не временные ветви. Наборы изменений, составляющие ветвь, все еще существуют, даже если вы удалите закладку. –

5

Editing History - твердый. Как только вы нажмете набор изменений в общий репозиторий, его больше нельзя будет легко обрезать из истории.

Самое прямое решение вашей проблемы:

  1. hg update <tip of branch you want to forget>
  2. hg commit --close-branch -m "close unwanted branch"
  3. hg update <tip of branch you want to keep>
  4. Нажимные все ваши изменения. Как вы отметили, вам нужно будет использовать --force, так как теперь существует несколько глав на ветке.

Если вам действительно нужно обрезать ветку, затем снова нажмите EditingHistory. Если это по-прежнему представляется возможным, вы можете использовать один из методов, описанных в PruningDeadBranches.

3

Используйте команду backout, чтобы отменить изменение B.

hg up B 
hg backout B 

Теперь вы рабочий каталог находится в том же состоянии он был до B, который я называю A'.

После того, как вы сделаете резервную копию, сделайте свое реальное изменение и совершите.Это то, что ваша история будет выглядеть следующим образом:

C 
| 
A' 
| 
B 
| 
A 
1

Другие люди имеют хорошие ответы, чтобы избавиться от «B», а просто поставить его там, вы всегда можете сделать:

hg push --rev C 

который будет нажимать C, но не B, и не жалуется на новые головы.

+0

В какой версии? Я просто попытался с 1.8.3 и получил 'abort: репозиторий db3a1ad66eca не найден!'. Также мне нужен ключ -f, если на сервере уже есть B. – Rudi

+0

Во всех версиях, но у меня была неправильная команда. :) Исправлена. –

Смежные вопросы