Вопрос
Сделал я коммит, потом стал править код. Под конец правки осознал, что эта правка уже тянет на отдельную ветку.
Как сделать новый коммит так, чтобы образовалась новая ветка, и в нее поместилась последняя правка проекта?
Примечание
Я нашел команду checkout -m, которая вроде делает то что нужно. Но она вначале сохраняет изменение в текущей ветке, а изменения мне требуется сохранить в новой ветке:
Если в текущей ветке были какие-то изменения по сравнению с последним коммитом в ветке (HEAD), то команда checkout откажется производить переключение на другую ветку, дабы не потерять произведенную работу.
Предполагаю, что в случае, когда изменения надо все же сохранить, у команды checkout используют ключ -m. Тогда команда перед переключением попробует залить изменения в текущую ветку и, после разрешения возможных конфликтов, переключиться в новую:
checkout -m some-other-branch
... но, видимо, так Git работать не будет.
Ответ
Нужно спрятать в "карман" (stash) незакоммиченные (непроиндексированные и проиндексированные) изменения через команду git stash. При выполнении этой команды изменения спрячутся в "карман", а рабочая директория вернется к начальному состоянию текущего коммита. Далее надо создать новую ветку и переключиться на нее. Потом достать изменения из кармана, и они применятся к той ветке, на которую произошло переключение.
Команды будут такими:
$ git stash
$ git checkout -b new_useless_feature
$ git stash pop
После этого можно продолжить работать обычным способом. Вначале дается команда git add ., потом git commit, и изменения будут залиты в новую ветку.