Kehitystiimeissä on melko yleistä, että tiimi välttää (tai jopa estää) puskemisen suoraan päähaaraan. Ajatuksena on, että ennen kuin yksi kehittäjä voi lisätä koodinsa päähaaraan, tiimi tarkistaa koodin ja joko hyväksyy tai kieltää sen yhdistämisen päähaaraan. Tarkoituksena on pitää päähaara puhtaana bugeista.
Yksi tiimin jäsen alustaa projektin ja kaikki jäsenet kloonaavat repon. Ja sitten jokainen luo oman branchin.
Kun alat tehdä sovellukseen uutta "ominaisuutta", luo uusi branch.
Alla olevassa kaavioissa on esitetty työskentelyn vaiheet
Kun kehittäjät alkavat lisämään uusia ominaisuuksia, he luovat uuden haaran (branch). Sitten he puskevat GitHubiin kyseisen haaran melko usein (esimerkiksi kerran päivässä). Ja kun ominaisuus on valmis, se halutaan yhdistää päähaaraan(main). Mutta sen sijaan, että he yhdistäisivät sen itse, he luovat Pull requestin GitHubissa. Sitten tiimi tarkistaa koodin ja päättää, hyväksyykö se pyynnön vai ei. Jos he hyväksyvät, joku heistä yhdistää haaran päähaaraan. Tämän jälkeen jokaisen jäsenen tulee vetää uusin main-versio paikalliseen repoonsa ja sitten yhdistää main-versio haaraan, jonka kanssa he työskentelevät tällä hetkellä.
Kehittäjä voi myös päättää, että hylkää koko branchin. Tällöin hän ei tee Pull requestia.
Jos haluat tehdä Pull requestin GitHubissa, sinun tulee valita valikosta Pull request, jolloin saat seuraavan näkymänKun joku muu ryhmässäsi kirjautuu sisään GitHubiin, hän näkee Pull requestin. Ja sitten heidän pitäisi tehdä tämä
Oletetaan, että työskentelet beaver-nimisen haaran kanssa ja kuulet, että main on päivitetty.
Silloin sinun pitäisi tehdä näin:
git pull origin main vetää uusimman main-version ja yhdistää sen siihen haaraan jossa olet (tässä tapauksessa beaver-haaraan).
Varmista siis että olet beaver-haarassa ennen komentoa! Voit tarkistaa komennolla git branch (aktiivinen haara näkyy tähdellä *).
Vaihtoehtoinen tapa (eksplisiittisempi):
git fetch hakee uusimman main-version ilman yhdistämistä, ja git merge origin/main yhdistää sen beaver-haaraasi.
⚠️ Tärkeä huomio molemmista tavoista: Nämä eivät päivitä paikallista main-haaraasi! Ne vetävät remote main:n suoraan beaver-haaraan. Jos luot myöhemmin uuden haaran, tee se joko:
git checkout -b new-featuregit checkout main → git pull origin main → git checkout -b new-featuregit checkout -b new-feature origin/maingit checkout -b something, tuo uusi haara on identtinen sen haaran kanssa josta komento annettiin. Siksi on tärkeää tietää mistä haarasta luot uuden haaran!
Jos haluat päivittää myös paikallisen main:n (pidempi tapa):
Kokeile eri komentoja ja näe miten ne vaikuttavat paikallisiin haaroihin!
Mikä on konflikti?
Konflikti syntyy, kun kaksi haaraa ovat erkaantuneet (diverged) - eli molemmissa on tehty omia committeja - ja samaa tiedostoa on muokattu molemmissa haaroissa. Kun Git yrittää yhdistää (merge) näitä haaroja, se ei pysty automaattisesti päättämään, kumpi muutos pitäisi säilyttää, jos samat koodirivit on muutettu eri tavalla. Tällöin Git keskeyttää yhdistämisen ja pyytää kehittäjää ratkaisemaan konfliktin manuaalisesti eli valitsemaan, mikä versio koodista on oikea tai yhdistämään molemmat muutokset.
Miksi konflikti syntyy?
Kun työskentelet omassa branchissäsi ja teet committeja, commit history kasvaa. Samaan aikaan joku muu saattaa tehdä committeja main-haaraan. Nyt molemmissa haaroissa on eri commit history. Jos molemmat haarat ovat muokanneet samaa tiedostoa samoilla riveillä, Git ei tiedä kumpi versio on oikea, ja konflikti syntyy.
Skenaario: Olet työskennellyt beaver-haarassa. Main on päivitetty remotessa (C4, C5). Pullaat remoten mainin ja yrität mergettää sen beaveriin → molempien haarojen commitit ovat muokanneet saman tiedoston samaa riviä → KONFLIKTI
Git konflikti voi syntyä kahdessa tilanteessa:
git pull origin main ja sitten git merge main (beaver-haarassa), konflikti syntyy vain jos samat rivit samassa tiedostossa on muokattu molemmissa haaroissa. Git ei pysty automaattisesti päättämään kumpi versio pitää säilyttää.Kun beaver-haaran ja main-haaran commit historiat poikkeavat toisistaan ja tiedoston test.php sisältö on alla kuvatun kaltainen ja koetetaan mergetä haarat yhteen syntyy konflikti.
Sinä työskentelet beaver-haarassa ja muokkaat test.php-tiedostoa:
Samaan aikaan joku toinen on päivittänyt main-haaran:
⚠️ Kun yrität yhdistää (merge) main-haaran beaver-haaraan, syntyy konflikti!
Kun suoritat komennon git merge main, saat virheilmoituksen:
Auto-merging test.php CONFLICT (content): Merge conflict in test.php Automatic merge failed; fix conflicts and then commit the result.
Kun avaat tiedoston test.php, näet konfliktimerkit (conflict markers), jotka Git on lisännyt:
<<<<<<< HEAD - Aloittaa SINUN muutoksesi (nykyisen haaran sisältö)======= - Erottaa kaksi eri versiota toisistaan>>>>>>> main - Päättää TULEVAN haaran sisällön (main-haaran sisältö)<<<<<<<, =======, >>>>>>>)git statusJos näet "Unmerged paths", sinulla on vielä ratkaisemattomia konflikteja!
git add .
git commit -m "conflict fixed"
<<<, ===, >>>) on poistettugit status -komentoa tarkistaaksesi jäljellä olevat konfliktitJa sitten voit jatkaa työskentelyä branchissä beaver.