Подтвердить что ты не робот

Как удалить случайную ветвь в TortoiseHg?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

В проводнике репозитория выберите первый оборот локальных изменений, затем щелкните правой кнопкой мыши на кончике ветки, которую вы только что вытащили, и выберите "Rebase on the top of selected" или "Modify history- > Rebase поверх выбранных", в зависимости от вашей версии клиента. Это будет "восстанавливать" ваши обороты на вытащенных.

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

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

Вот как я это делаю и, вероятно, вы, как правило, хотите.

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

Ответ 5

Вот как это сделать с помощью средства командной строки. Я думаю, это можно легко сопоставить с 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, поэтому вы совершили что-то прямо над commit 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://[email protected]/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://[email protected]/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

И затем вы хотите нажать его на дистанционное репо.

Как вы это понимаете?

Решение

Чтобы получить это, вы не можете нажать "commit 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

... и переходим к rebase:

 $ 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://[email protected]/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

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