Подтвердить что ты не робот

Измените фиксацию слияния с помощью git rebase

В Git, когда я совершу, например. A - B - C и я хочу отредактировать фиксацию B, I

  • использовать git rebase -i <A-commit-hash>,
  • в списке пишу edit перед B commit,
  • git rebase останавливается сразу после B commit, поэтому я могу исправить все, что хочу, используя git commit --amend,
  • а затем продолжаю использовать git rebase --continue.

Насколько я знаю, это лучшая практика, как это сделать. С помощью этого метода я могу редактировать любые фиксации в прошлом (пока он еще не был перенесен в удаленную ветвь), и более того, с флагом -p я могу даже сохранить слияния. Это просто здорово.

Моя текущая проблема: я допустил ошибку (опечатку) в одной строке в фиксации слияния (при разрешении конфликта при слиянии двух ветвей).

Я хотел бы исправить это, но я не знаю, как сделать git rebase для остановки при компиляции слиянием. В списке git rebase -p -i <blah> игнорируются комманды слияния, поэтому я не могу написать команду edit перед этим и сделать там git rebase, чтобы я мог ее редактировать.

Любая помощь, пожалуйста? Я просто хочу исправить эту строку в фиксации слияния, сохраняя при этом все коммиты (и слияния).

Спасибо.

4b9b3361

Ответ 1

Git не позволяет выполнять интерактивные переустановки при включении слияний. Опция -p использует механизм -i внутри, поэтому смешивание двух не работает.

Тем не менее, git rebase - это просто автоматизированный способ сделать много вишнёв. Вы можете реплицировать свое поведение путем ручной вишни, чтобы получить немного больше контроля над процессом. Это менее удобно и подвержено человеческой ошибке, но возможно.

Это подход, который я предлагаю:

  • используйте git rebase, чтобы перейти к фиксации после слияния (дочерний элемент слияния)
  • используйте git reset --hard HEAD^, чтобы вручную перейти к слиянию
  • используйте git commit --amend для восстановления слияния
  • используйте git cherry-pick, чтобы вернуться к фиксации после слияния
  • используйте git rebase --continue для завершения

Ниже приведены конкретные шаги:

  • Обратите внимание на идентификатор SHA1 слияния, которое вы хотите изменить. Для обсуждения предположим, что это deadbeef.
  • Обратите внимание на идентификатор SHA1 для фиксации сразу после фиксации слияния, которую вы хотите изменить (дочерний элемент слияния). Предположим, что это facef00d.
  • Запустите git rebase -i deadbeef.
  • Выберите facef00d для редактирования.
  • Когда rebase возвращает вас к приглашению для редактирования facef00d, запустите git reset --hard HEAD^. Теперь вы должны быть в deadbeef (git rev-parse HEAD должен печатать deadbeef).
  • Внесите свои изменения, чтобы исправить конфликт с неправильным слиянием и используйте git add для их создания.
  • Запустите git commit --amend, чтобы заблокировать поэтапное исправление с неудачной фиксацией слияния. Теперь результат будет иметь другой SHA1 (не deadbeef).
  • Запустите git cherry-pick facef00d, чтобы применить изменения, сделанные facef00d к фиксации с фиксированным слиянием.
  • Запустите git rebase --continue для завершения.

Ответ 2

Может быть проще создать фиксацию fixup 'D', а затем использовать 'git rebase -p -i <blah>', чтобы изменить порядок "D" сразу после "B" и выложить его на "B".

pick A
pick B  <- merge commit to ammend
fixup D
pick C