RosenborgSupporterSoftware / staut

Automated counting of ticket sales for Rosenborg home games
4 stars 3 forks source link

Enighet om hvordan vi bruker git(hub) #7

Open havremunken opened 9 years ago

havremunken commented 9 years ago

Hallo,

Dette er vel egentlig ikke noe skikkelig issue, bare en liten braindump i forhold til at jeg jobber i et lite firma - jeg er den eneste som gjør noe utvikling å snakke om. Jeg er brukbart kjent med git, men har ikke akkurat massiv erfaring når det gjelder å samarbeide med andre.

Derfor tenkte jeg å høre om dere andre hadde noen forslag i forhold til å få dette prosjektet til å funke best mulig - jeg har rett og slett ikke lyst til å være han rasshølet som ikke viser hensyn og er en dårlig medborger.

Det er et par leveregler jeg forsøker å følge.

Er disse punktene teite? Er det noen åpenbare punkter jeg har oversett?

Det er ikke meningen å lage en haug med nazi-regler, bare greit å være omtrent på samme sted sånn at vi slipper misforståelser eller problemer fordi vi gjør ting på helt forskjellige måter.

larsjaas commented 9 years ago

Trekk fra for et par glass rødvin til dagens The Daily/Nightly Show-syninger og tolk etter beste evne ;)

On 30 Jun 2015, at 18:18, Rune Jacobsen notifications@github.com wrote: Derfor tenkte jeg å høre om dere andre hadde noen forslag i forhold til å få dette prosjektet til å funke best mulig - jeg har rett og slett ikke lyst til å være han rasshølet som ikke viser hensyn og er en dårlig medborger.

Vent til du har et faktisk problem med å problematisere :) For å overdrive en god del og være litt slem: - nyt diktatorstatusen du innehar for koden du skriver, og heller innta “benevolent dictator”-rollen enn å legge deg ut som dørmatte. Det er ingen som våger å påvirke humøret til han som forer folk intravenøst med Troillprat i negativ retning uansett :) "Kompilerte ikke siste commit? Kjekt at du sa ifra - prøv igjen når jeg har kommet hjem fra hytta neste tirsdag og har fått lagt ungene.” Folk som skal kompilere denne koden og som kommer med bidrag er sannsynligvis selvhjulpen og kan leve med lokale patcher inntil du eller en annen RosenborgSupporterSoftware-developer har samlet trådene og fått inn rettelsene. Det er et par leveregler jeg forsøker å følge.

Ikke sjekk inn noe som ikke bygger. Kjør testene først. Also, skriv testene.

Prøv å begrense ADHDen. Jeg prøver å ikke kode rett på master i det hele tatt. Nå har jeg f.eks. en branch som heter dev/ef lokalt her hos meg - en feature branch som handler om å gjøre database-stuff med Entity Framework. Mens jeg holder på i den, kommer det oppdateringer fra dere andre. Jeg hopper da over til master, kjører en git pull for å oppdatere meg, og så hopper jeg tilbake til min branch og rebaser den mot master. Ev. konflikter blir løst med en gang, og jeg slipper en potensiell massiv merge-jobb i ettertid. Når en feature er ferdig, rebaser jeg master mot den og laster opp et stykke rein og fin historie hvor det ser ut som jeg gjorde alt med vilje.

Er disse punktene teite? Er det noen åpenbare punkter jeg har oversett?

Man er vel ikke helt der. "If it compiles, ship it!”. På dette stadiet skal du heller følge “commit early and often” enn å gjemme deg i dine lokale development-branches til du ikke skjemmes lengre og alt fra testcoverage til API-doc er perfekt. La heller github ose av aktivitet fremfor nødvendigvis kvalitet. Da senker du også lista for andre til å bidra. Når du merker at man faktisk lager masse merge-commits og sitter og løser merge conflicts jevnlig over tid - ja da strammer man inn workflow’en og kjører mer strukturert, slik som du henviser til med lokale brancher og rebasing. Men inntil videre - gid det var så vel at det over var nødvendig. Så lenge man er to personer som skriver noe kode, og to-tre som står og ser på, så må fokus være å senke lista og lokke til seg flere bidragsytere slik at problemene man gruer seg for å få har en sjanse til å materialisere seg ;)

Mvh,

Lars J

havremunken commented 9 years ago

Hahaha, takk for bra tilbakemelding. :D

Men du har nok rett - å ikke ta sorgene på forskudd er nok en bra greie.

Jeg er nok fortsatt der at det sitter litt hardt i å slutte med "atomic commits" - altså sende opp skiten kun når jeg har noe som fungerer som en enhet, og har en verdi og kan kompileres osv., men jeg skal prøve å komme meg litt mer inn i github-mindset etterhvert.

Så kan vi jo inntil videre bare si ifra til hverandre hvis vi har noe som kan optimaliseres!

nilsgs commented 9 years ago

Enig i det meste Lars J sier. La eksperimentell kode ha egne brancher som kan merges ved behov, og ellers er det bare å commite så mye som mulig.

havremunken commented 9 years ago

Jepp, høres ut som en plan.

Forøvrig noe jeg glemte å kommentere i forhold til Lars sin kommentar - jeg anser meg selv på ingen måte som noen "leder" av dette prosjektet. Jeg kan godt være det hvis vi trenger det, men jeg tenker at vi er normalt oppegående folk (tror det er et minimumskrav for å få kode til å kompilere) som klarer å samarbeide. Jeg har ihvertfall ikke lyst til at det skal virke som om jeg "lagde" STAut alene - for det er jo åpenbart ikke sant. Jeg hadde aldri sett på dette engang om ikke Vemund hadde begynt å rote i flash-applikasjonen til BS.

Bare så det er sagt. :)

vemundo commented 9 years ago

Jeg er også på linje med Lars.

Når det gjelder greiner så er mine vane å lage lokale greiner for å holde orden på ting jeg sjøl holder på med og kanskje ikke gjør ferdig med det første, men disse greinene pusher jeg aldri til remote repo. Bruker også git stash for å evt. midlertidig legge noe til side for å fikse en liten ting f.eks. og så hente tilbake etterpå.

"Remote"/delte greiner er nyttig om en er flere som skal samarbeide med noe som tar litt tid og vil knekke hovedversjonen før det er helt ferdig.

Det er greit om "master" greina alltid beveger seg fremover med siste versjon av alt, så kan vi f.eks. lage en STAut-1.0 grein når vi har en stabil første versjon. Da kan en fortsette å innovere fritt på master mens evt. bugfikser for det som foreløpig er produksjonsversjonen kan gjøres på STAut-1.0 greina. Slik blir det lett å fikse bugs i koden som er i faktisk bruk uten å være redd for å dra med seg noe som ikke er klart ut i produksjon.

havremunken commented 9 years ago

Det høres ut som om vi er veldig på linje her alle sammen - jeg ville bare være sikker på at jeg ikke var gruppas Leroy Jenkins og ødela for alle med mine mangelfulle evner i samarbeidsdimensjonen (jeg går på Høgmo-kurs).

Har forøvrig pushet litt kode opp nå, det er litt database-berørende stuff og den greia som leser eventinfo.properties. Tenkte å pakke inn filsystem-lesing (altså oppdage og lese inn datafiler fra events) i et interface sånn at ingestion-logikken kan testes skikkelig uten å berøre hverken db eller ekte filer. Jeg er ikke mockingens store forkjemper men denne typen logikk er vel greit å kunne verifisere noenlunde.

vemundo commented 9 years ago

Hehe, du har sjarm og social skills til å være en perfekt koordinator og talsmann. :)

havremunken commented 9 years ago

Haha, nå har jeg hørt det også. ;) Men ikke noe problem for meg, i den grad det trengs.

havremunken commented 9 years ago

Nå har jeg støtt på et av de tilfellene jeg var litt i tvil om, og ville bare sjekke om dere er enige i hvordan det ble håndtert.

Jeg har jobbet de siste dagene med dings som leser data fra disk og kaster det inn i databasen. Rotete, men funker ganske greit. Jobber også litt i huet med hvordan vi skal behandle innleste data - akkurat nå tenker jeg å etterhvert automatisk lage zip-filer av dem. Disse zip-filene kan vi så legge tilbake i input-området hvis vi må reseede databasen ved endringer e.l., så skal systemet være smart nok til å unzippe dette og så lese dem inn igjen. Tanken med dette er da å gjøre det så lett som mulig å rive ned databasen og skape den på nytt når vi lager ny funksjonalitet som gjør at dataene må tolkes på nytt (fordi vi f.eks. tolker setekoder annerledes, eller skal lagre alle endringer på alle seter i selve databasen, e.l.).

Anyway, mens jeg dodlet med dette hadde jeg lagt til et nytt prosjekt til løsningen - Ingest - som er en enkel konsollapplikasjon. Midt i jobben commitet @nilsgs starten på sitt Web API-prosjekt, som selvfølgelig da også lagde endringer i .sln-filen - en sånn ting som typisk fører til litt manuell merge-jobb. Jeg dro ned hans endringer, rebased det jeg hadde gjort mot hans jobb, fikset ting i en teksteditor så jeg fikk med begge prosjektene, og fortsatte å jobbe. Nå har jeg sendt opp en gjeng med commits som git-historisk tilsynelatende er basert på hans jobb.

Spørsmålet nå er jo om denne måten å gjøre det på gjør det vanskelig for han å dra ned mine endringer til sin PC hvor han kan (men ikke må) ha gjort videre utvikling. Har jeg gjort at han må igjennom en ny runde med git-gymnastikk for å ta inn mine siste oppdateringer i sitt?

Og hvis dette lager slit og ekstra-arbeid, er det en bedre workflow vi kan bruke?

larsjaas commented 9 years ago

Tror ikke det gjør noe stor forskjell. Det avhenger mest av hvilke lokale endringer som finnes hos mottageren som han ikke har pushet ennå. Det er ute av din kontroll, så lite du kan gjøre.

En liten forskjell på om du driver rebasing kontra om man bare merger lokale tråder før man pusher er at for de andre som driver med rebasing så kan rebase-prosessen for de pauses N ganger for konflikt-resolving når du har pushet en N commit lang rebaset tråd, mens har du pushet endringene dine som en merge-commit så er det bare én commit å få konflikt på når de skal rebase forbi dine endringer ;) Like mange endrings-linjer selvsagt, med mindre du herjer mye frem og tilbake på samme koden som de også har jobbet i. Sjeldent at antallet “git rebase —continue” på samme rebase blir plagsomt dog...

Når det er store endringer på gang er det greit å annonsere på epost at "nå skal jeg totalt refaktorisere klassene A, B og C, så herj med dem på eget ansvar” - sånt kan lette workflowen.

larsjaas commented 9 years ago

Glem det med antallet steg da det vel må være motsatt -- at lengden på din egen gren bestemmer hvor mange ganger du potensielt må fikse konflikter og ta continue når du gjør en rebase.

havremunken commented 9 years ago

Makes sense. Tror jeg skal lese meg opp litt på git igjen, har bare blitt "sittende fast" i rebase-metoden fordi jeg synes den ga meg så fin og clean history når det bare var meg. :) Men da skal jeg se om jeg kan snu noen inngrodde vaner litt!

larsjaas commented 9 years ago

Clean history er rent og vakkert (og OCD-stimulerende), og unødvendige merge-commits er FM-støy på linja. Synd sluttbrukere sjeldent ser hvor vakkert kildekodetreet kanskje er ;)

havremunken commented 9 years ago

Hahaha, vi tenker likt. Er overbevist om at jeg minst har en mild variant av OCD!

vemundo commented 9 years ago

Bruker alltid

git pull --rebase

På jobb har jeg satt opp git til å automatisk gjøre rebase ved pull så jeg aldri glemmer. Om jeg må fikse en liten sak på en commit bruker jeg --amend for å legge til endringen til "forrige" commit, så det ikke blir så mye ekstra dill i historien, men det er detaljer.

En kan også squashe mange commits til en, for å unngå ting ala det Lars beskriver.

nilsgs commented 9 years ago

rebase skal man være forsiktig med. En god tommelfingerregel er å aldri rebase brancher som er pushet.

havremunken commented 9 years ago

Nei, bare for å være klar på det, rebasing for min del handler utelukkende om å få min egen "master" til å se fin ut før jeg pusher hit. Så får vi se om vi klarer å holde oss i skinnet når vi en dag kommer dit at det blir flere brancher også her, og ikke bare lokalt.

vemundo commented 9 years ago

Hm, ja har aldri rebaset noe annet enn mine egne commits som ikke er pushet enda. Tenkte ikke over at det evt. kunne brukes på andre vis.