«Vær rebase på toppen av master og vi vil flette dine trekk forespørsel».
«Kan du vennligst squash din forplikter seg sammen slik at vi får en ren, reversibel githistory?».
«Kan du skrive din forplikte er meldingen for å beskrive bedre problemet itsolves, og hvordan den løser det?».
Spørsmål som disse er oftest stilte i trekk forespørsler. La oss se hvorfor theyexist, hvordan å utføre dem, og deres mulige problemer.,
Reword siste begå en melding
En av de enkleste historie omskriver vi kan gjøre med git er å endre lastcommit melding. La oss si rett etter å gjøre en commit du finner en skrivefeil i itsdescription, eller du finne en bedre måte å beskrive det endringssett. For å gjøre thecorrection du kjøre:
git commit --amend
Det vil åpne en editorwith siste begå melding, slik at du kan endre det. Etter lagring, en ny commitwill opprettes med de samme endringene og den nye meldingen, skifte commitwith forrige melding.,
Dette kan være nyttig å inkludere filer du har glemt å spore, eller includemodifications til filene du bare forpliktet. For å gjøre det, kan du legge til changesand utfør deretter endre:
git add README.md config/routes.rb git rm notes.txt git commit --amend
Bortsett fra å redigere begå melding, ny revisjon vil inneholde changesspecified med git add
og git rm
. Du kan også redigere forfatteren. Forexample:
git commit --amend --author="Tute Costa and Dan Croak <[email protected]>"
Achievement Unlocked!, Nå kan du endre de siste begå ofyour depotet for å inkludere nyere endringer i filene, og/eller for å forbedre thecommit melding. Men ikke start som endret alt-i-ting før forstå thelast delen av denne blogg innlegg med tittelen «FARE».
Reword andre begå meldinger
Ville elske å snakke om dette nå, men vi trenger å forstå mer generaltool før. Følg med! Alt annet vil bli enklere når vi leser om…
Interaktiv Rebase
git rebase
re-bruker forplikter, en byone, i rekkefølge, fra din gjeldende gren til en annen., Det aksepterer flere optionsand parametre, så det er et tips av isfjellet forklaring, nok til å bygge bro thegap i mellom StackOverflow eller GitHub kommentarer og git man-sidene.
Et interessant alternativ, det aksepterer er --interactive
(-i
for kort), som willopen en redaktør med en liste over de begår som er i ferd med å endres. Thislist aksepterer kommandoer, slik at brukeren kan redigere listen før du starter therebase handling.
La oss se på et eksempel.,
Reword andre begå meldinger, ta 2
La oss si at jeg ønsker å reword noen av de siste 4 forplikter seg av denne bloggen. Jeg så løpegit rebase -i HEAD~4
, og her er hva jeg ser:
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
Vi se de fire siste forplikter, fra eldre til nyere. Se kommentar nedenfor thelist av begår? God jobb forklare, git! pick
(p
for kort) er defaultaction. I dette tilfellet ville det påfør forplikte som er, ingen endringer i itscontents eller melding. Lagre (og utførende) denne filen vil ikke gjøre noen forandringer til depotet.,
Hvis jeg sier reword
(r
for kort) i en innlegging jeg ønsker å redigere:
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
Når jeg lagre og avslutte editoren, git vil følge beskrevet kommandoer, landingmyself i editoren igjen, som om jeg ikke hadde endret commit 3e7ee36
. Jeg rediger thatcommit melding, lagre og avslutte editoren, og her er resultatet:
Nå Kaleb sier i sin begå meldingen «Stopp alle markeringen», om youare et barn eller ikke.
Achievement Unlocked! Du kan nå endre meldingen av anycommit du vil., Du kan gjøre det, bare sørg for at du forstår den «FARE» – delen.
Squash begår sammen
To andre kommandoer rebase interaktive tilbyr oss er:
-
squash
(s
for kort), som melds innlegging i den forrige (theone i linjen før) -
fixup
(f
for kort), som fungerer som «squash», men forkaster denne begå’smessage
Vi vil fortsette å arbeide på rebase eksempel vi workedbefore., Vi hadde fire forplikter, min egen for dette blogginnlegget, andthree andre fra Kaleb, som var knyttet til hans tidligere innlegg på 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
La oss si at jeg ønsker å meld Kaleb forplikter seg sammen, fordi de hører til thesame logiske endringssett, og så kan vi git revert
det lett hvis vi finner weprefer ikke å ha disse endringene i dette depotet. Vi ønsker å holde thefirst begå meldingen, og ta knekken på de to påfølgende begår i previousone., Jeg bytt pick
til squash
der det er hensiktsmessig:
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
Lagre, og jeg landet i redigereren for å bestemme begå melding av meldedthree begår (se hvordan de er sammensatt ene etter den andre):
# 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'.
jeg bestemmer meg for å fjerne den tredje begå en melding, og legg til en mer relevant notat til thesecond begå melding. Lagre editor, og de fire begår var transformedinto to: den ene fra Kaleb, og min etter. Det er bra!,
Vi kunne ha brukt fixup
– kommandoen, hvis vi hadde sett tidligere at vi vil thechanges, men ikke begå meldingen, for det tredje har begått. I så fall, thecommands ville ha sett ut:
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
Når du har lagret, redaktør ville ha tatt den tredje begå melding alreadycommented ut for oss:
Lagre, og utganger:
Resultatet er det samme: 2 begår i stedet for 4, alle med et enkelt, ulike innlegget.
Achievement Unlocked! Du kan nå merge forplikter seg sammen. Asalways, være oppmerksom på hvilken FARE delen.,
Rebase på toppen av master
Vi gaffel-en åpen kildekode bibliotek, begynne å jobbe på en funksjon gren, og master i oppstrøms prosjektet går fremover. Vår historie ser ut som:
A---B---C feature / D---E---F---G upstream/master
biblioteket utvikleren ber som å «rebase på toppen av master», så vi fikse enhver mergeconflicts som kan oppstå mellom begge grener, og holde våre endringssett sammen.Utvikleren ønsker å se en historie som:
A'--B'--C' feature / D---E---F---G upstream/master
Vi ønsker å bruke våre forplikter, en etter en, i rekkefølgen, på upstream master.,Høres ut som beskrivelsen av rebase kommando! La oss se hvilke kommandoer wouldland oss inn ønsket scenario:
# 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! Din funksjon gren vil bli brukt ontop av nyeste master av den originale gaffelen.
Og så får vi…
FAREN: Du er skrive historie
Se --force
i det siste git push
kommando? Det betyr at vi er overwritingrepository historie., Dette er alltid trygt å gjøre i begår vi ikke dele medandre team-medlemmer, eller i grener som tilhører oss (se mine initialer i theexample av denne bloggen).
Men hvis du force push-utgavene som var allerede delt med team (commitsthat eksisterer utenfor min depotet, som endringene jeg har gjort til PGP commitsthat har allerede blitt delt), da alle er grenen kommer ut av sync.
å Skrive historie betyr å avskaffe eksisterende forplikter og å skape nye, thatmay være veldig like, men ulike., Hvis andre base arbeid på previouscommits, og deretter kan du skrive og kraft-presse forplikter, ditt team memberswill nødt til å re-slå sammen deres arbeid (hvis de oppdager potensielle tap).
På thoughtbot vi prefiks våre grener med våre initialer, som signaliserer at thosecommits kan bli omskrevet og andre burde ikke legge forplikter seg til grenen. Whenthose forplikter land til master eller en felles grenen vi aldri til å skrive om dem igjen.
Så omskrive git historie, forutsatt omskrevet begår finnes bare i yourrepository, eller du og dine medarbeidere vet at ingen andre skulle basere arbeidet av ofthem.,
Achievement Unlocked! Du vet nå hvordan rebase mens å være gode borgere.