Вопрос

Я снял свою историю и хочу сделать некоторые изменения в нее. Проблема в том, что у меня есть коммит с двумя несвязанными изменениями, и этот коммит окружен некоторыми другими изменениями в моей локальной (не подтолкнутой) истории.

Я хочу разделить эту коммит, прежде чем оттолкнуть его, но большинство руководств, которые я вижу, приходится делать с расщеплением ваших самых последних коммит, или незаменимых местных изменений. Это возможно, чтобы сделать это с комминтом, которое немного похоронено в истории, без необходимости «повторить» моим коммитам с тех пор?

Это было полезно?

Решение

Есть руководство по разделению коммитов в Manpage 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 продолжить подачу заявки на коммиты после теперь посвященного фиксации.

Другие советы

Вот как это сделать с Маги.

Скажем, commit ed417ae - это тот, который вы хотите изменить; Он содержит два несвязанных изменения и похоронен под одним или несколькими комми. Ударять ll Чтобы показать журнал и перейти к ED417AE:

initial log

Затем ударить r Чтобы открыть всплывающее окно Rebase

rebase popup

и m изменить коммит в точке.

Обратите внимание, как @ Сейчас есть на коммите, который вы хотите разделить - это означает, что Head теперь на этом коммите:

modifying a commit

Мы хотим переместить голову на родитель, поэтому перейдите к родителю (47E18B3) и нажмите x (magit-reset-quickly, связано o Если вы используете evil-magit) И войти, чтобы сказать «Да, я имел в виду коммит в точке». Теперь ваш журнал должен выглядеть:

log after resetting

Теперь ударил q Чтобы перейти к обычному статусу Magit, затем используйте регулярные неспособность u Команда для расстройства того, что не идет в первый коммит, совершать c остальное как обычно, то sТейдж и cОмит, что происходит во втором коммите, и когда сделано: ударить r Чтобы открыть всплывающее окно Rebase

rebase popup

и другой r продолжить, и все готово! ll Теперь показывает:

all done log

Разделить коммит <commit> и добавить Новое совершение до этого, и сохранить дату автора <commit>, - шаги следуют:

  1. Редактировать коммин до <commit>

    git rebase -i <commit>^^
    

    NB: Возможно, это также нужно для редактирования <commit> также.

  2. Вишня <commit> в индекс

    git cherry-pick -n <commit>
    
  3. Индивидуальный сброс ненужных изменений от индекса и сброса рабочего дерева

    git reset -p && git checkout-index -f -a
    

    Как альтернатива, просто Stash ненужденные изменения в интерактивном режиме: git stash push -p -m "tmp other changes"

  4. Сделать другие изменения (если есть) и создайте новый коммит

    git commit -m "upd something" .
    

    Необязательно, повторите элементы 2-4, чтобы добавить более промежуточные коммиты.

  5. Продолжайте перезаботиться

    git rebase --continue
    

Если вы еще не выталкивали, просто используйте git rebase. Анкет Еще лучше, используйте git rebase -i двигаться в интерактивном отношении. Вы можете переместить оскорбительный коммит на фронт, затем разделить его, как вам нравится, и переместите патчи назад (при необходимости).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top