5 pravidel pro lineární historii větví bez merge commitů

Z Mazovia

Jak si poradit se skvrnami a zápachem bez pá

Základem je rebase místo merge při aktualizaci vlastní větve. Když na feature větvi pracujete déle, hlavní větev mezitím odjede dopředu. Místo git merge main použijte git rebase main. Git vezme vaše commity, dočasně je odloží, přesune větev na nový vrchol main a commity znovu přehraje. Výsledek je lineární: žádný merge commit, žádné dvojité rodiče. Podmínkou je, že svou větev máte pouze lokálně a nikdo jiný na ní nepracuje.

Filtrační houba není zázrak ani zbytečnost. Je to nástroj, který má smysl jen tehdy, když víte, co od něj chcete a co voda skutečně obsahuje. Většina lidí ji koupí, protože je levná a snadno dostupná, a pak se diví, že chuť vody se nezměnila nebo že se houba po pár dnech rozpadá. Rozdíl mezi funkční filtrací a placebo efektem spočívá v pochopení toho, co houba umí a co ne.

Barvy, které stěnu rozpust

Čalouněná pohovka je centrem obývacího pokoje, a proto na ní ulpívá prach, mastnota z rukou, pot i drobky. Pára je sice účinná, ale mnohé potahy ji nesnesou – smrští se, ztratí barvu nebo se na nich vytvoří mapy. Existuje však řada suchých postupů, které zvládnete bez rizika a s věcmi, které už máte doma. Než začnete, vždy si nejprve vyzkoušejte zvolený prostředek na méně viditelném místě, například na spodní straně opěradla nebo na zadní hraně sedáku.

Merge commity vznikají ve chvíli, kdy do sebe sloučíte dvě větve, které se od sebe mezitím rozešly. Pro týmový vývoj to znamená jednu nepříjemnost: historie přestává být čitelná. Každý merge commit je místo, kde se ztrácí informace o tom, kdo co skutečně napsal a v jakém pořadí. Řešením je udržovat historii lineární tím, že změny před sloučením vždy přenesete na aktuální vrchol cílové větve. Následující pravidla popisují, jak to dělat bez zbytečných konfliktů a jak se vyhnout typickým chybám.

Než začnete cokoli balit, projděte nové prostory a změřte je. Výtah, šířka dveří, nosnost podlahy a počet zásuvek rozhodují o tom, co se vejde a co bude potřeba dokoupit. Zjistěte také, kdy je možné nastěhovat se – někteří pronajímatelé povolují vjezd až po kolaudaci, jindy je potřeba ohlásit stěhování správci budovy. Naplánujte termín tak, aby nekolidoval s uzávěrkou, inventurou ani s největší sezónou.

Kdy rebase bolí a jak tomu předejít Rebase přepisuje historii. Pokud už jste svou větev pushnuli na sdílený remote a kolega si ji stáhl, přepis mu rozbije lokální kopii. Proto platí: rebasujte jen to, co ještě není ve sdíleném repozitáři. Pro vzdálenou větev použijte git push --force-with-lease, nikdy ne obyčejný --force. Rozdíl je zásadní: --force-with-lease odmítne push, pokud někdo mezitím na remote něco přidal, takže nepřepíšete cizí práci. Pokud tým pracuje na jedné větvi společně, rebase je špatný nástroj a je lepší se domluvit na jiném postupu.

Lineární historie není dogma. Je to nástroj pro týmy, kde se na jedné větvi střídá více lidí a kde je rychlá orientace v commitech důležitější než přesné zachování větvení. Pokud tato podmínka neplatí, merge commity ničemu nevadí. Rozhodněte se jednou a držte se toho v celém týmu, jinak vznikne mix, ve kterém se nevyzná nikdo.

Před sloučením do hlavní větve používejte interaktivní rebase: git rebase -i main. Nabídne vám seznam commitů, které můžete sloučit, přejmenovat nebo zahodit. Sloučením několika commitů do jednoho odstraníte šum typu „oprava překlepu" a „ještě jedna úprava". Výsledná historie pak obsahuje jeden smysluplný záznam pro jednu logickou změnu. Pozor na commity, které už jsou na remote v hlavní větvi, ty nikdy nepřepisujte.

Konflikty při rebase jsou běžné a řeší se stejně jako u merge, ale s jedním rozdílem: musíte je vyřešit pro každý přehrávaný commit zvlášť. Po vyřešení spusťte git add a pokračujte přes git rebase --continue. Když se dostanete do slepé uličky, git rebase --abort vrátí vše do původního stavu. Typická chyba je, že lidé v panice smažou celou větev a začnou znovu. To není nutné, dokud znáte hash původního stavu, který najdete v git reflog.

Posledním krokem je sloučení do main bez merge commitu. Existují dvě možnosti: fast-forward, kdy se hlavní větev jen posune na váš vrchol, nebo takzvaný squash, kdy se všechny vaše commity sloučí do jednoho. Fast-forward zachová jednotlivé commity, squash je nahradí jedním. Volba závisí na tom, jak detailní historii chcete. Ať zvolíte cokoli, výsledkem je lineární řada commitů bez merge uzlů. To oceníte při hledání chyby nástrojem git bisect, protože každý krok je jeden commit a není třeba řešit, kterou větev vlastně testujete.