Articles

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:

  1. chyba je identifikována v hlavní větvi., Funkce, která úspěšně fungovala, je nyní přerušena.
  2. vývojář zkoumá historii hlavní větve pomocí git log kvůli“ čisté historii “ je vývojář rychle schopen uvažovat o historii projektu.
  3. developer nemůže určit, kdy chyba byla zavedena pomocí git log takže vývojář spustí git bisect.
  4. 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: A git log format string that will be used for formatting interactive rebase display

    Advanced rebase application

    The command line argument --onto can be passed to git 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 stane a 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 do git 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ývaligit 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