Разбить коммит на несколько коммитов - PullRequest
0 голосов
/ 12 февраля 2020

Позвольте мне быть ясным заранее: я раздавил, зафиксировал и подтолкнул к публикации c истории каждого коммита в ветви. В истории publi c есть только один коммит. Мой рабочий каталог чистый. Никаких изменений в файлах нет.

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

I'm В настоящее время используется GitKraken, поэтому предложения по его использованию будут оценены. В нем не реализован полный набор функций (например, git commit --allow-empty. Ничего особенного.), Но я могу получить доступ к командной строке, чтобы сделать все, что он непосредственно не поддерживает.

1 Ответ

1 голос
/ 12 февраля 2020

Чтобы разделить один коммит на несколько коммитов (например, используя командную строку git):

Необязательно: git branch backupBranchName

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

  1. git reset HEAD^

Отмена текущего коммита, пока сохранение изменений с мягким сбросом. Ранее зафиксированные изменения теперь станут неустановленными изменениями.

git add --patch .

Выберите первое подмножество изменений, чтобы сформировать первый коммит, и подготовьте их. Если они уже разделены по файлам, вы можете легко выбрать, какие файлы ставить. Скорее всего, могут быть несвязанные изменения в тех же файлах, которые вы разберете sh. В этом случае вы можете интерактивно выбирать, какие блоки добавить, используя параметр -p или --patch. Возможно, вам придется «разделить» фрагменты, чтобы получить правильный набор изменений. Если независимые изменения не изменяют аналогичные разделы кода, этого должно быть достаточно. Если независимые изменения изменяют одну и ту же строку, вам может потребоваться временно отредактировать эти строки в редакторе исходного кода.

git stash --keep-index

Проверьте свои изменения. Возможно, вы захотите проверить набор изменений, который вы поставили, чтобы убедиться, что код по-прежнему собирается правильно, и все модульные тесты пройдены. Для этого вам нужно временно приостановить sh изменения, которые вы не добавляете в текущий коммит. Уже внесенные изменения должны остаться, чтобы их можно было построить и протестировать.

git commit

Создать новый коммит.

git stash pop

Unsta sh оставшиеся изменения и продолжить разбиение с шага 2.


Как вы уже выдвинули, история вашего нового работа будет отличаться, как только вы выполните вышеуказанные шаги. Это означает, что вы не можете просто отправить sh в ту же ветку, так как Git отклонит изменения. Вы можете вместо этого добавить pu sh в качестве новой ветки. В качестве альтернативы, и вам нужно долго и усердно подумать, прежде чем сделать это, вы можете заставить pu sh ветвь перезаписать историю в удаленном хранилище, но делать это только тогда, когда это не мешает другим людям, работающим в том же хранилище, кто, возможно, построил старую историю. Вынужденное толкание часто считается плохой практикой, поэтому тщательно продумайте, когда его использовать. Более стандартная практика заключается в пу sh новой ветке, открытии нового запроса на извлечение и закрытии любого старого запроса на извлечение.

...