Как я могу разделить git commit, похороненный в истории?



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



Я хочу разделить эту фиксацию, прежде чем вытолкнуть ее, но большинство руководств, которые я вижу, связаны с разделением вашего последнего фиксации или незафиксированных локальных изменений. Возможно ли сделать это для фиксации, которая немного похоронена в истории, без необходимости " повторно делать" мои обязательства с тех пор?

640   3  

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>, - шаги следующие:

  1. редактирование совершения до<commit>

    git rebase -i <commit>^^
    

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

  2. сливки <commit> в этом месяце

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

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

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

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

    git commit -m "upd something" .
    

    при необходимости повторите пункты 2-4, чтобы добавить больше промежуточных коммитов.

  5. продолжить перебазирование

    git rebase --continue
    

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

Comments

    Ничего не найдено.