Kaip išvengti git konfliktų komandoje?

Mes esame kūrėjai, dirbantys viename projekte, o projektui naudojame git. Jei du ar daugiau iš mūsų dirba su tuo pačiu failu, gauname git konfliktus, kuriuos sunku valdyti, kartais vieno kūrėjo padaryti pakeitimai prarandami, kai atsiranda šie konfliktai.

Kaip jie dirba su git komanda? Kokia turėtų būti tinkama gija, kad būtų išvengta konfliktų?

Ačiū iš anksto.

35
11 мая '13 в 0:10 2013-05-11 00:10 „Dev01“ yra nustatytas gegužės 11 d., 13 val. 0:10 2013-05-11 00:10
@ 8 atsakymai

Prieš išleidžiant į darbo eigą, prieš išleidžiant minutę ar dolerį pinigų atkurdami komunikacijos procesus, paklauskite savo komandos trijų klausimų:

  • Ar įgyvendiname vykdymo susitarimus?
  • Jei naudojame IDE, ar jie visi naudoja tuos pačius formatavimo ir raktinių žodžių nustatymus? Pavyzdžiui, „Eclipse“ gali automatiškai užbaigti nustatymus .
  • Ar gaminame teksto surinkimo artefaktus? Pvz., Ar mes sumažiname js, generuojame CSS taisykles iš .sass arba .scss arba sukuriame xml konfigūracijas skristi? Ar mes juos tikriname?

Po kelerių metų konflikto ir padedant kitiems žmonėms centralizuotose darbo vietose manau, kad šie trys dalykai sukelia didžiąją dalį mūsų kolektyvinių konfliktų:

2019

40
11 мая '13 в 6:55 2013-05-11 06:55 Christopherio atsakymas gegužės 11 d. 13 val. 6:55 2013-05-11 06:55

Atvirai kalbant, teisinga darbo eiga apima gerą bendravimą ir valdymą. Komandos nariai dažnai neturi dirbti su tuo pačiu konfliktu. Tokie dalykai kaip kasdieniniai stelažai ir dėmesingas vadybininkas, kuris žino, kad kiekvienas komandos narys, bent jau apskritai, daugeliu atvejų turės didelį skirtumą, kad jį apribotų.

Žinoma, tai priklauso nuo tikslaus gaminio pobūdžio, tačiau tai labiau organizacinė problema nei git problema. Tiesą sakant, konfliktai dažnai suvokiami kaip „geri“ dalykai, nes jie verčia žmones atsikelti iš savo stalų arba paskambinti vieni kitiems, kodėl kilo konfliktas ir ką reikia daryti šia kryptimi. Tai yra galimybė išsiaiškinti, kad vienas asmuo turi turėti vieną sritį ar rinkmenų rinkinį, arba bent jau būti kontaktiniu punktu, kuriame aptariami šio skirsnio pakeitimai.

Už vystymosi plano nėra jokio būdo išvengti gitų konfliktų, tačiau tai bus ta pati problema bet kurioje versijos valdymo sistemoje. Kiekvieną kartą, kai du žmonės pakeičia tą pačią kodo dalį, turite sužinoti, kas laimės. Štai kodėl iš tikrųjų netikslinga ieškoti sprendimo versijos, bet pažvelgti į savo komandos metodus ir metodus. Du automobiliai tuo pačiu metu negali eiti per sankryžą, tačiau labai sunku sugalvoti automobilius, kurie gali eiti per vienas kitą, todėl mes sukūrėme stabdžių sistemų ir eismo signalų valdymo sistemas. Tai panaši problema. Negalime atlikti dviejų pakeitimų, nesutampa, todėl turime kontroliuoti, kaip mes dirbame su failais.

Galite apsvarstyti vieną iš sąsajų, leidžiančių blokuoti gitą, bet aš tikrai nesutinku su šia koncepcija, neskaitant neišmatuojamų failų tipų. Manau, kad geriau suprasti efektyvesnę komandos darbo eigą ir tuo pat metu naudoti ją kaip galimybę labai efektyviai sujungti failus. Aš tai padariau, o dabar, praėjus keliems mėnesiams po to, konfliktai mane nekenčia.

10
11 мая '13 в 1:40 2013-05-11 01:40 atsakymą pateikė Gary Fixler gegužės 11 d., 13 val. 1:40 2013-05-11 01:40

Yra tik vienas būdas išvengti konfliktų: skirtingiems žmonėms nereikia redaguoti to paties failo tuo pačiu metu. Iš esmės kiekvienas failas turi savininką, kuris yra atsakingas už visus pakeitimus ir kuris gali perduoti nuosavybę kitam. Failo nuosavybė gali būti perduodama pagal tam tikrą funkciją / filialą arba kasdienį laiką, jei nuosavybė tampa aiški.

Jei pastebėsite, kad negalite duoti kiekvieno failo vienam savininkui, tada:

  • failus reikia suskirstyti į mažesnius failus, kuriuos galima priskirti tam pačiam savininkui
  • Būtina, kad GIT konfliktai išspręstų (visi redaktoriai sėdi, kad išspręstų individualius konfliktus).
  • Naudokite gerą įrankį su keliais susiliejimais vizualizacijai ir konfliktų sprendimui.
7
12 мая '13 в 3:13 2013-05-12 03:13 atsakymas duotas „ GoZoner“ gegužės 12 d., 13 val. 13:13 2013-05-12 03:13

Racionalizavimas.

Taip pat yra keletas dalykų, kuriuos galite padaryti. Tai bus aiškiau, jei juos skelbsiu atskirai.

Jei įdėsite naujų dalykų, tai padės nustatyti, ar kuriate konfliktus.

Pateikite darbuotojų vardų sąrašą

 Andy, Oliver, Ivan, 

Tada prisijungia Bradas ir Patrikas, o jų vardai pridedami prie sąrašo. Jūs pridedate Bradą, ir aš pridedu Patrick. Į sąrašo apačią įtraukiame vardus ir naudodami „git“ sujunkite mūsų sąrašus. Rezultatas bus žinomas git naudotojams: -

 Merge branch 'Patrick' into Brad Conflicts: names.txt @@@ -1,4 -1,4 +1,8 @@@ Andy, Oliver, Ivan, <<<<<<< HEAD +Brad, ======= + Patrick, >>>>>>> Patrick 

Dabar manau, kad mes tai darėme, bet į mūsų sąrašą įtraukėme paprastą abėcėlę. Dabar, kai atėjome į dviejų filialų sąjungą, rezultatai yra šiek tiek gražesni: -

 Andy, Ivan, Oliver, 

Pridėkite vieną vardą ir tada sujunkite kitą asmenį su gitu, kad pridėtumėte kitą vardą.

 Auto-merging names.txt Merge made by the 'recursive' strategy. names.txt | 1 + 1 file changed, 1 insertion(+) 

Ir gauti

 Andy, Brad, Ivan, Oliver, Patrick, 

Kadangi mes nežinome, kas ketina prisijungti prie bendrovės, mes pridedame prie sąrašo atsitiktinai ir, įterpdami į atsitiktines vietas, failų vietos konfliktai yra mažiau tikėtini.

3
05 нояб. Atsakymą pateikė user3070485 05 Nov. 2015-11-05 18:39 '15, 18:39 pm 2015-11-05 18:39

Naudokite pradinį bloką

Tokioje programinėje įrangoje ...

 function chess() { while (!end_of_game) { make_move() 

linijos, kurių blokai su atidarymo skliausteliais yra lengvai supainioti su kitomis programinės įrangos linijomis, susidedančiomis iš atskirų atidarymo skliaustų. Jei ta pati programinė įranga parašyta taip, pridėkite bloką prasideda ankstesnės eilutės ...

 function chess() { while (!end_of_game) { make_move() 

aš asmeniškai nemėgstu, bet „Git“, yra daug mažiau linijų, kurios atrodo kaip „Git“ ir klaidingai priima viena kitą, t.y. Git yra labiau linkęs priimti redagavimą taip pat, kaip ir mes, kad bet kokie konfliktai būtų daug lengviau išspręsti.

Ir komentarų blokų pabaigoje

Naudokite komentarus, kad panašios linijos būtų atskiriamos.

Jei rašote daug „JavaScript“ ir „JSON“, jums gali būti daug tokių eilučių.

  } } } ) 

Jei komentuosite situaciją, tada jie gali būti atskirti.

  } } } ) // end of weekdays() 

ir

  } } } ) // end of weekend() 

„Git“ nebetinka. Tai padės Git geriau suprasti jūsų pakeitimus. Jei pridėsite kažką, pvz

 function a() { ... } // end of a() 

Git greičiausiai tai matys kaip pokyčių vienetas ir nemanys, kad pridėjote kažką panašaus

 } function a() { ... 

prieš ką nors kitos funkcijos pabaigą. Net jei tai neužkerta kelio konfliktams, jei „Git“ supranta ir supranta savo pakeitimus protingai (ty, kaip mes juos psichiškai ištirti), tada galite lengvai išspręsti konfliktus. Apibūdinamasis pavadinimas, komentuojantys, kokias funkcijas atlieka, parametrai, kurių jie imasi, ir tt Taip pat padeda užkirsti kelią „Git“ supainioti kaimyninių funkcijų turinį.

1
05 нояб. Atsakymą pateikė user3070485 05 Nov. 2015-11-05 19:12 '15 19:12 2015-11-05 19:12

Praneškite kolegoms, kai spustelėjote pakeitimus.

Kitas būdas sumažinti konflikto skausmą yra tiesiog papasakoti kolegoms, kai jūs paspaudėte pakeitimus. Tai leidžia jiems patraukti savo pokyčius ir išspręsti kai kuriuos konfliktus ten ir tada. Bet kokie konfliktai gali būti tarp jūsų neseniai įvykusių pokyčių, šviežių jūsų proto ir to, ką jie dirba, švieži jūsų mintyse.

Jei žmonės nepasitraukia pokyčių iš pagrindinės šakos, kol jie nebaigė didelio vystymosi, tada susiduria su konfliktais su keleto toje pačioje vietovėje gyvenančių žmonių pasikeitimais, tada bus sunkiau išspręsti.

Naudokite mergetool

Vienas iš „Git“ tikslų yra versijos valdymas. Kitos programos specializuojasi failų susijungimo ir konfliktų sprendimo srityse. Jei nustatysite „Mergetool“, skirtą naudoti su „git“, tai gali automatiškai išspręsti daugelį problemų, kurias „Git“ traktuoja kaip konfliktą, arba bent jau labai gerai atspindi, kad galėtumėte patikrinti ir palikti nepaliestą, jei atrodo gerai. pasitikėkite įrankiu.

Tai palieka mažiau realių konfliktų, kuriems reikia protingo sprendimo.

Naudokite mažesnius failus

Mycontrollers.js apačioje pridedu naują valdiklį, o savo kontrolierių.js apačioje pridedate naują valdiklį.

Allcontrollers.js apačioje pridedame naują valdiklį: konfliktas.

(Nepamirškite, kaip rūšiuoti daiktus abėcėlės tvarka. „MyNewController“ (), pradedant nuo M, gali būti failo viduryje, o „NewController“ (), pradedant nuo Y, gali eiti to paties failo pabaigoje, dar kartą be konfliktų.)

1
23 июня '16 в 19:10 2016-06-23 19:10 atsakymą pateikė vartotojo3070485 birželio 23 d. 16:10 2016-06-23 19:10

Kad sumažintumėte versijų valdymo konfliktų skaičių, nesirūpindami, kas redaguoja, ką tik reikia atlikti mažus pakeitimus ir juos išspręsti / žingsnis po žingsnio. Padalinkite problemą pakankamai mažose dalyse, kad galėtumėte greitai pakeisti failus ir stumti juos atgal į bagažinę. Kuo trumpesnis jūsų filialų gyvenimas, tuo mažiau tikėtina, kad susiliejate konfliktai.

Net tada, tam tikru momentu, du žmonės tuo pačiu metu redaguos tą pačią bylą, be savo kaltės. Akivaizdus klausimas yra, kai taip atsitinka:

„Kaip atsikratyti git konfliktų?

Atsakymas yra, kad jūs turite traukti kamieną ir dažnai pertvarkyti savo filialą į jį, o jūs pastebėsite, kad konfliktai bus kuo anksčiau, kol jie vis dar nedideli. Šiuo metu abu kūrėjai turėtų sėdėti kartu ir ramiai aptarti geriausią būdą tęsti, o jų proto pokyčiai yra nauji.

Palyginkite šį požiūrį su bandymu išspręsti konfliktus dėl didelių ilgų gyvenamųjų šakų panikos netrukus prieš išleidimo terminą, kai kūrėjai stengiasi įsiminti visus pakeitimus, kuriuos jie padarė prieš kurį laiką.

0
11 февр. Atsakymą pateikė Will Sheppard 11 vasaris. 2016-02-11 19:37 '16 at 7:37 pm 2016-02-11 19:37

Tekstiniams failams naudokite UTF-8, o ne UTF-16.

Daugelis „Git“ versijų (t. Y. Kiekviena mano naudojama versija) gali apdoroti UTF-16 failus kaip dvejetainius failus, nes tipiniame UTF-16 tekstiniame faile yra daug nulio baitų.

Kai „Git“ failą laiko dvejetainiu failu, jis tikriausiai toliau apdoros failą kaip dvejetainį failą, net jei jis yra pakeistas. Tai reiškia, kad versijos valdymas atliekamas saugant visas failo versijas, o ne skirtumus tarp jų, o kai kurie versijos valdymo sistemos privalumai yra prarasti. (Redaguoti: Ne. Neseniai tai išbandžiau keisdamas UTF-16 failą į UTF-8, jį vykdant, redaguojant ir dar kartą - pradėjau apdoroti teksto pakeitimų pakeitimus po šaltinio ir redagavimo failų UTF-8. )

Dauguma šiuolaikinių redaktorių atpažįsta simbolių kodavimo stilių ir failo pabaigą bei išsaugo failą tuo pačiu formatu. Kai kurie redaktoriai (pavyzdžiui, „Babelpad“) leis jums pasirinkti, ar išsaugoti failą į UTF-8 ar UTF-16, su baitų užsakymu arba be jo.

Jei failas, kurį norite valdyti naudodami UTF-16 formato (i) versiją, ir (ii) veiks taip pat gerai UTF-8 - pavyzdžiui, tinkamos šiuolaikinio kompiliatoriaus šaltinio programa - turėtumėte apsvarstyti galimybę jį konvertuoti į UTF-8.

Jei „Git“ daro prielaidą, kad jūsų pirminis kodas yra dvejetainis failas, prieš jį pirmą kartą, peržiūrėkite jį ir pažiūrėkite, ar jis turėtų būti įkeltas į redaktorių ir išsaugoti jį kitame formate, kurį „Git“ atpažįsta kaip tekstą.

(Pastaba: pagal nutylėjimą „Linux“ failai paprastai turi „UTF-8“. Kai kurios „Windows“ programos turi įprotį sukurti „UTF-16“, todėl „Windows“ naudotojai greičiausiai turės problemų. failo nustatymas prieš „Git“ mano, kad jis turi dvejetainį failą!)

2019