Отредактируйте коммит с помощью git rebase - PullRequest
47 голосов
/ 29 марта 2012

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

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

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

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

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

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

Спасибо.

Ответы [ 2 ]

72 голосов
/ 31 марта 2012

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

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

Я предлагаю такой подход:

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

Вот конкретные шаги:

  1. Обратите внимание на идентификатор SHA1 длякоммит слияния, который вы хотите изменить.Для обсуждения предположим, что это deadbeef.
  2. Обратите внимание на идентификатор SHA1 коммита сразу после коммита слияния, который вы хотите изменить (потомок коммита слияния).Предположим, это facef00d.
  3. Выполнить git rebase -i deadbeef.
  4. Выберите facef00d для редактирования.
  5. Когда rebase вернет вас к приглашению для редактирования facef00d,запустить git reset --hard HEAD^.Теперь вы должны быть на deadbeef (git rev-parse HEAD должен печатать deadbeef).
  6. Вносить изменения, чтобы исправить некорректный конфликт слияния, и использовать git add для их постановки.
  7. Выполнитьgit commit --amend объединить поэтапное исправление с неверным коммитом слияния.Теперь результат будет иметь другой SHA1 (не deadbeef).
  8. Выполнить git cherry-pick facef00d, чтобы применить изменения, сделанные с помощью facef00d, к фиксированному коммиту слияния.
  9. Выполнить git rebase --continueзакончить.
1 голос
/ 28 апреля 2017

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

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