Git: Интерактивно перебазировать ряд коммитов

Я пытаюсь rebase -i несколько коммитов, которые произошли некоторое время назад в моей истории. Скажем, у меня есть журнал как это:

* 5e32fb0 (HEAD -> master) Add latest feature
* 106c31a Add new feature
* 2bdac33 Add great feature
...100 other commits...
* 64bd9e7 Add test 3
* 3e1066e Add test 2
* 26c612d Add test 1
* 694bdda Initialize repo

и я хочу раздавить 3 теста. В этих обстоятельствах git rebase -i HEAD~106 не очень практично Вместо этого я ищу что-то вроде git rebase -i 64bd9e7:26c612d,

Есть ли у git такое поведение, и если да, то как я могу его использовать?

Я посмотрел этот пост, но он не ответил на мой вопрос.

3 ответа

Решение

Чтобы уничтожить эти три коммита, вам нужно переписать историю для всего хранилища. То есть все хеши коммитов для коммитов после этих тестовых коммитов будут изменены. На мой взгляд, самый простой способ сделать это:

  1. Создать временную ветку и оформить заказ, указывая на 64bd9e7,
  2. Сквош три коммитов вместе.
  3. Извлеките свою основную ветку и сразу же сбросьте ее до коммита 64bd9e7,
  4. Перебазируйте его на временную ветку

Просто используйте rebase -i и раздавить только те коммиты.

git rebase -i <main_branch>
# Now just add `s` in front of all the commits you want to squash

Если у вас много коммитов, я бы посоветовал вам взглянуть на rebase --onto -

git rebase --onto <final_base_commit> <initial_base_commit> <head>

git rebase --onto 694bdda 64bd9e7 5e32fb0

Примечание. Перезапись истории - сложная операция, поэтому действуйте осторожно.

Учебник по Git ReBase

Ты говоришь " не очень практично».

Если вы имеете в виду, что результирующий файл сценария имеет длину>100 строк, это не очень хорошо, но это сработает.

Если вы имеете в виду, что утомительно отсчитывать, отрабатывать, что нужно 106 коммитов — как иногда со мной бывает, то есть решение.

Вам нужен хэш родителя самой ранней фиксации, которую вы хотите, тогда вы можете сделать:

      git rebase -i <parent-hash> my-branch

Или вы можете сделать

      git rebase -i <parent-hash> HEAD

что впоследствии оставит вас с оторванной головой, с которой вы можете делать, что хотите.

Итак, в вашем примере вы могли бы сделать

      git rebase -i 694bdda HEAD

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

Другие вопросы по тегам