Git Tips fra proffene

Du bruker allerede kildekontroll for å administrere koden din, ikke sant? Du kan til og med bruke din SCM som den sentrale delen av arbeidsflyten din, som vi gjør på New Relic.

I denne artikkelen skal vi ikke gå gjennom grunnleggende om kildekontrollhåndtering, uansett hvilken du bruker. La oss bare anta at du allerede vet hvordan du skal komme deg rundt. Det vi skal dekke, er hvordan proffene bruker git. Vi tar en titt på noen av de avanserte funksjonene og arbeidsflytene som du kanskje ikke allerede er kjent med. Forhåpentligvis vil du gå bort med din munn agape på de rene mulighetene som git gir!

Hvis du er noe som meg, elsker du å utforske hvordan andre utviklere jobber.

For de uinitierte, eller de som kommer fra en annen SCM, er Git et distribuert versjonskontrollsystem. Det er gratis og åpen kildekode, har et lite fotavtrykk, og passer inn i arbeidsflyten som passer best for deg. Vanligvis tvinger det deg ikke til å jobbe på en bestemt måte, noe som betyr at det finnes mange forskjellige metoder for hvordan du bruker funksjonene, for eksempel lagringsområder, forgrening og merking av utgivelser. Hvis du er noe som meg, elsker du å utforske hvordan andre utviklere jobber. Så vær klar til å begynne å endre din .gitconfig, fordi du er i for en godbit. La oss se hvordan proffene bruker git.


Trinn dine endringer i hunks

Du er sannsynligvis kjent med uhell å endre en enkelt fil av to forskjellige grunner uten å begå mellom.

Du er sikkert kjent med å legge filer til staging-området med riktig navn Legg til kommando. Og du er sannsynligvis kjent med ved et uhell å endre en enkelt fil av to forskjellige grunner uten å forplikte seg i mellom. Så du vil sikkert ha a git logg fylt med meldinger som "Rediger X og endre ikke-relatert Y". Hvis dette høres ut som arbeidsflyten din, er interaktiv tillegg din nye beste venn.

Interaktiv tilførsel, eller legge til en oppdatering, går deg gjennom endringene du kjenner om gangen. Når du legger til en fil med -p kommando, vil du bli bedt om hver logisk forandring (dvs. suksessivt redigert linjer vil bli gruppert sammen). Det finnes en rekke valg du kan lage på hver hunk, fra å splitte den nåværende hunken til mindre, hoppe over en hunk, eller til og med redigere den manuelt. Bruke ? alternativ for å se en komplett liste over kommandoer.

Komme i gang med staging hunks er så enkelt som:

git add-p 

Sjekk ut din siste gren

Som en god kodende statsborger, når du kommer over noe som trenger en rask løsning eller opprydding, bør du nok ta et øyeblikk for å endre det. Men hvis du bruker en kraftig arbeidsfilm, vil du ikke ha den uavhengige løsningen i funksjonen din. Dette betyr at du må stash Dine nåværende endringer, bytt til hovedgrenen din og gjør deretter reparasjonen der. Spretter rundt mellom grener kan være kjedelig, men heldigvis er det en rask snarvei for å bytte til den siste grenen din. (via Zach Holman)

git kassen -

Denne syntaksen skal se ganske kjent ut for * NIX-brukere. De cd kommandoen har en lignende snarvei (cd -) som vil hoppe til den siste katalogen du var i. Du trenger aldri å huske hva du kalt den funksjonen grenen når du trenger å bytte tilbake; bare git kassen -.


Vis hvilke grener som slås sammen (eller ikke)

Når du arbeider med filialer, kan du raskt lage så mange som roter opp produksjonen av git grenen - liste. Nå og da vil du bli kvitt grener som har gjort det til mester. Men du har sikkert en rask pause før deg git grenen -d , men med kommandoene nedenfor kan du trygt slette dem uten en annen tanke. (via Zach Holman)

Hvis du vil se hvilke lokale filialer du har som slås sammen i filialen du er på, så er alt du trenger:

 git grenen - smeltet

Omvendt er også tilgjengelig. Vis hvilke grener som ikke har blitt slått sammen i den valgte grenen med:

git grenen - ikke-sammenslåtte

Mash dette opp med et par enkle UNIX-verktøy, og du kan raskt slette alt som allerede er fusjonert:

git branch --merged | xargs git grenen -d

Ta en fil fra en annen gren uten å bytte grener

La oss si at du eksperimenterer med noen refactorings, og du har noen grener som har ulike endringer du har gjort. Hvis du har endringer i en fil i en fjern avdeling som du vil ta med i din nåværende arbeidsgren, kan du gjøre noen trinn. Uten undertipset, vil du sannsynligvis stash dine nåværende endringer, bytte grener og ta tak i filinnholdet du vil endre, bytt tilbake (med git kassen - selvfølgelig) og foreta endringene dine. Eller du kan bare sjekke ut akkurat den filen som vil fusjonere den inn i din nåværende gren (via Zach Holman):

git kassen  -- / til / file.rb

Git-grener sortert etter siste forpliktelse

Så du har den rotete grenlisten som vi snakket om før; noen av dem du har renset opp med --slått sammen flagg. Men hva med alle de andre grenene? Hvordan vet du hvilke som er nyttige eller helt utdaterte? De for-hver-ref kommandoen vil sende ut en liste for hver gren og vise referanseinformasjonen for den siste forpliktelsen. Vi kan tilpasse utdataene for å inkludere noen nyttig informasjon, men enda viktigere, vi kan sortere listen etter dato. Denne kommandoen gir oss en liste over grener med den siste forpliktelsesmeldingen og kommitteren, sortert i nedstigningsdato rekkefølge. (via Rein Henrichs)

git for-each-ref - sorter = -committerdate --format = '% (committerdate: short)% (refname: short) [% (etternavn)]'

Mens du kan skrive denne kommandoen hver gang, anbefaler jeg at du gjør det et alias og redd deg selv for alvorlige hodepine.

git config -global alias.latest "for-hver-ref - sortering = -committerdate --format = '% (kommitterdat: kort)% (etternavn: kort) [% (etternavn)]"

Folk i glasshus bør ikke bruke Git-skyld

Eller i det minste bør de ikke bruke git skylden uten et av alternativene flagg under. Git skyld er kraftig; Det er i utgangspunktet som å bruke vitenskap for å bevise at du har rett. Men vær forsiktig, mange endringer er overfladiske og for å finne den virkelige kilden til spørrekoden tar litt mer jakt. Ting som fjerner hvit plass, flytte tekst til nye linjer, eller til og med flytte tekst fra en annen fil kan ignoreres for å komme til den opprinnelige forfatteren av koden mye lettere.

Før du git skylden noen, må du kontrollere at du kontrollerer en av disse:

git blame -w # ignorerer white space git blame -M # ignorerer flytte tekst git blame -C # ignorerer flytte tekst i andre filer

Finn en streng i hele Git-historien (og fjern den)

Fra tid til annen må du jakte på en linje med kode du vet du skrev, men bare ikke kan finne. Det kan bli sittende fast i en fjern avstand, slettet for lenge siden, eller gjemmer seg i vanlig side; men uansett kan du finne en hvilken som helst streng i hele git-historien ved å kaste opp noen få kommandoer. Først skal vi få en liste over alle forpliktelser, og grep hver av dem for vår streng.

git rev-liste --all | xargs git grep -F ''

Du har sannsynligvis en venn som ved et uhell har begått sensitive data til en repo: tilgangsnøkler, passord, bestemors hemmelige marinaraoppskrift. Det første de bør gjøre, er å endre passordene sine og tilbakekalle tilgangen med disse nøklene (og be om unnskyldning til bestemoren din). Deretter ønsker du å jakte på den fornærmende filen og fjerne den fra hele git-historien, noe som høres langt lettere enn det egentlig er. Etter at denne prosessen er fullført, vil alle som trekker i de rydde endringene, også få de sensitive dataene fjernet. Gafler av ditt repo som ikke slår sammen oppstrømsendringene, vil fortsatt inneholde de kompromitterte filene (så ikke hopp over endrede passord og tilbakekalle tilgangsnøkler).

Først vil vi omskrive git-historien for hver gren, og fjerne filen med de sensitive dataene.

git filter-grenen - index-filter 'git rm - cached --ignore-unmatch '--prune-empty - tag-name-filter cat - --all

Legg til filen til .gitignore og forplikte seg til å oppdatere .gitignore.

ekko  >> .gitignore git add .gitignore git commit -m "Legg sensitiv  fil til gitignore "

Siden vi skriver om historien, må du tvinge endringene til fjernkontrollen din.

git push opprinnelses mester - force

De kompromitterte filene eksisterer fortsatt i din lokale repo, så du må gjøre noen opprydningsoppgaver for å rense dem helt.

rm -rf .git / refs / original / git reflog utløper --expire = nå --all git gc --prune = nå git gc --aggressive --prune = nå

Din venns repo skal være fri for sensitive data, og du vil være helten for å hjelpe dem med din progit-kunnskap. (via StackOverflow og GitHub)


Ignorer endringer i en sporet fil

Å jobbe med en andres kode i ditt miljø kan bety at du må gjøre noen antall konfigurasjonsendringer for å få programmet til å kjøre. Det er altfor lett å tilfeldigvis forplikte seg til de konfigene som var ment utelukkende for miljøet ditt. Så, i stedet for å alltid holde øye med disse filene og få dem til å ligge i det "modifiserte" oppføringsområdet, kan du bare fortelle git-indeksen å ignorere endringer i den filen. Du kan tenke på dette noe som en git-ignorert fil som forblir med repo. (via Arnaud Coomans)

git oppdateringsindeks - aksum-uendret 

Null ut en grenhistorie

Noen ganger starter du fra grunnen, akkurat det du trenger å gjøre, av noen grunner. Kanskje du har arvet en kodebase som du ikke kan forsikre deg om, er trygt å åpne kilde, kanskje du bare prøver å prøve noe helt nytt, eller kanskje legger du til en filial som tjener et eget formål som du vil beholde med repo (som GitHub Pages). For dette tilfellet er det en veldig enkel måte å opprette en ny filial i repoen din, som i hovedsak ikke har noen historie. (via Nicola Paolucci)

git checkout - orphan 

Aliases du kan ikke leve uten

Ikke kast bort tid ved å skrive lange kommandoer og lage deg noen nyttige aliaser.

Ingen diskusjon om git ville være komplett uten å snakke om ulike aliaser som bokstavelig talt vil spare deg minutter om året i lagrede tastetrykk. Ikke kast bort tid ved å skrive lange kommandoer og lage deg noen nyttige aliaser. Aliaser kan gjøres ved å legge dem til din .gitconfig-fil eller ved hjelp av kommandolinjen git config - global alias. "". Nedenfor er bare et utvalg av alias som du kan bruke som et springbrett for ideer.

co: Med en arbeidsflyt for arbeidsflyt, flytter du regelmessig mellom grener. Lagre seks tegn hver gang.

co = kassa

ds: Det er alltid best praksis å gjennomgå endringene du skal forplikte før du gjør den faktiske forpliktelsen. Dette gir deg mulighet til å fange skrivefeil, utilsiktet inkludering av sensitiv data og grupperingskode i logiske grupper. Skift endringene dine og bruk deretter git ds for å se diff av disse endringene.

ds = diff - staged

st: du bør være ganske kjent med den verbose utgangen av git-status. På et tidspunkt vil du ønske å hoppe over all formalitet og komme seg til virksomheten. Dette aliaset viser den korte statusformen og inneholder grenen detaljer.

st = status -sb

endre: Glemte du å inkludere en fil med din siste forpliktelse, eller kanskje du hadde en tweak du trengte å lage? Endre de iscenesatte endringene til din siste forpliktelse.

endre = commit --amend -C HEAD

angre: Noen ganger er det ikke nok å endre den siste forplikten, og du må angre det i stedet. Dette aliaset vil gå tilbake til en forpliktelse og la endringene fra det begjæringen vises. Nå kan du gjøre flere endringer, eller tilbakestille med en ny melding.

angre = tilbakestill --soft HEAD ^

ls: Å jobbe med en kodebase med en gruppe utviklere betyr å prøve å holde tritt med hva folk jobber med. Dette aliaset vil gi en enhetsgit-logg, inkludert dato og kommisjonsnavn.

ls = logg - pretty = format: "% C (gul)% h% C (blå)% annonse% C (rød)% d% C (reset)% s% C (grønn) [% cn]" - dekorere - dato = kort

stå opp: dette aliaset er flott for å se hva du jobbet på i går for enhver form for daglig oppstart, eller bare for å oppdatere minnet om morgenen.

standup = logg - siden '1 dag siden' --oneline --author 

kurve: en kompleks git historie kan være vanskelig å vurdere i en rett linje. Ved hjelp av grafflagget kan du se hvordan og når begår ble lagt til den nåværende grenen.

graph = logg --graph --pretty = format ':% C (gul)% h% Cblue% d% Creset% s% C (hvit)% an,% ar% Creset'

I Avslutning

Git kan være både utrolig enkelt og tankegående kompleks. Du kan starte med det grunnleggende og jobbe deg med i mer komplisert grafmanipulering over tid. Det er ikke nødvendig å groke alt før du kan bruke den. Kommandoen som vil bli mest kraftig som du lærer er mann git--. Prøv å bruke det før du henviser til Google for et svar.

Du kan lære mer om hvordan selskapet jeg jobber for, New Relic, bruker git på bloggen vår, eller gi New Relic Pro et forsøk gratis. Takk for at du leste! Hvis du har spørsmål, vennligst gi oss beskjed nedenfor!