Редактирование любого коммита
Опечатка — в коммите трёхнедельной давности. Обычное лекарство — интерактивный ребейз: остановиться на коммите, поправить, продолжить, молиться. Лекарство Gitcito: правый клик по коммиту, Редактировать этот коммит, поменяли текст, готово. Кнопка с пером на панели деталей коммита открывает тот же редактор.

Что оно делает
Выберите любой коммит, являющийся предком HEAD — с линейной историей или
без. Диалог показывает его файлы и сообщение; правьте что угодно из двух.
Дальше происходят две вещи:
- Предпросмотр каскада переигрывает каждый коммит выше редактируемого
в памяти (цепочка cherry-pick через
merge-tree— без чекаута, без рабочего дерева, без ссылок). Каждый потомок подсвечивается зелёным или красным, так что вы до того, как что-либо сдвинется, знаете, проходит ли правка чисто или сталкивается с более поздним изменением. - Переписать историю делает это по-настоящему: та же цепочка строится
plumbing-командами, затем ветка переезжает через
reset --keep— ваши незакоммиченные изменения переносятся, либо reset прерывается и ничего не произошло. Сначала делается снимок-страж, а отмена возвращает старую цепочку.
Авторство и даты каждого переигранного коммита сохраняются; меняются только хеши — в этом и состоит переписывание истории.
Слияния в диапазоне

Merge между коммитом и HEAD больше не выключает редактирование. Каскад
переигрывает слияние, накладывая его записанный результат — дерево,
которое слияние действительно закоммитило, вместе с разрешениями
конфликтов — на переписанного родителя, так что разрешения, сделанные кем-то
вручную, переживают переписывание дословно. Без rerere, без повторного
слияния, без рабочего дерева: тот же plumbing в памяти, что и в остальном
каскаде, и оба указателя на родителей сохраняются. Боковая ветка, которая
тоже содержит редактируемый коммит, переписывается и перенацеливается; та,
что его не содержит, сохраняет свою идентичность нетронутой. Баннер в
диалоге говорит, сколько слияний несёт диапазон, а шаги-слияния показывают в
предпросмотре иконку слияния.
Честная оговорка: переигранное слияние ровно настолько хорошо, насколько хорош его записанный результат. Если ваша правка сталкивается со строками, которые разрешило само слияние, предпросмотр краснеет точно так же, как любой другой конфликтующий шаг — ничто не угадывается.
Когда каскад конфликтует
Более поздний коммит трогал те же строки, что вы правите. Предпросмотр помечает этот коммит красным вместе с конфликтующими файлами, и переписывание отказывается запускаться — ничего никогда не применяется наполовину. Либо правьте иначе, либо возьмите конфликт в лоб через интерактивный ребейз.
Ограничения
- Коммит должен быть предком
HEAD. У коммита на невлитой боковой ветке нет пути к вашей текущей ветке, по которому его можно переиграть. - Бинарные файлы и файлы больше 2 МБ показываются, но не редактируются.
- Коммит, который уже есть на удалённом репозитории, редактировать можно, но следующий пуш придётся делать форс-пушем — диалог предупреждает, прежде чем вы на это подпишетесь.
- Файлы, удалённые в коммите, редактировать нельзя (нет содержимого для правки).
См. также: Интерактивный ребейз · Восстановление и reflog · Поглощение