Как убрать случайную ветку в TortoiseHg? - PullRequest
21 голосов
/ 03 июня 2010

(Я относительный новичок в TortoiseHg, так что терпите меня :-) Я использую TortoiseHg на двух машинах, чтобы общаться с моим удаленным исходным хранилищем. Я внес изменения на одной машине, зафиксировал их и попытался перенести их в удаленный репозиторий, НО я забыл сначала выполнить проверку, чтобы сначала получить последний код. Push дал мне несколько строк вывода, предполагая, что я, возможно, забыл сначала потянуть (true!) И упомянул что-то вроде «abort: push создает новые удаленные ветви ...».

Итак, я сделал тягу, которая добавила несколько узлов в заголовок моего графика в обозревателе хранилища. Проблема в том, что нажатие, которое я пытался сделать, теперь отображается как ветвь в обозревателе хранилища. Если смотреть со стороны сервера (codeplex), он не показывает никаких признаков моей попытки отправки, указывая, что эта случайная ветвь все еще локальна на моей машине.

Как я мог удалить эту случайную ветку? Я попытался выбрать этот узел на графике, затем сделал «возврат», но он, похоже, ничего не сделал. Я задаюсь вопросом, проще ли было бы просто отбросить дерево каталогов на моем локальном компьютере и сделать совершенно новый, чистый запрос с сервера ...?

Ответы [ 5 ]

17 голосов
/ 03 июня 2010

Сначала убедитесь, что вы зафиксировали все свои локальные изменения. Затем объедините ветви, вызвав hg merge и подтвердите результат.

Это должно вернуть вас к одной ветви, воссоединив две головы.

7 голосов
/ 02 октября 2012

У меня была ветвь, которую я не хотел, но обнаружил, что не могу объединить ветку (или мне было очень трудно понять, как объединить), потому что она содержала конфликт, основанный на изменении регистра имени файла.

В конечном итоге я решил hg commit --close-branch. Поскольку ветвь существовала только в моем локальном репо, а не в репозитории, из которого я клонировала, последующее hg push даже не удосужилось выдвинуть закрытую ветвь в главное репо! Очень удобно. В этот момент все, что мне нужно было сделать, чтобы полностью его устранить, это удалить мое локальное хранилище и повторно клонировать его из «master».

5 голосов
/ 22 сентября 2010

Выполните «Слияние с» и отметьте «Отменить все изменения из целевой (другой) ревизии слияния». Конечно, вы должны убедиться, что цель, показанная как цель слияния, действительно та, которую вы хотите отбросить, прежде чем нажимать кнопку Слияние.

2 голосов
/ 04 июня 2010

В обозревателе хранилища выберите первую версию локальных изменений, затем щелкните правой кнопкой мыши на кончике ветки, которую вы только что перетащили, и выберите «Перебазировать поверх выбранного» или «Изменить историю-> Перебазировать поверх выбранного». в зависимости от версии вашего клиента. Это «перестроит» ваши обороты на потянутые.

Кроме того, чтобы избежать этого в будущем ...

В Repository Explorer выберите Инструменты-> Настройки. В верхнем левом раскрывающемся списке выберите «Глобальные настройки пользователя», так что это относится ко всем репозиториям. Затем выберите Синхронизировать слева. В «After Pull Operation» выберите «rebase». Это приведет к тому, что ваши локальные ревизии будут «перебазированы» на ревизии, которые вы только что вынули, вместо того, чтобы оставить их в другой ветке.

Это то, как я это делаю, и, вероятно, то, что вы обычно хотите.

Для получения дополнительной информации см. Проект rebase и расширение rebase .

0 голосов
/ 11 ноября 2016

Вот как это сделать с помощью инструмента командной строки. Я предполагаю, что это может быть легко сопоставлено с TortoiseHg (хотя я не уверен, так как я никогда не использую это ...) В любом случае, так как это должно быть сделано только время от времени, я думаю, что здесь нет проблем с использованием терминала .

Пример настройки

Предположим, что ваш удаленный репозиторий выглядит примерно так:

@  changeset:   3:a4c18a1fba12
|  tag:         tip
|  summary:     commit 4
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

Локально, у вас не было коммита 4, поэтому вы зафиксировали что-то непосредственно над коммитом 3:

@  changeset:   3:39526003350f
|  tag:         tip
|  summary:     commit 4 made locally
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

Итак, вы пытаетесь подтолкнуть его и получите это сообщение:

$ hg push
pushing to ssh://hg@bitbucket.org/brandizzi/mercurial-test-repo
searching for changes
remote has heads on branch 'default' that are not known locally: a4c18a1fba12
abort: push creates new remote head 39526003350f!
(pull and merge or see "hg help push" for details about pushing new heads)

По запросу, вы тянете его:

$ hg pull
pulling from ssh://hg@bitbucket.org/brandizzi/mercurial-test-repo
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

У тебя это сейчас ...

o  changeset:   4:a4c18a1fba12
|  summary:     commit 4
|
| @  changeset:   3:39526003350f
|/   summary:     commit 4 made locally
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

... но вы не хотели бы объединяться в соответствии с просьбой. Вы хотите иметь это вместо:

o  changeset:   4:a4c18a1fba12
|  summary:     commit 4 made locally
|
o  changeset:   3:a4c18a1fba12
|  summary:     commit 4
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

А затем вы хотите отправить его в удаленное хранилище.

Как ты это понял?

Решение

Чтобы получить это, вы не можете выдвинуть "коммит 4, сделанный локально". Кроме того, нет возможности поставить его после , когда новый удаленный коммит фиксируется. Сказал, что мы можем получить то, что мы просили.

Сказал, что вам просто нужно перенести локальный коммит на новый удаленный коммит:

$ hg rebase --source 3 --dest 4

Если вам повезет, этого будет достаточно.

Обработка конфликтов

Если вам не повезло, у вас могут возникнуть конфликты:

$ hg rebase --source 3 --dest 4
rebasing 3:39526003350f "commit 4 made locally"
merging test.txt
warning: conflicts while merging test.txt! (edit, then use 'hg resolve --mark')
unresolved conflicts (see hg resolve, then hg rebase --continue)

Затем просто разрешите конфликты (отредактировав их вручную):

$ hg st
M test.txt
$ nano test.txt # Edit and save

... пометить файл как разрешенный ...

$ hg resolve --mark
(no more unresolved files)
continue: hg rebase --continue

... и продолжить перебазирование:

 $ hg rebase --continue
rebasing 3:39526003350f "commit 4 made locally"
saved backup bundle to /home/adam/software/mercurial-test-repo/.hg/strip-backup/39526003350f-64863882-backup.hg

Вот ваша новая история:

@  changeset:   4:ca31fe8a15f0
|  summary:     commit 4 made locally
|
o  changeset:   3:a4c18a1fba12
|  summary:     commit 4
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

Теперь нажмите на нее:

$ hg push
pushing to ssh://hg@bitbucket.org/brandizzi/mercurial-test-repo
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files

В те дни это не так сложно, как раньше, верно? :)

...