Cum se utilizează Git merge
Publicat: 2023-01-03Git 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.
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ă.
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
- 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
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.
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
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”.
Î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
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
Pentru a șterge ramura din depozitul de la distanță, utilizați această comandă:
git push origin --delete bugfix14
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”.
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.
Care este la fel ca acesta:
Care este la fel ca acesta:
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
Git se va plânge și va ieși dacă nu este posibil.
git merge --ff-only bugfix16
Î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
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.
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.
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”
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?