Cum se utilizează Git merge

Publicat: 2023-01-03
Două poteci se contopesc într-una singură într-un parc cu iarbă.
Master Hands/Shutterstock.com
Pentru a îmbina o ramură de dezvoltare în ramura curentă, utilizați „git merge dev-branch-name”. Dacă primiți avertismente de conflict despre o îmbinare, utilizați „git merge --abort” pentru a ieși din ea sau editați fișierele afectate și apoi confirmați-le.

Git folosește ramuri pentru a izola fluxurile de dezvoltare, pentru a preveni poluarea ramurii stabile de eliberare. Aducerea muncii într-o ramură în fluxul principal înseamnă fuzionarea ramurilor. Iată cum o faci.

Cuprins

Ce este o fuziune în Git?
Pregătirea pentru fuzionarea unei sucursale în Git
Efectuarea unei fuziuni
Efectuarea unei îmbinări cu înainte rapidă în Git
Cum se rezolvă conflictele de îmbinare în Git
Totul se îmbină în cele din urmă

Ce este o fuziune în Git?

Git a fost conceput pentru a face ramificarea simplă și rapidă. Spre deosebire de alte sisteme de control al versiunilor, ramificarea pe Git este o chestiune trivială. În special pentru proiectele cu mai mulți dezvoltatori, ramificarea este unul dintre instrumentele organizaționale de bază ale Git.

Ramurile sandbox noi eforturi de dezvoltare, astfel încât codul să poată fi modificat sau adăugat fără a afecta codul din alte ramuri, în special ramura principală sau principală. Acesta conține de obicei versiunea stabilă a bazei de cod.

Izolarea acestor modificări de versiunea de cod stabilă are sens perfect. Dar, mai devreme sau mai târziu, noul cod va fi testat, revizuit și ștampilat pentru a fi introdus în ramura principală. În acel moment, trebuie să îmbinați ramura dvs. în ramura principală.

Cum funcționează ramurile Git?
LEGATE Cum funcționează ramurile Git?

De fapt, ramurile pot avea sub-ramuri, astfel încât s-ar putea să vă fuzionați ramura într-o altă ramură în loc de ramura principală. Nu uitați că îmbinările iau întotdeauna o ramură și o îmbină într-o ramură țintă , oricare ar fi acea ramură. Dacă doriți să îmbinați ramura dvs. principală într-o altă ramură, puteți chiar să faceți asta.

La fel ca majoritatea acțiunilor din Git, efectuați îmbinări în depozitul dvs. local și le împingeți în depozitul dvs. de la distanță.

Pregătirea pentru fuzionarea unei sucursale în Git

Avem un mic proiect de dezvoltare cu un depozit Git local și un depozit Git la distanță. Am creat o ramură numită „bugfix14” din ramura „master” și am lucrat la o soluție la o eroare.

Lucrarea a fost finalizată și ne-am testat codul. Totul funcționează conform așteptărilor. Vrem să transferăm acele modificări în ramura principală, astfel încât remedierea noastră să facă parte din următoarea ediție a software-ului.

Mai trebuie făcută o mică pregătire înainte de a realiza fuzionarea. Trebuie să ne asigurăm că ramura țintă – în acest caz ramura „master” – și ramura pe care o vom îmbina în ea sunt ambele actualizate.

Pentru a face acest lucru, vom folosi comanda git status .

 starea git 

Folosind git status pentru a vedea starea unei ramuri

  • Pe ramură bugfix14 : Aceasta este ramura noastră actuală.
  • Ramura dvs. este actualizată cu „origin/bugfix” : ramura din depozitul nostru local are același istoric de comitere ca și ramura din depozitul de la distanță. Asta înseamnă că sunt identice.
  • nimic de comis Nu există modificări în zona de staging care să nu fi fost comise.
  • curățarea arborelui de lucru : nu există modificări fără etapă în directorul de lucru.

Toate acestea indică faptul că filiala este la zi și suntem clari să continuăm. Dacă oricare dintre acestea a indicat că există modificări, ar trebui să le punem în scenă, să le comităm și să le împingem la telecomandă. Dacă altcineva a lucrat la aceste fișiere, poate fi necesar să le extragem modificările din depozitul de la distanță.

Verificarea ramurii în care ne vom îmbina, simplifică procesul de fuziune. De asemenea, ne permite să verificăm că este actualizat. Să aruncăm o privire la ramura principală.

 git checkout master
 starea git 

Verificarea ramurii master și utilizarea git status pentru a vedea starea acesteia

Primim aceleași confirmări că ramura „master” este la zi.

RELATE: Cum să alegi fluxul de lucru Git și modelul de ramificare potrivit pentru echipa ta

Efectuarea unei fuziuni

Înainte de a fuziona, angajamentele noastre arată astfel.

Istoricul comitării înainte de fuzionarea unei sucursale

Ramura „bugfix14” a fost ramificată din ramura „master”. A existat un commit pentru ramura „master” după ce a fost creată ramura „bugfix14”. Au existat câteva comiteri în ramura „bugfix14”.

Ne-am asigurat că cele două sucursale ale noastre sunt actualizate și am verificat filiala „master”. Putem lansa comanda pentru a îmbina ramura „bugfix14” în ramura „master”.

 git merge bugfix14 

îmbinarea unei ramuri cu comanda git merge

Fuziunea are loc. Ramura „bugfix14” încă există, dar acum modificările care au fost făcute în acea ramură au fost îmbinate în ramura „master”.

Istoricul comenzilor după fuziunea unei sucursale

În acest caz, comanda merge realizează o îmbinare în trei căi . Există doar două ramuri, dar sunt implicate trei comisii. Ei sunt șefii fiecărei sucursale și un al treilea commit care reprezintă acțiunea de îmbinare în sine.

Pentru a actualiza depozitul nostru de la distanță, putem folosi comanda git push .

 git push 

Impingerea de modificări într-un depozit la distanță

Unii oameni preferă să șteargă ramurile laterale odată ce le-au îmbinat. Alții au grijă să le păstreze ca o înregistrare a adevăratei istorii de dezvoltare a proiectului.

Dacă doriți să ștergeți ramura, puteți face acest lucru folosind comanda git branch cu opțiunea -d (ștergere).

 git branch -d bugfix14 

Ștergerea unei ramuri din depozitul local

Pentru a șterge ramura din depozitul de la distanță, utilizați această comandă:

 git push origin --delete bugfix14 

Ștergerea unei ramuri din depozitul de la distanță

Veți avea un istoric de comitere liniar, dar nu va fi istoricul adevărat.

RELATE: Cum să ștergeți ramurile Git din arhivele locale și de la distanță

Efectuarea unei îmbinări cu înainte rapidă în Git

Dacă nu ați făcut niciun commit în ramura „master”, istoricul dvs. va arăta astfel. Acesta va arăta, de asemenea, dacă v-ați rebazat ramura de dezvoltare, astfel încât să fie atașată la sfârșitul ramurii „master”.

Istoricul comitărilor înainte de o îmbinare rapidă înainte

Deoarece nu există comiteri în ramura „master”, pentru a îmbina ramura „bugfix15”, tot ce trebuie să facă Git este să îndrepte indicatorul principal „master” către ultima comitere a ramurii „bugfix15”.

Putem folosi comanda obișnuită git merge :

 git merge bugfix15

Asta ne dă acest rezultat.

O modalitate de a vizualiza rezultatul unei îmbinări rapid-forward

Care este la fel ca acesta:

O altă modalitate de a vizualiza rezultatul unei îmbinări rapid-forward

Care este la fel ca acesta:

Încă un alt mod de a vedea rezultatul unei îmbinări rapide

Git va efectua o îmbinare rapidă înainte ori de câte ori poate . Dacă se comite la ramura „master” înseamnă că o îmbinare rapidă înainte nu este posibilă, Git va folosi o îmbinare în trei căi .

Nu puteți forța o îmbinare rapid-forward — s-ar putea să nu fie posibil, până la urmă — dar puteți declara că va fi o îmbinare rapid-forward sau nimic. Există o opțiune care îi instruiește pe Git să folosească o îmbinare rapidă înainte, dacă poate, dar să nu facă o îmbinare în trei căi dacă nu poate. Opțiunea este --ff-only (doar îmbinarea rapidă înainte).

Aceasta îmbină ramura „bugfix15” în ramura „master”, dar numai dacă este posibilă o îmbinare rapidă înainte.

 git merge --ff-only bugfix15 

Utilizarea opțiunii --ff-only pentru a preveni utilizarea unei îmbinări în trei căi dacă nu este posibilă o îmbinare rapidă înainte

Git se va plânge și va ieși dacă nu este posibil.

 git merge --ff-only bugfix16 

Git nu realizează nicio îmbinare deoarece o îmbinare rapidă înainte nu este posibilă și a fost folosită opțiunea --ff-only

În acest caz, au existat comiteri către ramura „master”, astfel încât o îmbinare rapidă înainte nu este posibilă.

Cum se rezolvă conflictele de îmbinare în Git

Dacă aceleași porțiuni ale aceluiași fișier au fost modificate în ambele ramuri, ramurile nu pot fi îmbinate. Este necesară interacțiunea umană pentru a rezolva modificările aflate în conflict.

Aici, am făcut modificări unui fișier numit „rot.c” într-o ramură numită „bugfix17” pe care dorim să o îmbinăm cu ramura „master”. Dar „rot.c” a fost schimbat și în ramura „master”.

 git merge bugfix17 

Obțineți raportarea conflictelor și oprirea unei îmbinări

Când încercăm să-l îmbinăm, primim un avertisment că există conflicte. Git listează fișierele aflate în conflict și ne spune că îmbinarea a eșuat. Ne-am putea retrage complet folosind opțiunea --abort :

 git merge --abort

Dar rezolvarea fuziunilor nu este atât de înfricoșătoare pe cât pare. Git a lucrat pentru a ne ajuta. Dacă edităm unul dintre fișierele aflate în conflict - în cazul nostru, avem doar unul - vom găsi secțiunile de cod conflictuale evidențiate pentru noi.

Cum identifică git conflictele dintr-un fișier

Fiecare conflict este delimitat de șapte caractere mai mici decât „ <<<<<<< ” și șapte caractere mai mari decât „ >>>>>>> „, cu șapte semne egale „ ======= ” între ele .

  • Codul de deasupra semnelor egal este de la ramura în care vă îmbinați.
  • Codul de sub semnul egal este codul din ramura pe care încercați să o îmbinați .

Puteți căuta cu ușurință unul dintre seturile de șapte caractere și puteți trece de la conflict la conflict prin fișierul dvs. Pentru fiecare conflict, trebuie să alegeți ce set de editări veți păstra. Trebuie să editați codul pe care îl respingeți și liniile de șapte caractere pe care le-a adăugat Git.

Vom păstra codul din ramura „bugfix17”. După editare, fișierul nostru arată astfel.

Textul editat, rezolvând conflictul de îmbinare

Acum putem continua cu fuziunea. Dar rețineți că folosim comanda commit pentru a face acest lucru, nu comanda merge .

Commitem modificarea prin punerea în scenă a fișierului și comiterea acestuia ca de obicei. Vom verifica starea înainte de a face comitarea finală.

 git add rot.c
 starea git
 git commit -m „Remedierea erorii fuzionate17” 

Utilizarea comenzii commit pentru a finaliza o îmbinare după rezolvarea conflictelor

Fuziunea este completă. Acum putem împinge acest lucru în depozitul nostru de la distanță.

LEGATE: Cum să remediați, să editați sau să anulați comiterile Git (modificarea istoricului Git)

Totul se îmbină în cele din urmă

Toate ramurile trebuie să fie comasate, eventual, pentru ca schimbările din ele să nu devină orfane și uitate.

Îmbinarea ramurilor este ușoară, dar gestionarea conflictelor se poate complica în echipele ocupate și mai mari. Rezolvarea conflictelor poate necesita contribuția fiecărui dezvoltator doar pentru a explica ce face codul său și de ce și-a făcut modificările. Trebuie să înțelegeți acest lucru, înainte de a putea lua o decizie în cunoștință de cauză cu privire la editările pe care să le păstrați.

Din păcate, Git nu poate ajuta cu asta.

LEGATE: Ar trebui să utilizați un client GUI Git?