Welcome to Our Website

Git Interaktivní Rebase, Squash, Změnit a Jinými Způsoby Přepisování Historie


„Prosím rebase na vrcholu master a můžeme sloučit vaše žádost pull“.

“ můžete prosím squash své commity dohromady, abychom získali čistý, reverzibilní githistory?”.

“ můžete přepsat zprávu vašeho commitu, abyste lépe popsali problém itsolves a jak to řeší?”.

podobné otázky jsou běžně kladeny v pull požadavcích. Podívejme se, proč existujíexistují, jak je provádět a jejich možné problémy.,

Přeformulovat poslední zprávu odevzdání

Jeden z nejjednodušších historie přepisuje, co můžeme udělat s git mění lastcommit zpráva. Řekněme, že hned po provedení odevzdání najdete překlep v jehopopis, nebo najdete lepší způsob popisu sady změn. Aby se thecorrection spuštění:

git commit --amend 

otevřít editorwith poslední zprávu odevzdání, takže ji můžete upravovat. Po uložení bude vytvořen nový commit se stejnými změnami a novou zprávou, která nahradí commits předchozí zprávou.,

to může být užitečné pro zahrnutí souborů, které jste zapomněli sledovat, nebo včetněmodifikace souborů, které jste právě provedli. , Aby tak učinily, můžete přidat changesand pak provést změnu:

git add README.md config/routes.rb git rm notes.txt git commit --amend 

Kromě editace zprávu odevzdání, nový commit bude obsahovat changesspecified s git add git rm. Můžete také upravit autora. Forexample:

git commit --amend --author="Tute Costa and Dan Croak <[email protected]>" 

Achievement Unlocked!, Nyní můžete změnit poslední odevzdání vašeho úložiště tak, aby zahrnovalo novější změny souborů a/nebo zlepšilo zprávu commit. Ale nezačínejte měnit všechny věci, než pochopíte poslední část tohoto blogu s názvem „nebezpečí“.

Reword další zprávy o odevzdání

rádi bychom o tom mluvili nyní, ale musíme pochopit obecnější nástroj dříve. Zůstaňte naladěni! Všechno ostatní bude snazší, když budeme číst o…

Interaktivní Rebase

git rebase re-vztahuje se zavazuje, jeden byone, v pořádku, z vaší aktuální větve na druhou., Akceptuje několik možností a parametrů, takže to je špička ledovce, stačí překlenout prostor mezi stackoverflowem nebo githubem a stránkami git man.

zajímavou možností je přijímá, je --interactive (-i pro krátké), které willopen editor se seznamem commitů, které mají být změněny. Tento seznam přijímá příkazy, což uživateli umožňuje upravit seznam před zahájením akce therebase.

podívejme se na příklad.,

překreslete další zprávy odevzdání, vezměte 2

Řekněme, že chci přepsat některou z posledních 4 odevzdání tohoto blogu. Poté spustímgit rebase -i HEAD~4 a zde vidím:

pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls pick 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend # Rebase 8db7e8b..fa20af3 onto 8db7e8b # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out 

vidíme čtyři poslední commity, od starších po novější. Podívejte se na komentář pod seznamem commitů? Dobrá práce s vysvětlením, Gite! pick (p zkráceně) je defaultaction. V tomto případě by se znovu použít commit, jak je, žádné změny v itscontents nebo zprávy. Uložení (a provedení) tohoto souboru by neprovedlo žádné změnyústaviště.,

Když řeknu reword (r krátké) v odevzdání chci upravit:

pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls r 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

Když jsem se uložte a ukončete editor, git bude následovat popsané příkazy, landingmyself do editoru zase, jako kdybych se mění spáchat 3e7ee36. Edituji thatcommit zprávu, uložit a ukončit editor, a tady je výstup:

nyní Caleb říká ve své zprávě odevzdání „zastavit všechny zvýraznění“, ať už jste dítě, nebo ne.

úspěch odemčen! Nyní můžete změnit zprávu libovolnéhokomit, který chcete., Můžete tak učinit, jen se ujistěte, že rozumíte sekci „nebezpečí“.

Squash zavazuje společně

další Dva příkazy interaktivní rebase nám nabízí, jsou:

  • squash (s pro krátké), které se prolíná odevzdání do předchozí (ten v linii před)
  • fixup (f pro krátké), který působí jako „squash“, ale zahodí to spáchat’smessage

Budeme pokračovat v práci na rebase příklad jsme workedbefore., Měli jsme čtyři zavazuje, můj vlastní pro tento blog post, a tři další z Caleba, které byly v souvislosti s jeho předchozím příspěvku na PGP:

pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls pick 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

řekněme, že chci spojit Caleb se zavazuje společně, protože patří do stejné logické changeset, a tak můžeme git revert jednoduše, pokud najdeme weprefer, aby se tyto změny v této evidenci. Budeme si chtít nechat první zprávu o odevzdání a obě následující odevzdat do předchozí zprávy., Změním pick squash případně:

pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls s 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

Uložit, a já pozemků do redakce, aby o tom, odevzdání zprávy z meldedthree zavazuje (vidět, jak jsou spojeny jeden po druhém):

# This is a combination of 3 commits. # The first commit's message is: Introduce OpenPGP and teach basic usage Besides demystifying a relatively complex tool, protocol, and etiquette, this post is intended to help with problems such as the one outlined in this tweet: > Emailed sensitive info to someone with PGP. They replied, with my > original email, all in clear text. They didn't realize it. # This is the 2nd commit message: Fix PostChecker::Post#urls # This is the 3rd commit message: Hey kids, stop all the highlighting # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Author: Caleb Hearth # Date: Tue Sep 2 09:39:07 2014 -0500 # # rebase in progress; onto 71d4789 # You are currently editing a commit while rebasing branch 'tc-git-rebase' on '71d4789'. 

rozhodl jsem se odstranit třetí zprávu odevzdání, a přidat další relevantní poznámka k druhé komitu. Uložte editor a čtyři revize byly transformoványdo dvou: ten z Caleba a můj po. Dobře!,

mohli jsme použít příkaz fixup, pokud jsme dříve viděli, že chcemezměny, ale ne zpráva odevzdání, třetího commitu. V tom případě, thecommands by to vypadalo, jako:

pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls f 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

Při ukládání, editor by zahrnovala třetí komitu alreadycommented pro nás je:

Uložit a výstupy:

Výsledek je stejný: 2 se zavazuje, místo 4, každý s jedním, jiný blogpost.

úspěch odemčen! Nyní můžete sloučit commity dohromady. Stejně tak mějte na paměti část nebezpečí.,

Rebase na vrcholu master

vidlice open source knihovna, začít pracovat na funkci, pobočky, a mistr v upstream projektu tahů dopředu. Naše historie vypadá takto:

 A---B---C feature / D---E---F---G upstream/master 

knihovna správce žádá, aby „rebase na vrcholu master“, a tak jsme se opravit všechny mergeconflicts, které mohou vzniknout mezi oběma větvemi, a udržet naše changeset spolu.Udržovatel chtěli vidět historii jako:

 A'--B'--C' feature / D---E---F---G upstream/master 

chceme znovu použít naše zavazuje, jeden po druhém, v pořadí, na proti proudu je mistr.,Zní to jako popis příkazu rebase! Podívejme se, jaké příkazy by nás dostaly do požadovaného scénáře:

# Point our `upstream` remote to the original fork git remote add upstream https://github.com/thoughtbot/factory_girl.git # Fetch latest commits from `upstream` (the original fork) git fetch upstream # Checkout our feature branch git checkout feature # Reapply it onto upstream's master git rebase upstream/master # Fix conflicts, then `git rebase --continue`, repeat until done # Push to our fork git push --force origin feature 

Achievement Unlocked! Vaše větev funkce bude použita natop nejnovějšího mistra původní vidlice.

A tak dostaneme…

NEBEZPEČÍ: Jste přepisování historie

Vidět --force poslední git push příkaz? To znamená, že přepisujeme jeho historii., To je vždy bezpečné v spáchá nechceme sdílet s dalšími členy týmu, nebo v oborech, které patří nám (viz moje iniciály v uvedený příklad tohoto blogu).

Ale pokud máte force push edice, které již byly sdíleny s týmem (commitsthat existují mimo mé úložiště, stejně jako změny, které jsem udělal PGP commitsthat byly již společná), pak všechny pobočky dostane ven synchronizace.

přepisování historie znamená opuštění existujících commitů a vytvoření nových, které mohou být velmi podobné, ale jsou odlišné., Pokud ostatní základní práce na previouscommits, a pak přepsat a force-push vaše zavazuje, váš tým memberswill muset znovu spojit své práce (pokud si všimnou potenciální ztráta).

Na thoughtbot jsme prefix našich poboček s našimi iniciály, což signalizuje, že thosecommits může dostat přepsány a ostatní neměli přidat zavazuje pobočky. Když se dopustí půdy do master nebo sdílené větve, nikdy je znovu nepřepisujeme.

takže přepište historii git za předpokladu, že přepsané commity existují pouze ve vašem repozitáři, nebo vy a váš tým víte, že nikdo jiný by neměl založit práci mimo ofthem.,

úspěch odemčen! Nyní víte, jak rebase, když jste agood Občan.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *