git rebase (Čeština)
Rebasing je proces stěhování nebo kombinování posloupnost commitů, na novou základnu spáchat. Rebasing je nejužitečnější a snadno vizualizovat v kontextu funkce větvení workflow. Obecný postup lze představit jako následující:
Z hlediska obsahu, rebasing je změna základny své pobočky z jednoho zavázat se k další, takže se zdá, jako kdyby jste si vytvořil své pobočky z různých spáchat., Interně to Git provádí vytvořením nových commitů a jejich aplikací na zadanou základnu. Je velmi důležité pochopit, že i když větev vypadá stejně, je složena ze zcela nových commitů.
použití
primárním důvodem rebasingu je zachování lineární historie projektu. Zvažte například situaci, kdy hlavní větev pokročila od doby, kdy jste začali pracovat na větvi funkcí., Chcete získat nejnovější aktualizace hlavní větve ve větvi funkcí, ale chcete, aby byla historie vaší větve čistá, takže se zdá, jako byste pracovali z nejnovější větve master. To dává pozdější výhodu čistého sloučení větve feature zpět do hlavní větve. Proč chceme zachovat „čistou historii“? Výhody čisté historie se stávají hmatatelnými při provádění operací Git, aby se prozkoumalo zavedení regrese. Reálnější scénář by byl:
- chyba je identifikována v hlavní větvi., Funkce, která úspěšně fungovala, je nyní přerušena.
- vývojář zkoumá historii hlavní větve pomocí
git log
kvůli“ čisté historii “ je vývojář rychle schopen uvažovat o historii projektu. - developer nemůže určit, kdy chyba byla zavedena pomocí
git log
takže vývojář spustígit bisect
. - protože historie git je čistá,
git bisect
má rafinovanou sadu commitů, které lze porovnat při hledání regrese., Vývojář rychle najde commit, který představil chybu a je schopen podle toho jednat.
Dozvědět se více o git log a git bisect na jejich jednotlivých stránkách použití.
máte dvě možnosti integrace funkce do hlavní větve: sloučení přímo nebo rebasing a poté sloučení. První možnost výsledky v 3-way sloučení a sloučení spáchat, zatímco druhá výsledků ve fast-forward merge a dokonale lineární historie. Následující diagram ukazuje, jak rebasing na hlavní větev usnadňuje rychlé sloučení vpřed.,
Rebasing je běžný způsob, jak integrovat upstream změny do místního úložiště. Tahání v upstream změny s git merge má za následek zbytečné merge commit pokaždé, když chcete vidět, jak Projekt pokročil. Na druhou stranu, rebasing je jako říkat, “ Chci založit své změny na tom, co už všichni udělali.“
rebase veřejné historie
Jak jsme již diskutovali dříve v historii, měli byste se nikdy rebase dopustí poté, co jsem byl tlačil na veřejné úložiště., Rebase by nahradila staré commity novými a vypadalo by to, že část vaší historie projektu náhle zmizela.
Git Rebase Standardní vs Git Rebase Interaktivní
Git rebase interactive je, když git rebase přijímá -- i
argument. To znamená “ interaktivní.“Bez jakýchkoli argumentů příkaz běží ve standardním režimu. V obou případech předpokládejme, že jsme vytvořili samostatnou větev funkcí.,
# Create a feature branch based off of master git checkout -b feature_branch master # Edit files git commit -a -m "Adds new feature"
Git rebase ve standardním režimu bude automaticky zavazuje ve vaší aktuální pracovní větve a použít je k hlavě prošel větev.
git rebase
Tento automaticky rebases aktuální větve na , který může být jakýkoliv druh spáchat referenční (například ID, název pobočky, tag, nebo relativní odkaz na
HEAD
).
Běh git rebase
-i
vlajky začíná interaktivní rebasing zasedání., Namísto slepého přesunu všech odevzdání na novou základnu vám interaktivní rebasing dává příležitost změnit jednotlivé commity v procesu. To vám umožní vyčistit historii odstraněním, rozdělením a změnou stávající řady commitů. Je to jako Git commit --amend
na steroidech.
git rebase --interactive
Tento rebases aktuální větve na , ale používá interaktivní rebasing zasedání. Tím se otevře editor, kde můžete zadat příkazy (popsané níže) pro každý commit být rebased., Tyto příkazy určují, jak budou jednotlivé commity přeneseny na novou základnu. Můžete také změnit pořadí odevzdání a změnit pořadí samotných odevzdání. Jakmile zadáte příkazy pro každé odevzdání v rebase, Git začne přehrávat commity pomocí příkazů rebase. Rebasing upravit příkazy jsou následující:
Další rebase příkazy
Jak je uvedeno v přepisování historie stránka, rebasing může být použit pro změnu starší a více se zavazuje, zavazuje soubory, a více zpráv., Zatímco se jedná o nejběžnější aplikace, git rebase
má také další možnosti příkazů, které mohou být užitečné ve složitějších aplikacích.
-
git rebase -- d
znamená, že během přehrávání bude odevzdání vyřazeno z konečného kombinovaného bloku odevzdání. -
git rebase -- p
ponechává commit tak, jak je. Nebude měnit zprávu nebo obsah odevzdání a bude to stále individuální odevzdání v historii větví. -
git rebase -- x
během přehrávání provede skript příkazového řádku na každém označeném odevzdání., Užitečným příkladem by bylo spuštění testovací sady codebase na konkrétní commity, což může pomoci identifikovat regrese během rebase.
Rekapitulace
interaktivní rebasing vám dává úplnou kontrolu nad tím, jak vypadá vaše historie projektu. To poskytuje vývojářům spoustu svobody, protože jim umožňuje spáchat „chaotickou“ historii, zatímco se zaměřují na psaní kódu, pak se vraťte a vyčistěte ji po faktu.
Většina vývojářů, jako je použití interaktivní rebase na polské větve funkcí před spojením do hlavního kódu., To jim dává příležitost squash nevýznamné commity, odstranit zastaralé a ujistit se, že vše ostatní je v pořádku, než se zaváže k „oficiální“ historii projektu. Pro všechny ostatní to bude vypadat, že celá funkce byla vyvinuta v jedné sérii dobře naplánovaných commitů.
skutečná síla interaktivního rebasingu je vidět v historii výsledné hlavní větve. Pro všechny ostatní to vypadá, že jste skvělý vývojář, který poprvé implementoval novou funkci s dokonalým množstvím odevzdání., Takto může interaktivní rebasing udržet historii projektu čistou a smysluplnou.
možnosti konfigurace
existuje několik vlastností rebase, které lze nastavit pomocí git config
. Tyto možnosti změnígit rebase
výstupní vzhled a dojem.
-
rebase.stat
: boolean, který je ve výchozím nastavení nastaven na false. Možnost přepíná zobrazení vizuálního obsahu diffstat, který ukazuje, co se změnilo od posledního debase.
-
rebase.autoSquash:
booleovská hodnota, která přepíná--autosquash
chování.,
-
rebase.missingCommitsCheck:
lze nastavit na více hodnot, které mění chování rebase kolem chybějících commitů.,/tr>
error
Stops the rebase and prints removed commit warning messages ignore
Set by default this ignores any missing commit warnings -
rebase.instructionFormat:
Agit log
format string that will be used for formatting interactive rebase display
Advanced rebase application
The command line argument
--onto
can be passed togit rebase
., Když v git rebase--onto
režim příkaz expanduje na:git rebase --onto
--onto
příkaz umožňuje silnější formě nebo rebase, který umožňuje předávání konkrétních odkazech být tipy rebase.
řekněme, že máme příklad repo operací s pobočkami, jako:o---o---o---o---o master \ o---o---o---o---o featureA \ o---o---o featureB
featureB je založen na featureA, nicméně jsme si vědomi, featureB není závislá na žádné změny v featureA a mohl jen být rozvětvené off master.
git rebase --onto master featureA featureB
featureA je
.,
master
se stanea featureB je odkaz na
HEAD
bude ukazovat. Výsledky jsou pak:
o---o---o featureB / o---o---o---o---o master \ o---o---o---o---o featureA
Pochopení nebezpečí rebase
Jeden háček, aby zvážila při práci s Git Rebase je sloučit konflikty mohou být častější během rebase workflow. K tomu dochází, pokud máte větev s dlouhou životností, která zbloudila od mistra., Nakonec budete chtít rebase proti master a v té době může obsahovat mnoho nových revizí, se kterými mohou být změny větve v rozporu. To lze snadno napravit tím, že rebasing větev často proti master, a dělat častější commity.
--continue
--abort
argumenty příkazového řádku mohou být předány dogit rebase
zálohy nebo obnovit rebase při řešení konfliktů.závažnější námitka rebase je ztracena commity z interaktivního přepisování historie., Spuštění rebase v interaktivním režimu a provádění subkommandů, jako je squash nebo drop, odstraní commity z okamžitého protokolu vaší pobočky. Na první pohled se to může zdát, jako by commity byly trvale pryč. Použití
git reflog
tyto commity lze obnovit a celou rebázu lze vrátit zpět. Pro více informací o použitígit reflog
Chcete-li najít ztracené revize, navštivte naši stránku dokumentace git reflog.samotná git Rebase není vážně nebezpečná., Skutečné případy nebezpečí vznikají při provádění historie přepisování interaktivních rebases a vynutí výsledky do vzdálené větve, která je sdílena ostatními uživateli. Toto je vzor, kterému je třeba se vyhnout, protože má schopnost přepsat práci ostatních vzdálených uživatelů, když vytáhnou.
Zotavuje z proudu rebase
Pokud jiný uživatel má rebased a silou tlačil na obor, který jste spáchal, a
git pull
bude pak přepsat zavazuje máte vychází z té předchozí větev s tip to byl silou tlačil., Naštěstí pomocígit reflog
můžete získat reflog vzdálené větve. Na reflogu vzdálené větve najdete ref před tím, než byl rebased. Potom můžete rebase větev proti této vzdálené ref pomocí--onto
možnost, jak je uvedeno výše v sekci Advanced Rebase aplikace.shrnutí
v tomto článku jsme se zabývali
git rebase
použití. Diskutovali jsme o základních a pokročilých případech použití a pokročilejších příkladech., Některé klíčové body diskuse jsou:- git rebase standardní vs interaktivní režimy
- git rebase možnosti konfigurace
- git rebase –onto
- git rebase ztratil zavazuje
-