Apasă pe o ramură nouă. Creați o ramură nouă pe server din sucursala locală curentă. Care este diferența dintre „git pull” și „git fetch”

Dacă se utilizează autentificarea cu parolă:

  1. $ git clona https: // nume utilizator: [email protected]/opt/git/repository.git

Lucrați cu ramuri

  Afișați toate ramurile:
  1. filiala $ git
  Creați o filială nouă:
  1. filiala $ git
  Accesați noua sucursală:
  1. $ git plata
  Creați o filială nouă și accesați-o:
  1. $ git checkout -b
  Ștergeți sucursala locală:
  1. $ git filiala -d
  Ștergeți o sucursală dintr-un depozit la distanță:
  1. $ git push origine - ștergeți

Lucrați cu angajamente

Cum să ștergi ultima angajare?

  1. $ git reset --soft HEAD ^
Git cum să. Capitolul 16. Anularea angajamentelor
Git cum să. Capitolul 17. Scoaterea angajamentelor dintr-o ramură
Documentația oficială Git. Bazele Git - Revenirea modificărilor

Cum se schimbă ultimul angajament?

  1. $ git add new_file.txt
  2. $ git angajează --amend

Cum se schimbă comentariul la ultima angajare?

  1. $ git angajează --amend
  2. $ git angajează --amend -m "Comentariu nou"

Cum să combinați mai multe angajamente?

  1. $ git rebase -i HEAD ~ 3
   În loc de HEAD ~ 3, puteți utiliza hash-ul de la angajare. Este necesar să treceți hash-ul acelui angajament la care totul trebuie să fie contopit (aplatizat).
Un editor se va deschide cu o listă de angajamente, cea mai veche angajare va fi în partea de sus.
  1. alegeți 1111111 Comite 1 comentariu
  2. alege 2222222 Comit 2 comentariu
  3. alege 3333333 Comitet 3 comentariu
   Trebuie să înlocuiți pick-ul cu squash pentru a obține acest lucru:
  1. alegeți 1111111 Comite 1 comentariu
  2. squash 2222222 Comit 2 comentariu
  3. squash 3333333 Comit 3 comentariu
   În continuare, trebuie să salvați fișierul și să ieșiți. Un editor de text va fi deschis din nou cu toate comentariile pentru angajamente. Trebuie să editați, să salvați și să ieșiți. După aceste acțiuni, angajamentele vor fi contopite.

Cum să anulați modificările într-un fișier specific și să le returnați în starea în care s-a aflat după ultima angajare?

  1. $ git checkout - file.txt

Cum să anulezi toate modificările necomise (necomise)?

  1. $ git plata

Cum să rețineți unele fișiere pentru următorul angajament?

Să presupunem că doriți să comiteți modificări la unele fișiere și să comiteți modificări la alte fișiere în următorul angajament. Apoi, le puteți elimina temporar din depozit (fișierele de staj), apoi le puteți adăuga din nou.
  1. $ git resetează HEAD file.txt
   Această comandă va șterge fișierul din depozit, va rămâne în comitele vechi. Head indică ultimul angajament din sucursala curentă.

Dacă nu puteți apăsa în depozitul la distanță, deoarece versiunea curentă a depozitului este mai mică decât în \u200b\u200bdepozitul de la distanță

În acest caz, puteți face o apăsare.
  1. $ git push -f origine maestru

Filiale de îmbinare

Cum să luați doar unele fișiere dintr-o altă ramură?

  1. $ git checkout branchname - path / to / file.file

Depozite la distanță

Afișați informații despre un depozit la distanță

  1. $ git originea emisiunii la distanță
  Va afișa așa ceva:
  1. * origine de la distanță
  2. Adresă URL: [email protected]: /opt/git/test-project.git
  3. Adresa URL: [email protected]: /opt/git/test-project.git
  4. Filiala HEAD: maestru
  5. Sucursala de la distanță:
  6. master new (următorul document va fi memorat în telecomenzi / origine)
  7. Ref local configurat pentru "git push":
  8. maestrul împinge spre stăpân (local neactualizat)

Adăugarea unui depozit la distanță

  1. $ git origine adăugare de la distanță [email protected]: /opt/git/test-project.git

Ramurile șterse   - acestea sunt legături către starea sucursalelor din depozitele de la distanță. Acestea sunt sucursale locale care nu pot fi mutate; se mișcă automat de fiecare dată când comunicați prin rețea. Ramurile la distanță acționează ca marcaje pentru a vă aminti de unde au fost sucursalele din depozitele la distanță când v-ați conectat ultima dată la ele.

În acest caz, de exemplu, este posibil să continue litigiile într-o fuziune complexă și să poată păstra toate încercările disponibile de a discuta despre fuziune în sine. Să presupunem acum că Marco îi sugerează lui Gianni că încercarea 2 este cea mai corectă, dar este nevoie de o mică schimbare.

Istoricul rescrie push

Iată situația. În această etapă, avem o a treia soluție de îmbinare, care este rezultatul încercării lui Gianni2, la care Marco și-a adăugat corecțiile. În acest moment, puteți efectua curățarea.


În acest moment, Gianni poate încerca o apăsare care va avea succes dacă, în același timp, nimeni altcineva nu împinge alte modificări de origine.

Acestea arata ca (nume de ștergere repo.) / (Sucursală). De exemplu, dacă doriți să vedeți cum arăta ramura principală pe serverul de origine în timpul ultimei conexiuni la aceasta, verificați originea / filiera principală. Dacă dumneavoastră și partenerul dvs. ați lucrat la o problemă, iar el a postat sucursala iss53, este posibil să aveți propria sucursală locală iss53; dar acea ramură de pe server va indica punctul de confirmare în origine / iss53.

În acest moment, dacă încercați să faceți clic, veți primi un mesaj de eroare. De fapt, Gianni a creat acum o situație în care rezultatul său perfect al modificării contravine obligațiilor anterioare modificării. Această regulă are o consecință, ceea ce sugerează, mai ales după fuziuni complexe, să fie executate un număr mare teste și verificări pentru a vă asigura că fuziunea dvs. este corectă înainte de a face clic. Odată ce apăsarea este de fapt, schimbarea îmbinării devine o operație banală.

Gestionarea sucursalelor într-un sistem distribuit este radical diferită de cea centralizată, unde o sucursală nu este altceva decât o „copie inteligentă” a folderului de control al versiunii. La nivel conceptual, o ramură este o „șir de cod”, care poate fi proiectată și sincronizată în mod independent cu alte șiruri de cod prin operații de îmbinare. Dimpotrivă, în distribuit această necesitate este complet absentă, deoarece conceptul de „linie de cod” este inerent structurii unui depozit distribuit. Procesul de adăugare indică ce modificări ar trebui să fie incluse în următorul angajament și este folosit fie pentru „adăugarea de noi fișiere”, fie pentru „adăugarea fișierelor deja în depozit, dar modificate”.

Toate acestea pot fi confuze, așa că haideți să vă uităm la un exemplu. Am creat un depozit la distanță pe GitHub https://github.com/n0tb0dy/RemoreBranches

Acolo am făcut trei angajamente


Când clonați un depozit la distanță, Git îl va denumi automat origine, ia toate datele de acolo, creează un indicator către ceea ce filiala indică acolo maestru, și sunați-l local origine / stăpân   (dar nu o puteți muta). Git vă va face și propria ramură. maestru, care va începe în același loc cu sucursala maestru   în origine, deci vei avea cu ce să lucrezi.

De fapt, toate fișierele care sunt adăugate sunt adăugate la o anumită zonă numită zona de înscenare, care conține modificările care ar trebui incluse în următorul angajament. La sfârșitul operațiunilor anterioare apare depozitul de probe, așa cum se arată în figura de mai jos, care arată diferența cu sistemul centralizat.

Faptul de a avea depozite locale implică faptul că doi dezvoltatori separati au creat comisioane locale de la același tată și, de aceea, au de fapt două linii de cod diferite: unul pentru dezvoltatori sau ambii au lucrat în sucursala lor locală.

„Originea” nu este un nume special

Acest lucru este similar cu numele ramurii master, care este dat în mod implicit la crearea unui depozit local. La fel ca o ramură maestru   creat implicit atunci când comanda git init, la fel cum este folosit numele implicit origine   la comandă clonă de git. Dacă dați comanda git clone –o booyah, veți primi booyah / master ca ramură de la distanță implicită.

Această situație este inutilă și are sens doar atunci când doriți să vizualizați conținutul depozitului la un moment mai devreme, dar nu este recomandat să-l utilizați pentru lucru și să faceți alte modificări. Prin urmare, vorbind despre un indicator, aceasta este o variabilă simplă care indică un angajament specific și este de obicei numită ramură. De fapt, sucursala nu este o „copie inteligentă” a folderului, ci doar un indicator care indică un angajament specific și vă permite să faceți o „imagine” a acestui angajament.

În acest caz, trebuie să stocați local două linii de cod separate: masterul și cea în care va fi remediată eroarea. În modul centralizat, această opțiune nu este disponibilă, singura analogie este crearea unei sucursale pe server, dar va fi vizibilă pentru întreaga echipă. În acest moment, indicați doar sucursala.

Și deci înapoi la ... angajamentele noastre. Pe un depozit de la distanță, acestea arată așa

Echipa preluare git   primește doar actualizări de la un server pe care nu le-ai avut încă și nu îți schimbă în niciun fel directorul de lucru. Această comandă primește pur și simplu datele și vă permite să decideți singuri ce să faceți cu ele (combinați cu datele dvs., editați etc.)

În acest caz, este clar că sucursala nou creată este doar locală, prin urmare, nu este publicată în sursă. Fila de angajamente oferă o explicație mai detaliată. Aceasta creează sucursala creată doar în depozitul local și nu va vedea pe nimeni. Acum, având două sucursale locale și apoi două indicatoare, acesta este modul în care depozitul local apare după două angajări pe sucursala locală și se angajează în principal.

Figura anterioară arată cum să fuzioneze ramura în care este rezolvată eroarea principală. Imediat ce fiecare conflict este rezolvat, ar trebui să faceți un nou angajament cu soluționarea lor. După cum puteți vedea, rezultatul este similar cu rezolvarea conflictelor cauzate de doi dezvoltatori care au schimbat același fișier în respectivul lor depozite localeConceptul este similar. În cazul anterior, a avut loc un conflict între maestrul local și maestrul de la distanță, iar în acest caz, un conflict are loc între două sucursale locale.

Echipa git trage în majoritatea cazurilor fuzionează imediat datele primite cu ale tale.

În mod normal, este mai bine să utilizați doar comanda git fetch și comanda git merge pentru a putea controla singur procesul de îmbinare.

Ștergeți ramurile șterse

Desigur, mă refer la ștergerea sucursalelor de pe un server la distanță

După rezolvarea conflictelor dintre sucursalele locale, pot exista conflicte suplimentare asupra vrăjitorului cauzate de alți dezvoltatori care au modificat aceleași fișiere ca în figura de mai jos. Rezultatul este prezentat mai jos. În acest caz, avem două sucursale locale și o telecomandă, toate fuziunile sunt făcute și apoi putem face clic pe depozitul central.

Efecte de afiliere locale pentru alți dezvoltatori

Adesea, ramurile locale folosite pentru a corecta erorile sau experimentele nu mai au sens să existe după fuziune și sunt șterse. Operația de ștergere pur și simplu șterge indicatorul, dar toate angajamentele angajate rămân mereu. Un aspect interesant este să înțelegem ce văd alți dezvoltatori atunci când fac atragerea și extrag modificările dezvoltatorilor care au făcut o fuziune locală. Deci, să vedem ce se întâmplă cu un alt dezvoltator de echipă.

$ git push origine - ștergeți serverul fix


Hopa! Și sucursala de pe serverul de la distanță a dispărut. Dar, practic, această comandă elimină pur și simplu indicatorul de ramură de pe serverul de la distanță. Serverul git va continua să stocheze toate informațiile despre comitete până când executați comanda de colectare a gunoiului.

Acest lucru vede un alt dezvoltator. Această situație duce adesea la faptul că oamenii nu folosesc sucursalele locale pentru a nu complica depozitul central, dar acest lucru privează multe dintre avantajele acestui instrument. Să presupunem că cel de-al doilea dezvoltator se plânge că situația este confuză în depozitul său, deoarece sucursala locală creată de primul dezvoltator a făcut ca structura depozitului să fie mai complexă. Dacă toți dezvoltatorii folosesc sucursale locale, depozitul central poate deveni imposibil de gestionat.

Situația este similară cu cea din situația anterioară. Deoarece toate efectele pot fi asimilate folosind instrumentul de instantanee folder, care pentru fiecare angajare păstrează diferențialul cu starea anterioară, toate aceste informații pot fi utilizate pentru a aplica din nou modificări diferențiale pentru diferiți tați. Pentru sucursalele locale limitate de patch-uri, nu există adesea conflicte, apoi operațiunea se finalizează cu succes.