git commit --amend nám vie opraviť iba posledný commit. Čo ak ale chceme upraviť históriu hlbšie - napríklad
zmeniť poradie commitov, spojiť viacero z nich do jedného, alebo niektorý úplne odstrániť? Na to slúži
interaktívny rebase.
git rebase -i HEAD~4
Týmto príkazom povieš Gitu “chcem upraviť posledné 4 commity” (spomeň si na ~, ktorému sme sa venovali v kapitole
o navigácii v Git-e). Git ti otvorí textový editor so zoznamom týchto commitov:
pick 4d66c25 Pridanie tlačidla
pick aebabf5 Oprava layoutu
pick 915e2da Refaktoring
pick 89f779a Pridanie testov
# Rebase 1a2b3c4..89f779a onto 1a2b3c4 (4 commits)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# d, drop <commit> = remove commit
Dôležité: Poradie commitov v tomto zozname je opačné ako pri
git log- najstarší commit je hore, najnovší dole. Presúvaním riadkov teda vieš zmeniť aj poradie, v akom boli commity spravené.
pickKaždý riadok začína slovom, ktoré hovorí Gitu, čo má s daným commitom spraviť. Predvolený príkaz je pick -
“ponechaj tento commit tak, ako je”. Ak zoznam iba uložíš a zavrieš bez akýchkoľvek úprav, výsledná história bude
identická ako pred rebase-om.
Skutočná sila pick-u sa ukáže, keď riadky preusporiadaš. Napríklad zámenou poradia riadkov aebabf5 a
915e2da zmeníš poradie, v akom boli tieto dva commity spravené v histórii repozitára.
Note: Rovnako ako pri
--amend, aj interaktívny rebase vytvorí nové commity (s novými hashmi) pre všetko, čo sa nachádza za bodom, kde rebase začal. Ak niektorý z týchto commitov už bol zdieľaný s niekým iným, rebase mu prepíše históriu.
Tip: Ak sa počas rebase “niečo pokazí” alebo si to jednoducho rozmyslíš, vždy môžeš zavolať
git rebase --abort, ktorému sa bližšie venujeme v kapitole o konfliktoch.