git rebase -i відкриває список комітів гілки, де кожному можна задати дію. Так історію з «wip», «fix typo», «ще фікс» перетворюють на кілька змістовних комітів.
git rebase -i main
pick a1b2c3d Add invoice model
squash d4e5f6a fix typo
pick 9f8e7d6 Send invoice email
fixup 1a2b3c4 forgot import
reword 5d6e7f8 wip
Основні дії:
pick- лишити коміт як є.reword- змінити повідомлення.squash- злити з попереднім, об'єднавши повідомлення.fixup- злити з попереднім, відкинувши повідомлення.edit- зупинитися на коміті, щоб змінити його чи розбити на кілька.dropабо видалити рядок - прибрати коміт.- Переставити рядки - змінити порядок комітів.
Зручний прийом - fixup-коміти:
git commit --fixup=a1b2c3d # «виправлення до коміту a1b2c3d»
git rebase -i --autosquash main # сам поставить fixup у потрібне місце
Навіщо: рев'юеру легше читати кілька логічних комітів, ніж двадцять випадкових; git bisect і git blame працюють точніше; коміт можна відкотити цілком.
Обережно: це переписування історії. Лише для своєї гілки, а потім - git push --force-with-lease. Якщо щось пішло не так, git rebase --abort повертає все як було, а після завершення врятує git reflog.
Багато команд обходяться без цього, вливаючи PR через squash merge - тоді вся гілка стає одним комітом у main.