9.1 Interaktívny Rebase - Pick

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.

Spustenie interaktívneho 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é.

Príkaz pick

Kaž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.