
Jak používat git rebase
Proč a jak používat git rebase pro přehlednou historii v Gitu.
Při práci ve více lidech s versovacím nástrojem Git je prakticky nevyhnutelný stav, kdy vývoj probíhá paraelně ve více větvích. V extrémním případě potom ve větvích různě od sebe odvozených.
Např. první feature branch odvozená z hlavní main
větve, ze které vychází další feature branch.
Příkaz git rebase
(popř. git merge
) se potom hodí pro synchronisaci větví mezi sebou, aby pořád vycházely z aktuálního mainu.
Merge vs. rebase
Obecně celkem platí, že git merge
používají dvě skupiny lidí:
- lidé, co moc nerozumí Gitu,
- lidé, co neřeší hezkou historii commitů
Hezká historie souvisí i s vytvářením smysluplných commitů.
Jsou i lidé, co se rebase
bojí. Přitom pro to moc není důvod – použití je dost jednoduché.
Základní rebase
Běžné použití je následovné:
Nejprve se stáhne aktuální stav:
git fetch
Do aktuální feature
větve se dostanou nové commity prostým:
git rebase origin/main
Co se stane:
- Git najde poslední společný commit obou větví.
- Dočasně uloží všechny commity z
feature
větve. - Přesune
feature
větev na konecmain
větve. - Postupně aplikuje uložené commity jeden po druhém.
Výsledkem je lineární historie, kde všechny commity z feature
větve následují po commitech z main
větve.
Nezbývá než změny pushnout. Je zde potřeba uvést přepínač force, protože se změnila historie.
git push -f
Případně jde rebase naklikat ve VS Code:
Rebase --onto
Příkaz git rebase --onto
se hodí pro případy, kdy moje větev vychází z větve, na které pracuje někdo jiný. A ten tam mění historii. To se obecně nepovažuje za dobrý postup, ale s rebase --onto to není problém.
git rebase --onto origin/cizi-vetev HEAD~
Tento příklad vezme můj poslední commit (HEAD~
) a umístí ho nad celou cizí větev. Starší commity se ignorují, takže nehrozí řešení nesmyslných konfliktů.
Interaktivní rebase
Interaktivní rebase je mocný nástroj pro úpravu historie:
git rebase -i HEAD~3
Otevře se editor s možnostmi:
pick
– ponechat commitreword
– změnit commit messageedit
– upravit commitsquash
– sloučit s předchozímfixup
– sloučit a zahodit messagedrop
– smazat commit
Řešení konfliktů
Při rebase mohou nastat konflikty. Git oznámí konflikt a zastaví rebase. Po vyřešení:
git add <conflicted-files>
git rebase --continue
Nebo můžete rebase zrušit:
git rebase --abort
Dobré praktiky
- Pravidelně rebaseovat s hlavní větví. Minimalisuje se tím nepěkné překvapení po dokončení úkolu s řešením hromady konfliktů.
- Mít
main
větev nastavenou jako protected. Jestliže se používá force push, je jen otázka času, kdy se člověk splete, a pustí to nadmain
větví. - Nepoužívat force push do větví, kde pracuje více lidí. Nebo nepracovat v jedné větvi ve více lidech, ale řešit to další odvozenou větví a merge/pull requestem.
Závěr
git rebase
je nástroj pro vytvoření čisté a lineární historie. Umožňuje přesunout commity na novou základnu a upravit historii před publikováním. Je to alternativa k merge, která zachovává přehlednou historii, ale vyžaduje opatrnost při používání na veřejných větvích.
Související články



Zvláštní znaky na české klávesnici v macOS
Jak v macOS na běžné české klávesnici pohodlně programovat a zapisovat všelijaké speciální znaky?

10+ věcí, jak AI pomáhá při programování
AI dokáže výrazně zvýšit efektivitu programátora. Nevezme mu ale práci?