Лучший способ исправить ошибку, добавленную в старой фиксации?

Какова наилучшая практика, с которой вы столкнулись, когда захотелось исправить ошибку, созданную в старой фиксации?

Предположим, что у вас есть следующие коммиты A-> B → C-> D, и вы обнаружите, что при фиксации B была добавлена ошибка.

[Редактировать: A, B, C и D уже опубликованы (нажаты другими)]

Вернетесь ли вы в B, добавьте исправление в качестве нового commit B 'и слейте его и получите E:

A->B->C->D->E \->B'-----/

или добавить его после D?

A->B->C->D->E

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

1 ответ

Если рассматриваемая сделка уже перенесена в другой репозиторий (Mercurial будет отслеживать это с использованием фазы фиксации), я бы просто сделал новую фиксацию в качестве дочернего элемента D Нет никакого реального преимущества создания багфикса в качестве дочернего элемента B с последующим слиянием - отмечая в сообщении коммита E что это исправление ошибки, введенной в B работает.

Если коммит, который вводит ошибку, по-прежнему локальный (в стадии draft с Mercurial), вы должны просто отредактировать фиксацию, прежде чем нажимать ее в любом месте.

С Mercurial вы используете включенное расширение histedit для этого:

$ hg histedit B

Откроется редактор, позволяющий указать, что вы хотите сделать для каждой фиксации. Измените pick для edit в строке, соответствующей B Когда вы сохраняете файл и закрываете редактор, начинается редактирование истории. Теперь вы можете исправить ошибку и запустить

$ hg histedit --continue

когда вы довольны результатом.

В Git вы используете так называемую интерактивную переустановку для редактирования истории:

$ git rebase -i B^

Это начинается с того же процесса, что и для Mercurial. Измените pick чтобы edit и закрыть редактор. Отредактируйте файлы по своему вкусу и исправьте фиксацию, прежде чем продолжить редактирование истории:

$ git commit -a --amend
$ git rebase --continue

licensed under cc by-sa 3.0 with attribution.