git rebase příkaz má pověst pro bytí magické Git voodoo že začátečníci by se měli držet dál od, ale to může skutečně učinit život mnohem jednodušší pro vývoj týmu, když používány s opatrností. V tomto článku budeme porovnávat git rebase související git merge příkaz a identifikovat všechny potenciální příležitosti začlenit rebasing do typické Git workflow.,

Koncepční Přehled

první věc, kterou musíte pochopit, o git rebase je, že to řeší stejný problém jako git merge. Oba tyto příkazy jsou navrženy tak, aby integrovaly změny z jedné větve do jiné větve—prostě to dělají velmi odlišnými způsoby.

zvažte, co se stane, když začnete pracovat na nové funkci ve vyhrazené větvi, pak další člen týmu aktualizuje větev master s novými commity. Výsledkem je vidlicová historie, která by měla být známa každému, kdo použil Git jako nástroj pro spolupráci.,

Nyní, řekněme, že nová zavazuje v master jsou důležité pro funkce, které pracujete na. Chcete-li začlenit nové commity do větve feature, máte dvě možnosti: sloučení nebo rebasing.,

Sloučit Možnost

nejjednodušší možnost je sloučit master větve do větve funkcí, pomocí něco jako následující:

git checkout feature git merge master

Nebo můžete kondenzovat to jedno-liner:

 git merge feature master

tím se vytvoří nový „merge commit“ v feature pobočky, které v sobě spojuje příběhy obou větví, což vám pobočka struktura, která vypadá takhle:

Sloučení je pěkné, protože to je non-destruktivní operace. Stávající pobočky se nijak nemění., Tím se zabrání všem možným úskalím rebasingu (diskutováno níže).

na druhou stranu to také znamená, že větevfeature bude mít pokaždé, když potřebujete začlenit změny proti proudu, cizí sloučení. Pokud je master velmi aktivní, může to trochu znečistit historii větve funkcí. I když je možné tento problém zmírnit pokročilými možnostmi git log, může ostatním vývojářům ztěžovat pochopení historie projektu.,

Rebase Možnost

Jako alternativu ke slučování, můžete rebase feature pobočky na master pobočky pomocí následujících příkazů:

git checkout feature git rebase master

Tento se pohybuje celá feature pobočka začít na špičce master pobočky, efektivně začlenit všechny nové commity v master. Namísto použití commitu merge však rebasing znovu zapíše historii projektu vytvořením zcela nových commitů pro každou commit v původní větvi.,

hlavní výhodou rebasingu je, že získáte mnohem čistší historii projektu. Za prvé, eliminuje zbytečné merge commity požadované git merge. Za druhé, jak vidíte ve výše uvedeném diagramu, rebasing také vede k dokonale lineární historii projektu-můžete sledovat špičku feature až na začátek projektu bez vidlic. To usnadňuje navigaci projekt s příkazy jako git log git bisect gitk.,

ale existují dva kompromisy pro tuto nedotčenou historii commitu: bezpečnost a sledovatelnost. Pokud se nebudete řídit zlatým pravidlem Rebasingu, může být opětovné psaní historie projektu potenciálně katastrofické pro Váš pracovní postup spolupráce. A, méně je nejdůležitější, rebasing ztrácí souvislosti poskytována merge commit—nemůžeš vidět, když upstream změny byly začleněny do funkce.

Interaktivní Rebasing

Interaktivní rebasing vám dává možnost změnit se zavazuje tak, že jsou přesunuty do nové větve., To je ještě silnější než automatizovaná rebase, protože nabízí úplnou kontrolu nad historií odevzdání pobočky. Obvykle se používá k vyčištění chaotické historie před sloučením větve funkcí do master.,

začít interaktivní rebasing sezení, projít i možnost git rebase příkaz:

git checkout feature git rebase -i master

otevřít textový editor seznam všech commitů, které mají být přesunuty:

pick 33d5b7a Message for commit #1 pick 9480b3d Message for commit #2 pick 5c67e61 Message for commit #3

Tento zápis definuje přesně to, co větev bude vypadat po rebase se provádí. Změnou příkazu pick a/nebo opětovným uspořádáním položek můžete vytvořit historii větve tak, jak chcete., Například, pokud 2. commit opravuje malý problém v 1. zavázat, můžete kondenzují je do jednoho spáchat s fixup příkaz:

pick 33d5b7a Message for commit #1 fixup 9480b3d Message for commit #2 pick 5c67e61 Message for commit #3

Když si soubor uložte a zavřete, Git bude provádět rebase podle vašich instrukcí, což v historii projektu, který vypadá jako následující:

Odstranění nevýznamné spáchá jako to dělá vaše funkce historie je mnohem snazší pochopit. To je něco, co git merge prostě nemůže udělat.,

Zlaté Pravidlo Rebasing

Jakmile pochopíte, co rebasing je, nejdůležitější věc, kterou musíte naučit, je, když to nedělá. Zlaté pravidlo git rebase je nikdy nepoužívat na veřejných pobočkách.

například, přemýšlet o tom, co by se stalo, kdyby jste rebased master na feature pobočka:

rebase pohyby všech commitů v master na konec feature. Problém je v tom, že se to stalo pouze ve vašem úložišti., Všichni ostatní vývojáři stále pracují s původním master. Od rebasing výsledky ve zbrusu nových zavazuje, Git bude myslet, že vaše master pobočka historie se lišily od všech ostatních.

jediný způsob, jak synchronizovat dva master větve je sloučit dohromady, což navíc merge commit a dvě sady zavazuje, že obsahují stejné změny (ty původní, a ty, které z vašeho rebased větev). Netřeba dodávat, že je to velmi matoucí situace.,

takže před spuštěním git rebase se vždy zeptejte sami sebe: „dívá se na tuto větev někdo jiný?“Pokud je odpověď Ano, sundejte ruce z klávesnice a začněte přemýšlet o nedestruktivním způsobu provedení změn (např. příkaz git revert). V opačném případě můžete bezpečně přepsat historii tak, jak chcete.

Síla Tlačí

Pokud se pokusíte, aby se zasadila rebased master větev zpět do vzdáleného repozitáře, Git vám zabrání dělá proto, že je v rozporu s dálkovým master pobočku., Ale, můžete vynutit push projít průchodem --force vlajky, tak jako:

# Be very careful with this command! git push --force

Tento přepíše vzdáleným master pobočky tak, aby odpovídala rebased jeden z vašeho úložiště a dělá věci velmi matoucí pro zbytek vašeho týmu. Takže buďte velmi opatrní používat tento příkaz pouze tehdy, když přesně víte, co děláte.

jedním z mála časů, kdy byste měli být tlačeni silou, je, když jste provedli místní vyčištění poté, co jste posunuli větev soukromých funkcí do vzdáleného úložiště (např., Je to jako říkat: „Jejda, opravdu jsem nechtěl tlačit tuto původní verzi větve funkcí. Vezměte místo toho aktuální.“Opět je důležité, aby nikdo nepracoval z revizí z původní verze větve feature.

Workflow Walkthrough

Rebasing lze začlenit do stávajícího pracovního postupu Git stejně nebo tak málo, jak je váš tým pohodlný. V této části se podíváme na výhody, které rebasing může nabídnout v různých fázích vývoje funkce.,

prvním krokem v jakémkoli pracovním postupu, který využívá git rebase, je vytvoření vyhrazené větve pro každou funkci. To vám dává potřebnou strukturu pobočky bezpečně využít rebasing:

Místní Vyčištění

Jeden z nejlepších způsobů, jak začlenit rebasing do vašeho pracovního postupu, je vyčistit místní, v-průběh funkce. Tím, že pravidelně provádíte interaktivní rebase, můžete se ujistit, že každé odevzdání ve vaší funkci je zaměřené a smysluplné., To vám umožní napsat svůj kód bez obav o jeho rozbití do izolovaných commitů—můžete jej opravit po faktu.

Při volání git rebase, máte dvě možnosti pro nové báze: funkce mateřské větve (např. master), nebo starší spáchat ve své funkci. Viděli jsme příklad první možnosti v sekci interaktivní Rebasing. Druhá možnost je pěkná, když potřebujete opravit pouze několik posledních commitů. Například následující příkaz začne interaktivní rebase pouze posledních 3 commitů.,

git checkout feature git rebase -i HEAD~3

zadáním HEAD~3 jako novou základnu, jste vlastně v pohybu pobočka—jsi jen interaktivně re-psaní 3 se zavazuje, že následovat. Všimněte si, že to nebude zahrnovat upstream změny do větve feature.

Pokud chcete, aby re-psát celý prvek, pomocí této metody, git merge-base příkaz může být užitečné najít původní základny feature pobočku., Následující vrací spáchat ID původní základ, který pak můžete předat do git rebase:

git merge-base feature master

Toto použití interaktivní rebasing je skvělý způsob, jak představit git rebase do vašeho workflow, jak to ovlivní pouze místní pobočky. Jediná věc, kterou ostatní vývojáři uvidí, je váš hotový produkt, který by měl být čistou a snadno sledovatelnou historií větve.

ale opět to funguje pouze pro soukromé větve funkcí., Pokud spolupracujete s ostatními vývojáři prostřednictvím stejné větve funkcí, tato větev je veřejná a nemůžete znovu psát její historii.

Neexistuje žádná git merge alternativou pro čištění místní zavazuje s interaktivní rebase.

Obsahující Upstream Změny Do Funkce

V Koncepční části Přehled, viděli jsme, jak se může začlenit tematickou větev proti proudu se změní z master buď pomocí git merge nebo git rebase., Sloučení je bezpečná volba, která zachovává celou historii vašeho úložiště, zatímco rebasing vytváří lineární historii přesunutím větve funkcí na špičku master.

použití git rebase je podobný místní vyčištění (a může být provedena současně), ale v procesu to zahrnuje ty, proti proudu se zavazuje od master.

mějte na paměti, že je naprosto legální rebase na vzdálenou větev namísto master., K tomu může dojít při spolupráci na stejné funkci s jiným vývojářem a je třeba začlenit jejich změny do úložiště.,

například, pokud vy a jiný vývojář jménem John přidal se zavazuje feature pobočky, vaše úložiště může vypadat jako následující po načítání remote feature pobočka od Johna repozitář:

můžete vyřešit tuto vidlici přesně stejným způsobem, jak jste integrovat upstream změny od master: buď sloučit své místní feature john/feature, nebo rebase místní feature na konec john/feature.,

Všimněte si, že tato rebase neporušuje Zlaté Pravidlo Rebasing, protože pouze místní feature spáchá jsou přesouvány—vše, co předtím, že je nedotčený. To je jako říkat: „přidejte mé změny k tomu, co John již udělal.“Ve většině případů je to intuitivnější než synchronizace se vzdálenou větví pomocí odevzdání sloučení.

ve výchozím nastavení git pull příkaz provede sloučení, ale můžete vynutit to, aby integrovat vzdálené pobočky s rebase průchodem --rebase možnost.,

Prohlížení Funkce S Pull Request

Pokud používáte vytáhnout požaduje jako součást revize kódu, budete potřebovat, aby se zabránilo používání git rebase po vytvoření pull request. Jakmile provedete požadavek pull, ostatní vývojáři se podívají na vaše commity, což znamená, že se jedná o veřejnou pobočku. Opětovné psaní jeho historie znemožní společnosti Git a vašim spoluhráčům sledovat jakékoli následné revize přidané k této funkci.

jakékoli změny od jiných vývojářů musí být začleněny do git merge namísto git rebase.,

z tohoto důvodu je obvykle dobré vyčistit kód pomocí interaktivního rebase před odesláním požadavku pull.

Integrace Schválené Funkce

Po funkci má schválen svůj tým, máte možnost rebasing funkce na špičku master pobočka před použitím git merge integrovat funkce do hlavního kódu.,

Toto je podobné situaci zahrnující upstream změny do větve funkcí, ale protože jste není dovoleno, aby re-psát zavazuje v master větev, budete muset nakonec použít git merge integrovat funkce. Nicméně, provedením rebase před sloučením, máte jistotu, že sloučení bude přetáčet, což má za následek dokonale lineární historie. To vám také dává možnost squash jakékoliv následné commity přidané během požadavku pull.,

Pokud si nejste zcela spokojeni s git rebase, můžete vždy provést rebase v dočasné pobočky. Tímto způsobem, pokud omylem pokazíte historii své funkce, můžete se podívat na původní větev a zkusit to znovu. Například:

git checkout feature git checkout -b temporary-branch git rebase -i master # git checkout master git merge temporary-branch

Shrnutí

A to je vše, co opravdu potřebujete vědět, abyste mohli začít rebasing své pobočky., Pokud byste raději čisté, lineární historie bez zbytečných sloučení zavazuje, měli byste sáhnout po git rebase místo git merge při integraci změny z jiné větve.

Na druhé straně, pokud chcete zachovat kompletní historii vašeho projektu a vyhnout se riziku re-psaní veřejnosti se zavazuje, můžete držet s git merge. Obě možnosti jsou naprosto platné, ale alespoň nyní máte možnost využít výhod git rebase.