Git - přidávání částí souborů do commitu

2 Git, Windows, Linux

Git umožňuje skvělou věc, a to přidání do staging area a poté i do commitu jednotlivé hunky, neboli části souboru. K čemu to je dobré a proč tuto funkcionalitu by měl každý znát?

Git - přidávání částí souborů do commitu

Tento článek patří do seriálu Jak na git. Ostatní články seriálu:


Co když je potřeba přidat do commitu pouze část souboru? Vracet v editoru všechny ostatní změny, přidat soubor do staging area a poté udělat vše znova, pěkné určitě není. Naštěstí git na to má nástroje, a rozhodně se to hodí a každý by o této možnosti měl minimálně vědět.

Pro případ neznalosti GITu pomocí příkazové řádky, může být nápomocen seriál Jak na git. Přidávaní jednotlivých řádků i hunků umí také některé nástroje. Nejlépe propracované to má ale rozhodně GitKraken.

Patch - jednotlivé přidávání hunků

Není potřeba žádný kouzelný příkaz, vše se děje pomocí git add. Trik ale spočívá v přepínači -p nebo delší --patch. Git bude zobrazovat jednotlivé hunky (části souboru) a u každého se dá rozhodnout, jestli se přidá do staging area nebo ne. 

# Spuštění patch módu
git add -p index.html

Při spuštění git okamžitě zobrazí první hunk, a je potřeba vybrat akci, ne u všech možností je na první pohled zřejmé co dělají. Naštěstí zde je možnost vyvolat nápovědu pomocí ?
Pár základních možností:

Ukázka rozdělení hunku

Ruční editace hunku

Ruční editace nemusí být zřejmá hned zezačátku, v nápovědě pod hunkem je napsáno jak odebrat jednotlivé typy řádků. Někdy je ale potřeba opravit čísla nahoře mezi @@ a @@, což může být problém. V novějších verzích gitu ale již tato akce mnohdy není potřeba.

Pokud je tedy vybrána ruční editace, tj volba e, uživatel může určovat, které řádky chce přidat a které nepřidat, do staging area.
Pokud je řádek označen znakem – (mínus), v souboru byl, ale bude odebrán. Pokud se nemá odstranit,  znak  se přepíše na " " (mezera). Nestačí znak smazat, musí se i vložit mezera.
Pokud je řádek označek znakem +, v souboru je nově a bude přidán. Pokud přidán být nemá, musí se smazat celý řádek. Pozor na mazání pouze řádku, ničeho jiného v okolí.

V příkladu na screenu níže zůstane v kódu jak jquery, tak libraries skript. Navíc se ještě neodstraní volání funkcní pro staré IE a ani logování do console se nepřidá do staging area. Na screenu je upraven i číselný diff zápis v záhlaví, i když by potřeba měnit tyto čísla nebyla.

Manuální editace hunku

Jak na změnu rozsahu diff zápisu

Jak je zmíněno, v novějších verzích gitu není potřeba toto záhlaví měnit. Pokud ale přidání hunku selže, a není to z důvodu překlepu, bude nutné trochu čísla upravit.

# Rozsah diff zápisu
@@ -A,B +C,D @@

# A - na kterém řádku v souboru před úpravou hunk začíná
# B - kolik řádků ze souboru před úpravou hunk obsahuje
# C - na kterém řádku v souboru po úpravě hunk začíná
# D - kolik řádků ze souboru po úpravě hunk obsahuje

Určení hodnot je asi nejjednodušší spočtením. Do původního počtu řádků se počítají řádky začínající " " (mezera) a – (mínus), do počtu řádků po úpravě se počítají řádky začínající " " a + (plus). Začínající řádky pak porovnat se souborem.

Rušení změn

Stejně jako přepínač -p funguje u příkazu git add, funguje také u git checkout a git reset. To může být užitečné, pokud je potřeba zrušit, nebo vrátit změny, pouze v části souboru.

git checkout -p index.html
git reset -p a5fb732 index.html

Interaktivní mód

Interaktivní mód je rozšíření pro příkaz git add k rychlejší práci se soubory. Prvně se vybere akce, která se má provést. Poté se jednoduše čísly označují soubory, se kterými se má daná akce provést. Pro ukončení se stiskne enter, když je řádek prázdný a git vybranou akci provede pro vybrané soubory. Velmi užitečný příkaz, který může některé akce velmi urychlit.

# Spuštění interaktivního módu
git add -i

Zkušenosti, tipy, rady, to vše můžete sdílet v komentářích...

K tomuto článku již není možné přidávat další komentáře

Komentáře

Nezkoušel jsi to náhodou i v SourceTree?

No když jsi to teď zmínil, tak jsem to zkusil a lze to. Když začneš označovat řádky (Windows s CTRL pro označení více), tak se ti tlačítko Stage hunk změní na Stage lines.

Viz screen: https://www.kutac.cz/image/sourcetree-stage-lines-07908.png