Kuinka ymmärtää ja ratkaista ristiriitoja Gitissä

Siinä se on, sana, jota jokainen kehittäjä vihaa nähdä: konflikti. ? Satunnaisessa yhdistämisristiriidassa ei ole mitään keinoa työskenneltäessä Gitin (tai muun versionhallintajärjestelmän) kanssa.

Mutta puhuessani kehittäjien kanssa kuulen usein, että yhdistymiskonfliktien aihe on ahdistuneisuuden tai epämukavuuden tunne .

Konfliktien käsittely on usein pimeää, salaperäistä paikkaa: tilanne, jossa asiat ovat pahasti rikki ja on epäselvää, miten päästä siitä pois (pahentamatta asioita).

Vaikka on totta, että yhdistämiskonfliktit ovat väistämätön osa kehittäjän elämää, epämukavuus näissä tilanteissa on täysin valinnaista.

Tarkoitan tämän artikkelin avulla tuoda jonkin verran selkeyttä tähän aiheeseen: miten ja milloin konflikteja tyypillisesti esiintyy, mitä ne todellisuudessa ovat ja kuinka ratkaista - tai kumota - ne.

Kun ymmärrät nämä asiat oikein, pystyt käsittelemään sulautumiskonflikteja paljon rennommalla ja luottavaisemmalla tavalla. ?

Kuinka ja milloin konflikteja esiintyy

Nimi sanoo sen jo: "yhdistämiskonflikteja" voi esiintyä prosessissa, jossa integroidaan toisesta lähteestä peräisin olevia sitoumuksia.

Muista kuitenkin, että "integraatio" ei rajoitu vain "haarojen yhdistämiseen". Se voi tapahtua myös uudelleenkäynnistyksessä tai interaktiivisessa uudelleenkäynnistyksessä, kun suoritat kirsikkapoikkeaman tai vedon tai jopa kun käytät uudelleen Stashia.

Kaikki nämä toimet suorittavat jonkinlaisen integraation - ja silloin voi tapahtua yhdistymiskonflikteja.

Mutta tietenkään nämä toimet eivät johda sulautumiskonfliktiin joka kerta (kiitos Jumalalle!). Ihannetapauksessa sinun pitäisi joutua näihin tilanteisiin vain harvoin. Mutta milloin konflikteja tapahtuu?

Itse asiassa Gitin yhdistämiskyvyt ovat yksi sen suurimmista eduista: haarojen yhdistäminen toimii suurimman osan ajasta vaivattomasti, koska Git pystyy yleensä selvittämään asiat yksin.

Mutta on tilanteita, joissa on tehty ristiriitaisia ​​muutoksia - ja joissa tekniikka ei yksinkertaisesti pysty päättämään, mikä on oikein tai väärin. Nämä tilanteet edellyttävät yksinkertaisesti ihmisen päätöstä.

Todellinen klassikko on, kun täsmälleen sama koodirivi muutettiin kahdessa tehtävässä, kahdella eri haaralla. Gitillä ei ole mitään tapaa tietää mitä muutosta haluat! ?

On joitain muita, samanlaisia ​​tilanteita - esimerkiksi kun tiedostoa muokattiin yhdessä haarassa ja poistettiin toisessa - mutta ne ovat vähän harvinaisempia.

Esimerkiksi "Tower" Git -työpöydän käyttöliittymällä on hieno tapa visualisoida tällaisia ​​tilanteita:

Kuinka tietää, kun konflikti on tapahtunut

Älä huoli: Git kertoo sinulle hyvin selvästi, kun konflikti on tapahtunut. ?  

Ensinnäkin se ilmoittaa sinulle välittömästi tilanteessa , esimerkiksi kun yhdistäminen tai uudelleenasennus epäonnistuu konfliktin vuoksi:

$ git merge develop Auto-merging index.html CONFLICT (content): Merge conflict in index.html CONFLICT (modify/delete): error.html deleted in HEAD and modified in develop. Version develop of error.html left in tree. Automatic merge failed; fix conflicts and then commit the result.

Kuten yllä olevasta esimerkistä näet, yritin suorittaa yhdistämisen, kun luotin yhdistämiskonfliktin - ja Git viestii ongelmasta hyvin selvästi ja nopeasti:

  • Tiedostossa "index.html" tapahtui ristiriita.
  • Tapahtui toinen ristiriita tiedostossa "error.html".
  • Ja lopuksi, ristiriitojen vuoksi yhdistämistoiminto epäonnistui.

Nämä ovat tilanteita, joissa meidän täytyy kaivaa koodi ja nähdä, mitä on tehtävä.

Siinä epätodennäköisessä tilanteessa, että olet unohtanut nämä varoitusviestit konfliktin tapahtuessa, Git ilmoittaa sinulle myös, kun suoritat git status:

$ git status On branch main You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge) Unmerged paths: (use "git add/rm ..." as appropriate to mark resolution) deleted by us: error.html both modified: index.html

Toisin sanoen: älä huoli siitä, että et huomaa yhdistymiskonflikteja. Git varmistaa, ettet voi jättää niitä huomaamatta.

Kuinka kumota ristiriita Gitissä ja aloittaa alusta

Yhdistymiskonfliktit aiheuttavat tietyn kiireellisyyden. Ja aivan oikein: joudut käsittelemään niitä ennen kuin voit jatkaa työtäsi.

Vaikka niiden ohittaminen ei ole vaihtoehto, "yhdistämiskonfliktien käsitteleminen" ei välttämättä tarkoita, että sinun on ratkaistava ne. Niiden kumoaminen on myös mahdollista!

Tämä saattaa olla syytä toistaa: sinulla on aina mahdollisuus kumota yhdistämiskonflikti ja palata aikaisempaan tilaan. Tämä pätee myös silloin, kun olet jo alkanut ratkaista ristiriitaisia ​​tiedostoja ja löytää itsesi umpikujasta.

Näissä tilanteissa on hienoa pitää mielessä, että voit aina aloittaa alusta ja palata puhtaaseen tilaan ennen kuin konflikti edes tapahtui.

Tätä tarkoitusta varten useimmat komennot niissä on --abortvaihtoehto, esimerkiksi git merge --abortja git rebase --abort:

$ git merge --abort $ git status On branch main nothing to commit, working tree clean

Tämän pitäisi antaa sinulle luottamusta siihen, ettet todellakaan voi sotkea. Voit aina keskeyttää, palata puhtaaseen tilaan ja aloittaa alusta.

Mitä ristiriidat todella näyttävät Gitissä

Katsotaanpa nyt, mikä konflikti todella näyttää konepellin alla, tietäen, ettei mikään voi rikkoutua . Tämä demystifioi nuo pienet kiusaajat ja auttaa samalla menettämään kunnioitusta heitä kohtaan ja saamaan luottamusta itseesi.

Tarkastellaan esimerkiksi (tällä hetkellä ristiriidassa olevan) "index.html" -tiedoston sisältöä editorissa:

Git oli ystävällinen merkitsemään ongelma-alueen tiedostoon, liittämällä sen <<<<<<< HEADja >>>>>>> [other/branch/name]. Ensimmäisen merkinnän jälkeen tuleva sisältö on peräisin nykyiseltä työskentelyhaaraltamme. Lopuksi =======merkkirivi erottaa kaksi ristiriitaista muutosta.

Kuinka ratkaista konflikti Gitissä

Meidän tehtävämme kehittäjinä on nyt siivota nämä rivit: Kun olemme valmis, tiedoston on näytettävä täsmälleen niin kuin haluamme sen näyttävän.

Saattaa olla tarpeen keskustella joukkuetoverin kanssa, joka kirjoitti "muut" muutokset, ja päättää mikä koodi on oikea. Ehkä se on meidän, ehkä heidän - tai ehkä sekoitus näiden kahden välillä.

This process - cleaning up the file and making sure it contains what we actually want - doesn't have to involve any magic. You can do this simply by opening your text editor or IDE and starting to making your changes.

Often, however, you'll find that this is not the most efficient way. That's when dedicated tools can save time and effort:

  • Git GUI Tools: Some of the graphical user interfaces for Git can be helpful when solving conflicts. The Tower Git GUI, for example, offers a dedicated "Conflict Wizard" that helps visualize and solve the situation:
  • Dedicated Merge Tools: For more complicated conflicts, it can be great to have a dedicated "Diff & Merge Tool" at hand. You can configure your tool of choice using the "git config" command. (Consult your tool's documentation for detailed instructions.) Then, in case of a conflict, you can invoke it by simply typing git mergetool. As an example, here's a screenshot of "Kaleidoscope" on macOS:

After cleaning up the file - either manually or in a Git GUI or Merge Tool - we have to commit this like any other change:

  • By using git add on the (previously) conflicted file, we inform Git that the conflict has been solved.
  • When all conflicts have been solved and added to the Staging Area, you need to complete the resolution by creating a regular commit.

How to Become More Confident and Productive

Many years ago, when I started using version control, merge conflicts regularly freaked me out: I was afraid that, finally, I had managed to break things for good. ?

Only when I took the time to truly understand what was going on under the hood was I able to deal with conflicts confidently and efficiently.

The same was true, for example, when dealing with mistakes: only once I learned how to undo mistakes with Git was I able to become more confident and productive in my work.

I highly recommend taking a look at the free "First Aid Kit for Git", a collection of short videos about how to undo and recover from mistakes with Git.

Have fun becoming a better programmer!

About the Author

Tobias Günther on Towerin toimitusjohtaja, joka on suosittu Git-työpöytäasiakas, joka auttaa yli 100 000 kehittäjää ympäri maailmaa olemaan tuottavampia Gitin kanssa.