Как ввести коммит между некоторыми двумя произвольными коммитами в прошлом?


предположим, что у меня есть следующая история фиксации в моей локальной ветке:

A -- B -- C

как вставить новую фиксацию между A и B?

4 61

4 ответа:

это даже проще, чем в ответе ОП.

  1. git rebase -i <any earlier commit>. Отобразится список коммитов в настроенном текстовом редакторе.
  2. найдите фиксацию, которую вы хотите вставить после (предположим, что это a1b2c3d). В вашем редакторе, для этой строки, изменить pick до edit.
  3. начните перебазирование, закрыв текстовый редактор (сохраните изменения). Это оставляет вас в командной строке с фиксацией, которую вы выбрали ранее (a1b2c3d)как будто это только что было совершено.
  4. внесите свои изменения и git commit (не внесение поправок, в отличие от большинства edit s). Это создает новую фиксацию после тот, который вы выбрали.
  5. 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, шаги следующие:

  1. git rebase -i hash-of-preA

  2. Git откроет ваш редактор. Содержание может выглядеть так:

    pick 8668d21 A
    pick 650f1fc B
    pick 74096b9 C
    

    изменить pick до edit:

    edit 8668d21 A
    pick 650f1fc B
    pick 74096b9 C
    

    сохранить и выйти.

  3. изменить код, а затем git add . && git commit -m "I"

  4. git rebase --continue

теперь ваша история фиксации Git preA -- A -- I -- B -- C


если вы столкнулись с конфликтом, Git остановится на этом фиксации. Вы можете использовать git diff чтобы найти маркеры конфликтов и разрешить их. После разрешения всех конфликтов необходимо использовать git add <filename> чтобы сообщить Git, что конфликт был разрешен, а затем перезапустить git rebase --continue.

если вы хотите отменить перебазирование, используйте git rebase --abort.

еще более простое решение:

  1. создайте свой новый коммит в конце, D. Теперь у вас есть:

    A -- B -- C -- D
    
  2. запустите:

    $ git rebase -i hash-of-A
    
  3. Git откроет ваш редактор и он будет выглядеть так:

    pick 8668d21 B
    pick 650f1fc C
    pick 74096b9 D
    
  4. просто переместите D наверх, как это, а затем сохранить и выйти

    pick 74096b9 D
    pick 8668d21 B
    pick 650f1fc C
    
  5. теперь у вас есть:

    A -- D -- B -- C