Как ввести коммит между некоторыми двумя произвольными коммитами в прошлом?
предположим, что у меня есть следующая история фиксации в моей локальной ветке:
A -- B -- C
как вставить новую фиксацию между A
и B
?
4 ответа:
это даже проще, чем в ответе ОП.
git rebase -i <any earlier commit>
. Отобразится список коммитов в настроенном текстовом редакторе.- найдите фиксацию, которую вы хотите вставить после (предположим, что это
a1b2c3d
). В вашем редакторе, для этой строки, изменитьpick
доedit
.- начните перебазирование, закрыв текстовый редактор (сохраните изменения). Это оставляет вас в командной строке с фиксацией, которую вы выбрали ранее (
a1b2c3d
)как будто это только что было совершено.- внесите свои изменения и
git commit
(не внесение поправок, в отличие от большинстваedit
s). Это создает новую фиксацию после тот, который вы выбрали.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-preA
Git откроет ваш редактор. Содержание может выглядеть так:
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-A
Git откроет ваш редактор и он будет выглядеть так:
pick 8668d21 B pick 650f1fc C pick 74096b9 D
просто переместите D наверх, как это, а затем сохранить и выйти
pick 74096b9 D pick 8668d21 B pick 650f1fc C
теперь у вас есть:
A -- D -- B -- C