Как ввести коммит между некоторыми двумя произвольными коммитами в прошлом?
предположим, что у меня есть следующая история фиксации в моей локальной ветке:
A -- B -- C
как вставить новую фиксацию между A и B?
4 ответа:
это даже проще, чем в ответе ОП.
git rebase -i <any earlier commit>. Отобразится список коммитов в настроенном текстовом редакторе.- найдите фиксацию, которую вы хотите вставить после (предположим, что это
a1b2c3d). В вашем редакторе, для этой строки, изменитьpickдоedit.- начните перебазирование, закрыв текстовый редактор (сохраните изменения). Это оставляет вас в командной строке с фиксацией, которую вы выбрали ранее (
a1b2c3d)как будто это только что было совершено.- внесите свои изменения и
git commit(не внесение поправок, в отличие от большинстваedits). Это создает новую фиксацию после тот, который вы выбрали.git rebase --continue. Это повторяет последовательные коммиты, оставляя ваш новый коммит вставленным в правильное место.остерегайтесь, что это перепишет историю и сломает любого, кто попытается вытащить.
оказывается довольно просто, ответ найден здесь. Предположим, вы находитесь на ветке
branch. Выполните следующие действия:
создайте временную ветвь из фиксации после того, как вы хотите вставить новую фиксацию (в этом случае commit
A):git checkout -b temp Aвыполните изменения и зафиксируйте их, создав фиксацию, назовем ее
N:git commit -a -m "Message"(или
git addзатемgit commit)перебазируйте коммиты, которые вы хотите иметь после нового коммита (в этом случае commits
BиC) на новый коммит:git rebase temp branch(возможно, вам нужно использовать
-pчтобы сохранить слияния, если таковые были-спасибо больше не существует комментарий by ciekawy)
удалить временные филиал:
git branch -d tempпосле этого история выглядит следующим образом:
A -- N -- B -- Cконечно, возможно, что некоторые конфликты появятся при перезагрузке.
в случае, если ваш филиал не является локальным-только это приведет к переписыванию истории, поэтому может вызвать серьезные проблемы.
предполагая, что история фиксации
preA -- A -- B -- C, Если вы хотите вставить коммит междуAиB, шаги следующие:
git rebase -i hash-of-preAGit откроет ваш редактор. Содержание может выглядеть так:
pick 8668d21 A pick 650f1fc B pick 74096b9 Cизменить
pickдоedit:edit 8668d21 A pick 650f1fc B pick 74096b9 Cсохранить и выйти.
изменить код, а затем
git add . && git commit -m "I"
git rebase --continueтеперь ваша история фиксации Git
preA -- A -- I -- B -- C
если вы столкнулись с конфликтом, Git остановится на этом фиксации. Вы можете использовать
git diffчтобы найти маркеры конфликтов и разрешить их. После разрешения всех конфликтов необходимо использоватьgit add <filename>чтобы сообщить Git, что конфликт был разрешен, а затем перезапуститьgit rebase --continue.если вы хотите отменить перебазирование, используйте
git rebase --abort.
еще более простое решение:
создайте свой новый коммит в конце, D. Теперь у вас есть:
A -- B -- C -- Dзапустите:
$ git rebase -i hash-of-AGit откроет ваш редактор и он будет выглядеть так:
pick 8668d21 B pick 650f1fc C pick 74096b9 Dпросто переместите D наверх, как это, а затем сохранить и выйти
pick 74096b9 D pick 8668d21 B pick 650f1fc Cтеперь у вас есть:
A -- D -- B -- C