„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.