Как я могу разделить git commit, похороненный в истории?
я перепутал свою историю и хочу внести в нее некоторые изменения. Проблема в том, что у меня есть фиксация с двумя несвязанными изменениями, и эта фиксация окружена некоторыми другими изменениями в моей локальной (не выталкиваемой) истории.
Я хочу разделить эту фиксацию, прежде чем вытолкнуть ее, но большинство руководств, которые я вижу, связаны с разделением вашего последнего фиксации или незафиксированных локальных изменений. Возможно ли сделать это для фиксации, которая немного похоронена в истории, без необходимости " повторно делать" мои обязательства с тех пор?
3 ответов:
есть руководство по разделению коммитов в справочной странице rebase. Краткое резюме:
выполните интерактивную перебазировку, включая целевую фиксацию (например,
git rebase -i <commit-to-split>^ branch) и отметьте его для редактирования.когда ребаз достигает этого коммита, используйте
git reset HEAD^чтобы сбросить значение до фиксации, но сохранить дерево работы нетронутым.постепенно добавлять изменения и фиксировать их, делая столько коммитов, сколько желанный.
add -pможет быть полезно добавить только некоторые изменения в данный файл. Используйтеcommit -c ORIG_HEADесли вы хотите повторно использовать исходное сообщение фиксации для определенной фиксации.если вы хотите проверить, что вы совершаете (хорошая идея!) использовать
git stashчтобы скрыть часть, которую вы не совершили (илиstash --keep-indexпрежде чем вы даже совершите его), тест, тоgit stash popчтобы вернуть остальное в дерево работ. Продолжайте делать коммиты, пока не получите все изменения, т. е. есть чистое дерево работы.выполнить
git rebase --continueчтобы продолжить применение коммитов после коммита now-split.
разделить совершения
<commit>и добавить новый коммит перед этим, и сохранить дату автора<commit>, - шаги следующие:
редактирование совершения до
<commit>git rebase -i <commit>^^NB: возможно, это также будет необходимо для редактирования
<commit>как хорошо.сливки
<commit>в этом месяцеgit cherry-pick -n <commit>интерактивно сбросить ненужные изменения из индекса и сбросить рабочее дерево
git reset -p && git checkout-index -f -aв качестве альтернативы, просто заначка ненужных изменений в интерактивном режиме:
git stash push -p -m "tmp other changes"внесите другие изменения (если таковые имеются) и создайте новый commit
git commit -m "upd something" .при необходимости повторите пункты 2-4, чтобы добавить больше промежуточных коммитов.
продолжить перебазирование
git rebase --continue
Если вы еще не нажали, просто используйте
git rebase. Еще лучше, используйтеgit rebase -iдля перемещения коммитов в интерактивном режиме. Вы можете переместить нарушитель фиксации на фронт, а затем разделить его, как вам нравится, и переместить патчи обратно (если это необходимо).
Comments