Добавить изменения в фиксации в середине в Git

Как добавить новые изменения в коммиты, которые находятся посередине, я имею в виду не добавлять верхнюю фиксацию.

git log
commit1 <--- HEAD
commit2
commit3

Как добавить изменения непосредственно в commit3, не удаляя commit1 и commit2, а затем добавляя изменения в commit3.

Нужно ли использовать тайник?

Если возможно, укажите ссылку.

Ответ 1

Вам нужно сделать интерактивную перезагрузку. Прочтите справочную страницу для git rebase для деталей. Короткий ответ заключается в том, что вы продолжите выполнение своих "средних" изменений, как обычно, затем запустите git rebase -i HEAD~4. Он отобразит список последних 3 коммитов в текстовом редакторе. Просто переупорядочивайте коммиты, где новая фиксация помещается посередине, а затем сохраняйте и выходите из редактора. git затем попытается перестроить историю в новом порядке. Это может закончиться конфликтами. Если это так, исправьте их так, как будто бы для конфликта слияния, а затем запустите git rebase --continue после того, как все они будут исправлены и добавлены. Он сообщает вам все это, когда у вас есть конфликт, поэтому просто читайте сообщения об ошибках, и вы должны быть в порядке.

EDIT: на самом деле, похоже, вы хотите отредактировать существующий коммит. В этом случае, когда редактор появится, переместите новую временную фиксацию рядом с commit3, а затем измените команду на "squash" из "pick":

pick 123456 commit3
squash 541343 tmpcommit
pick 654321 commit2
pick 431523 commit1

EDIT2: если ветка и commit1, commit2 и commit3 уже общедоступны, тогда вы не должны быть перегружены. Опять же, вы не должны вносить изменения в коммиты, так что весь вопрос будет спорным. Я предполагаю, что это частная ветвь или другая, которую другие ожидают от переустановки и перематывания.

Ответ 2

Вы можете сделать это с помощью git-rebase:

git rebase -i commit3^

В всплывающем файле измените pick commit3 на edit commit3. Сохраните и выйдите, а затем внесите изменения. Зафиксируйте их, как обычно, а затем используйте git rebase --continue. Когда вы закончите, вы увидите новые изменения между commit3 и commit2.

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

Ответ 3

Создайте новую ветку, которая является копией commit3. Добавьте свои изменения и зафиксируйте. Затем объедините commit2 и commit1 в эту ветвь.