LINUX.ORG.RU

склеить 15 коммитов в один, и сделать из них новый branch

 


1

1

%subj%

есть какой-то очевидный способ это сделать, без необходимости гуглить каждый раз аццкую команду hg rebase, которая непонятно что делает, и выполняется за полчаса?

в идеале, хотелось бы функциональный аналог команды «git rebase -i HEAD~15» (с поправкой что результат пойдет в новый branch, вместо изменения существующего, т.к. существующий immutable)

★★★★★
Ответ на: комментарий от RelativeLayout

ну с тем же успехом я могу сделать hg revert -r REV filename, т.к. все коммиты в данном случае меняют 1 файл. но хочется именно разобраться как люди это типично делают. потому что, к примеру, я могу захотеть по ходу выкинуть 5 из 15 коммитов, и т.п.

ведь должен же быть какой-то способ?

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

а если коммиты не подряд? например если надо 10 из 15 выбрать?

Смотря какие изменения. Если не конфликтуют текстуально, я бы тупо импортировал их как patch queue, а потом выбросил ненужные патчи. Или можно попробовать hg graft.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

все эти варианты я и так знаю. но это не совсем то. я помню даже ты писал, что есть какое-то расширение (возможно, что нестандартное), которое позволяет делать интерактивное редактирование истории, как в git (понятно, что только на свежей ветке).

когда я спросил madski сделать такую штуку — он у меня на компе вбил какую-то невменяемую команду, и сказал подождать полчаса. оно склеило все коммиты в 1, и отребейзило на текущую ветку. правда, выбрать отдельные коммиты было нельзя, он задал диапазон как-то.

видимо, такие трюки умеют только сами разработчики. а graft и revert — это все ручная работа. понятно что это все есть, но уровень удобства и гибкости совсем не тот.

будем считать что тема исчерпана, просто думал что я упускаю какую-то уличную магию.

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

он у меня на компе вбил какую-то невменяемую команду, и сказал подождать полчаса. оно склеило все коммиты в 1, и отребейзило на текущую ветку. правда, выбрать отдельные коммиты было нельзя, он задал диапазон как-то.

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

уровень удобства и гибкости совсем не тот.

«Я знал, что ты скажешь это» (ц)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

По описанию похоже на hg convert

хм.. вроде не было там convert.. но может я забыл. это было около месяца назад.

в повседневной жизни используется то, что я написал.

понял. спасибо за инфу.

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

есть какое-то расширение (возможно, что нестандартное), которое позволяет делать интерактивное редактирование истории, как в git

hg histedit, вам уже написали выше. Это аналог git rebase -i. Оно уже давно включено в поставку mercurial.

Sorcerer ★★★★★
()
Ответ на: комментарий от Sorcerer

hg histedit, вам уже написали выше. Это аналог git rebase -i. Оно уже давно включено в поставку mercurial.

ага, точно. Аноним, сорри, я не заметил сообщение..

только с этим histedit ничего непонятно. я считал, что он работает, как и hg strip, только с mutable-коммитами.

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

А что там непонятного? Это ведь то же самое, что и git rebase -i, с небольшими нюансами:

- в git указывается ревизия, после которой требуется отредактировать историю, а в histedit - ревизия, начиная с которой это требуется

- имена команд в редакторе отличаются (git -> mercurial):

pick -> pick
reword -> mess
edit -> edit
squash -> fold
fixup -> roll
{убрать ревизию из списка} -> drop
exec -> нет аналога

Вам нужно переупорядочить ревизии в редакторе так, чтобы объединяемые ревизии стояли подряд, а затем у второй и последующих объединяемых ревизий заменить pick на roll.

Sorcerer ★★★★★
()
Ответ на: комментарий от HeipaVai1o

ЯННП. что делает этот --keep? что делает этот phase? как они относятся к моему вопросу? зачем стрелять в ногу?

я прочитал hg help phase — там явно предполагается предварительное прочтение другой документации, но не указано какой именно, а без этого непонятно вообще о чем речь. с термином phase в hg ранее не сталкивался.

upd: перечитал еще несколько раз. я так понимаю, phase позволяет сделать ревизии мутабельными. но это идиотизм, не? они ведь уже есть в клонах у других разработчиков, на сервере в kallithea, и т.п.

есть подозрение, что hg потом не даст сделать пуш.

waker ★★★★★
() автор топика
Последнее исправление: waker (всего исправлений: 2)
Ответ на: комментарий от HeipaVai1o

кстати, а откуда вообще брать хелп по histedit?

$ hg help histedit
histedit extension - interactive history editing

чето маловато инфы для такой фичи.

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

ЯННП. что делает этот --keep?

Сохраняет старые ченджсеты на месте, очевидно же.

phase позволяет сделать ревизии мутабельными. но это идиотизм, не? они ведь уже есть в клонах у других разработчиков, на сервере в kallithea, и т.п.

Тогда просто не настаивай на том, чтобы выстрелить себе в ногу %)

tailgunner ★★★★★
()
Ответ на: комментарий от waker

Старая версия? У меня mercurial-3.3.2 выдаёт такой хелп:

hg histedit ANCESTOR | --outgoing [URL]

interactively edit changeset history

    This command edits changesets between ANCESTOR and the parent of the
    working directory.

    With --outgoing, this edits changesets not found in the destination
    repository. If URL of the destination is omitted, the 'default-push' (or
    'default') path will be used.

    For safety, this command is aborted, also if there are ambiguous outgoing
    revisions which may confuse users: for example, there are multiple
    branches containing outgoing revisions.

    Use "min(outgoing() and ::.)" or similar revset specification instead of
    --outgoing to specify edit target revision exactly in such ambiguous
    situation. See "hg help revsets" for detail about selecting revisions.

    Returns 0 on success, 1 if user intervention is required (not only for
    intentional "edit" command, but also for resolving unexpected conflicts).

(use "hg help -e histedit" to show help for the histedit extension)

options ([+] can be repeated):

    --commands VALUE Read history edits from the specified file.
 -c --continue       continue an edit already in progress
 -k --keep           don't strip old nodes after edit is complete
    --abort          abort an edit in progress
 -o --outgoing       changesets not found in destination
 -f --force          force outgoing even for unrelated repositories
 -r --rev VALUE [+]  first revision to be edited
    --mq             operate on patch repository

(some details hidden, use --verbose to show complete help)

--keep позволяет не удалять старые ревизии, а создать ещё одну (анонимную) ветку рядом с ними. phase --force позволяет тупо помечать публичные ревизии обратно как приватные. Если их изменить и сделать push - естественно, будет ругань на новые головы.

HeipaVai1o
()
Ответ на: комментарий от HeipaVai1o

Старая версия?

3.3.1

--keep позволяет не удалять старые ревизии, а создать ещё одну (анонимную) ветку рядом с ними.

о, это похоже на то что надо. а что такое анонимная ветка?

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

с чего ты взял, что я настаивал на выстреле в ногу?

Не вижу, где я сказал, что ты настаиваешь на этом. Тебя предупредили, что:

Либо всегда есть hg phase --draft --force, если нужно выстрелить в ногу.

Ты спросил «зачем мне это?», я ответил «ну так не делай этого».

А histedit у тебя не включен. В выдаче должно быть сообщение:

use "hg help extensions" for information on enabling extensions

Кстати, чем тебя не устроил graft?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Кстати, чем тебя не устроил graft?

ничем. он меня устраивает. он прямой аналог git cherry-pick, насколько я могу судить. и в этом качестве я его постоянно использую.

а мой вопрос — про аналог git rebase -i.

waker ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

А histedit у тебя не включен. В выдаче должно быть сообщение:

мне даже в голову не могло прийти, что для прочтения доков нужно править конфиги. спасибо за наводку.

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

непонятно, как поможет histedit если история иммутабельная

hg graft -r <список_ревизий>

где <список_ревизий> - это список ревизий для переноса в другую ветку, который задаётся revset'ом (hg help revsets).

Т.е. в вашем случае проще всего сначала перенести все 15 ревизий в другое место (предварительно создав бранч, например), а потом отредактировать перенесенные ревизии histedit'ом.

Sorcerer ★★★★★
()
Последнее исправление: Sorcerer (всего исправлений: 1)
Ответ на: комментарий от Sorcerer

Т.е. в вашем случае проще всего сначала перенести все 15 ревизий в другое место (предварительно создав бранч, например), а потом отредактировать перенесенные ревизии histedit'ом

а выше другой регистрант написал что histedit --keep делает это и без graft :)

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

а выше другой регистрант написал что histedit --keep делает это и без graft :)

Точно так же можно сказать, что graft делает это без histedit (и без включения расширения). Да и вообще, редактирование истории - зло (хотя и необходимое).

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Точно так же можно сказать, что graft делает это без histedit (и без включения расширения).

если сравнивать только результат, а не процесс его получения - да.

но интересует в первую очередь процесс, который позволит удобно получить желаемое.

waker ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Да и вообще, редактирование истории

редактирование истории в этом треде вообще сбоку. на самом деле, никакого редактирования истории нет. старая история остается в старом бренче. в новом бренче — новая история. ничего не меняется, только создается новое. даже если histedit.

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

histedit --keep делает это и без graft

Но histedit для новых ревизий ведь не создаст бранч: новые ревизии останутся в старом бранче.

Sorcerer ★★★★★
()
Ответ на: комментарий от waker

редактирование истории в этом треде вообще сбоку. на самом деле, никакого редактирования истории нет. старая история остается в старом бренче. в новом бренче — новая история.

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

tailgunner ★★★★★
()
Ответ на: комментарий от Sorcerer

Но histedit для новых ревизий ведь не создаст бранч: новые ревизии останутся в старом бранче.

я писал про это:

--keep позволяет не удалять старые ревизии, а создать ещё одну (анонимную) ветку рядом с ними.

(сам пока не проверял)

waker ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

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

вероятно, если использовать какой-то тортойс или сорстри — оно там удобнее, чем с консольки.

хистедит, врочем, я пока не пробовал, и про удобство не знаю. когда попробую — сообщу как оно. у меня как раз есть подходящая ветка для этого.

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

(сам пока не проверял)

А, ну если вам не нужен новый бранч, а достаточно ответвления в текущем бранче, то и с --keep пойдёт, конечно. В теме-то вы про бранч сказали.

Sorcerer ★★★★★
()
Ответ на: комментарий от Sorcerer

А, ну если вам не нужен новый бранч, а достаточно ответвления в текущем бранче, то и с --keep пойдёт, конечно. В теме-то вы про бранч сказали.

я поэтому и спросил, что такое анонимный бранч. если просто новая голова в текущем бранче — мне это не нравится.

waker ★★★★★
() автор топика
Ответ на: комментарий от waker

Да, это просто новая голова в текущем бранче.

Sorcerer ★★★★★
()

гуглить ацкую команду hg rebase, которая к тому же ещё и смеет себя вести не так, как в гите, да

hg histedit

littlechris ★★★
()
Ответ на: комментарий от littlechris

гуглить ацкую команду hg rebase, которая к тому же ещё и смеет себя вести не так, как в гите, да

ну то что почти все команды в hg ведут себя не так как в гите — это, по-моему, только Крон не знает.

waker ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.