Ветки и хирургия

Редактирование любого коммита

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

Редактирование исторического коммита

Что оно делает

Выберите любой коммит, являющийся предком HEAD — с линейной историей или без. Диалог показывает его файлы и сообщение; правьте что угодно из двух. Дальше происходят две вещи:

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

Авторство и даты каждого переигранного коммита сохраняются; меняются только хеши — в этом и состоит переписывание истории.

Слияния в диапазоне

Правка коммита под двумя слияниями — каскад их переигрывает

Merge между коммитом и HEAD больше не выключает редактирование. Каскад переигрывает слияние, накладывая его записанный результат — дерево, которое слияние действительно закоммитило, вместе с разрешениями конфликтов — на переписанного родителя, так что разрешения, сделанные кем-то вручную, переживают переписывание дословно. Без rerere, без повторного слияния, без рабочего дерева: тот же plumbing в памяти, что и в остальном каскаде, и оба указателя на родителей сохраняются. Боковая ветка, которая тоже содержит редактируемый коммит, переписывается и перенацеливается; та, что его не содержит, сохраняет свою идентичность нетронутой. Баннер в диалоге говорит, сколько слияний несёт диапазон, а шаги-слияния показывают в предпросмотре иконку слияния.

Честная оговорка: переигранное слияние ровно настолько хорошо, насколько хорош его записанный результат. Если ваша правка сталкивается со строками, которые разрешило само слияние, предпросмотр краснеет точно так же, как любой другой конфликтующий шаг — ничто не угадывается.

Когда каскад конфликтует

Более поздний коммит трогал те же строки, что вы правите. Предпросмотр помечает этот коммит красным вместе с конфликтующими файлами, и переписывание отказывается запускаться — ничего никогда не применяется наполовину. Либо правьте иначе, либо возьмите конфликт в лоб через интерактивный ребейз.

Ограничения

  • Коммит должен быть предком HEAD. У коммита на невлитой боковой ветке нет пути к вашей текущей ветке, по которому его можно переиграть.
  • Бинарные файлы и файлы больше 2 МБ показываются, но не редактируются.
  • Коммит, который уже есть на удалённом репозитории, редактировать можно, но следующий пуш придётся делать форс-пушем — диалог предупреждает, прежде чем вы на это подпишетесь.
  • Файлы, удалённые в коммите, редактировать нельзя (нет содержимого для правки).

См. также: Интерактивный ребейз · Восстановление и reflog · Поглощение

Улучшить этот перевод на GitHub