Pur și simplu, un depozit la distanță este unul care nu este al tău. Ar putea fi pe un server central, pe calculatorul personal al unui alt dezvoltator sau chiar pe sistemul dvs. de fișiere. Atâta timp cât îl puteți accesa dintr-un fel de protocol de rețea, Git face incredibil de ușor să împărtășiți contribuțiile cu alte depozite.
Rolul principal al depozitelor de la distanță este reprezentarea altor dezvoltatori din cadrul propriului depozit. Filialele, pe de altă parte, ar trebui să se ocupe doar de dezvoltarea proiectelor. Adică, nu încercați să oferiți fiecărui dezvoltator propria sa ramură de lucru pentru a da fiecăruia un depozit complet și o ramură de rezervă pentru dezvoltarea de caracteristici.
Acest capitol începe prin acoperirea mecanismelor telecomenzilor și apoi prezintă cele două procese de lucru cele mai comune ale colaborării bazate pe Git: fluxul de lucru centralizat și fluxul de lucru al integratorului.
Similar cu git ramură
, git remote
comanda este utilizată pentru a gestiona conexiunile cu alte depozite. Rematele nu sunt altceva decât marcaje pentru alte depozite - în loc să tastați calea completă, vă permit să o referiți cu un nume ușor de utilizat. Vom afla cum putem folosi aceste marcaje în Git Below.
Puteți vizualiza telecomenzi existente apelând git remote
comandă fără argumente:
git remote
Dacă nu aveți telecomenzi, această comandă nu va furniza nicio informație. Dacă ați folosit git clone
pentru a obține magazia dvs., veți vedea o origine
la distanta. Git adaugă automat această conexiune, presupunând că probabil veți dori să interacționați cu ea pe drum.
Puteți solicita mai multe informații despre telecomenzi cu -v
steag:
git remote -v
Aceasta afișează calea completă către depozit. Specificarea căilor la distanță este discutată în secțiunea următoare.
git remote add
comanda creează o nouă conexiune la un depozit la distanță.
git remote add
După ce executați această comandă, puteți ajunge la depozitul Git la
utilizând
. Din nou, acesta este pur și simplu un marcaj convenabil pentru un nume de cale lungă - așa este nu creați o legătură directă în depozitul altcuiva.
Git acceptă multe protocoale de rețea pentru a specifica locația unui depozit la distanță, inclusiv fişier://
, ssh: //
, http: //
, și obiceiul său git: //
protocol. De exemplu:
git adăugați la distanță câteva ssh: //[email protected]/some-user/some-repo.git
După ce executați această comandă, puteți accesa depozitul la github.com/some-user/some-repo.git
numai folosind unii utilizatori
. De când am folosit-o ssh: //
ca protocol, probabil vi se va cere o parolă SSH înainte de a vi se permite să faceți ceva cu contul. Acest lucru face ca SSH să fie o alegere bună pentru acordarea accesului la scriere dezvoltatorilor, în timp ce căile HTTP sunt în general utilizate pentru a oferi acces numai pentru citire. Așa cum vom descoperi în curând, aceasta este concepută ca o caracteristică de securitate pentru mediile distribuite.
În cele din urmă, puteți șterge o conexiune la distanță cu următoarea comandă:
git remote rm
Comitetele pot fi unitatea atomică a controlului versiunii bazate pe Git, dar ramuri sunt mediul în care comunică depozitele la distanță. Ramurile de la distanță acționează la fel ca ramurile locale pe care le-am acoperit până acum, cu excepția faptului că reprezintă o ramură în depozitul altcuiva.
După ce ați descărcat o ramură la distanță, puteți să o inspectați, să o îmbinați și să o extindeți ca orice altă ramură. Acest lucru face ca o curbă de învățare foarte scurtă dacă înțelegeți cum să utilizați sucursalele la nivel local.
Se numește actul de descărcare a sucursalelor dintr-un alt depozit preluam. Pentru a prelua o ramificație la distanță, puteți specifica depozitul și sucursala pe care o căutați:
git fetch
Sau, dacă doriți să descărcați fiecare ramură în
, pur și simplu omiteți denumirea ramurii. După preluare, puteți vedea sucursalele descărcate prin trecerea -r
opțiunea pentru git ramură
:
git branch -r
Acest lucru vă oferă o listă a filialelor care arată în felul următor:
origine / sursă principală / origine unică / altă caracteristică
Ramurile de la distanță sunt întotdeauna prefixate cu numele de la distanță (origine/
) pentru a le distinge de ramurile locale.
Amintiți-vă, Git folosește un depozit la distanță ca marcaje-nu conexiuni în timp real cu alte depozite. Ramurile ramase sunt copii a ramurilor locale ale altui depozit. În afara prelucrării actuale, depozitele sunt medii de dezvoltare complet izolate. Acest lucru înseamnă, de asemenea, că Git nu va prelua automat sucursalele pentru a accesa informațiile actualizate - trebuie să faceți acest lucru manual.
Dar, acesta este un lucru bun, deoarece înseamnă că nu trebuie să vă faceți griji în mod constant despre ceea ce toți ceilalți contribuie în timpul muncii voastre. Acest lucru este posibil numai datorită fluxului de lucru neliniar activat de către filialele Git.
Pentru toate intențiile și scopurile, ramurile de la distanță se comportă ca ramuri numai pentru citire. Puteți să le inspectați în siguranță istoria și să vedeți comitetele prin intermediul acestora Git checkout
, dar nu le puteți continua să le dezvoltați înainte de a le integra în depozitul local. Acest lucru are sens atunci când luați în considerare faptul că sucursalele sunt la distanță copii de angajamente ale altor utilizatori.
...
sintaxa este foarte utilă pentru filtrarea istoricului jurnalului. De exemplu, următoarea comandă afișează orice actualizări noi de la origine / master
care nu sunt în local maestru
ramură. Este, în general, o idee bună să rulați acest lucru înainte de a îmbina schimbările, astfel încât să știți exact ce integrați:
git log master ... origine / master
În cazul în care rezultă orice comitete, înseamnă că sunteți în spatele proiectului oficial și probabil că ar trebui să vă actualizați depozitul. Acest lucru este descris în următoarea secțiune.
Este posibil să verificați ramurile la distanță, dar vă va pune într-o detașare CAP
stat. Acest lucru este sigur pentru vizualizarea modificărilor altor utilizatori înainte de a le integra, dar orice modificări pe care le adăugați vor fi pierdute dacă nu creați un nou sfat local pentru a le referi.
Bineînțeles, întregul punct al preluării este integrarea sucursalelor la distanță în cadrul proiectului dvs. local. Să presupunem că sunteți contribuitor la un proiect cu sursă deschisă și că ați lucrat la o funcție numită unele feature
. Ca proiect "oficial" (de obicei, subliniat de origine
), vă recomandăm să vă încorporați noile angajamente în depozitul dvs. Acest lucru ar asigura faptul că caracteristica dvs. funcționează în continuare cu evoluțiile de sângerare.
Din fericire, puteți folosi exact același lucru git merge
comanda pentru a încorpora modificările de la origine / master
în sucursala dvs.:
git checkout unele funcții git preluare origine git îmbinare origine / master
Din moment ce istoria dvs. a diferit, rezultă o îmbinare cu 3 căi, după care dvs. unele feature
sucursala are acces la cea mai actualizată versiune a proiectului oficial.
maestru
într-o ramură de trăsături Cu toate acestea, în mod frecvent fuzionează cu origine / master
doar pentru a trage în actualizări în cele din urmă rezultă într-o istorie plină cu comitete de îmbinare fără sens. În funcție de cât de bine este nevoie de caracteristica dvs. pentru a urmări restul bazei de cod, rebalizarea ar putea fi o modalitate mai bună de a integra schimbările:
git checkout unele funcții git preluare origine git rebase origine / master
Ca și în cazul rebalizării locale, aceasta creează o istorie perfect liniară, lipsită de comitete de îmbinare inutile:
maestru
Rebasingul / fuzionarea ramurilor aflate la distanță are exact aceleași compromisuri ca cele discutate în capitolul despre sucursalele locale.
Deoarece secvența de preluare / îmbinare este o astfel de întâlnire obișnuită în dezvoltarea distribuită, Git oferă o Trage
comandă ca o comandă rapidă convenabilă:
git trage origine / maestru
Aceasta prelucrează ramura principală a originii și apoi o îmbină în ramura curentă într-un singur pas. Puteți, de asemenea, să treceți --rebase
opțiunea de a utiliza git rebase
in loc de git merge
.
Pentru a completa git fetch
comanda, Git oferă, de asemenea, o Apăsați
comanda. Împușcarea este aproape opusul preluării, prin faptul că aducând ramuri de importuri, în timp ce împingea exporturile de sucursale către un alt depozit.
git push
Comanda de mai sus trimite serviciul local
la depozitul de la distanță specificat. Cu excepția, în loc de a la distanta ramură, git push
creează un local ramură. De exemplu, executând git împinge mary-meu caracteristică
în repozitoriul local va arăta după cum urmează din perspectiva Mariei (magazia dvs. nu va fi afectată de împingere).
Observa asta mi-caracteristica
este a local ramificație în depozitul Mariei, în timp ce ar fi a la distanta sucursală o luase ea însăși.
Aceasta face ca împingerea unei operațiuni periculoase. Imaginați-vă că vă dezvoltați în propriul depozit local, când, dintr-o dată, o nouă filială locală apare de nicăieri. Dar, arhivele ar trebui să servească ca medii de dezvoltare complet izolate, deci de ce ar trebui git push
chiar exista? Așa cum vom descoperi în scurt timp, împingerea este un instrument necesar pentru menținerea depozitelor publice Git.
Acum, că avem o idee de bază despre modul în care Git interacționează cu alte depozite, putem discuta fluxurile de lucru din lumea reală susținute de aceste comenzi. Cele două modele de colaborare cele mai comune sunt: fluxul de lucru centralizat și fluxul de lucru al integratorului. Utilizatorii SVN și CVS ar trebui să fie destul de confortabili cu aroma Git de dezvoltare centralizată, dar folosind Git înseamnă că veți putea, de asemenea, să folosiți capacitățile sale de îmbinare extrem de eficiente. Fluxul de lucru al integratorului este un model tipic de colaborare distribuit și nu este posibil în sisteme pur centralizate.
Pe măsură ce citiți aceste fluxuri de lucru, rețineți că Git tratează toate depozitele ca fiind egale. Nu există un depozit "master" în conformitate cu Git, așa cum există cu SVN sau CVS. Baza de cod "oficială" este doar o convenție de proiect - singurul motiv pentru care este depozitul oficial este pentru că acolo este locul unde toată lumea origine
puncte de la distanță.
Fiecare model de colaborare implică cel puțin una public repository care servește ca punct de intrare pentru mai mulți dezvoltatori. Depozitele publice au constrângerea unică de a fi neizolat-acestea nu trebuie să aibă un director de lucru. Acest lucru împiedică dezvoltatorii să suprascrieți în mod accidental lucrul cu ceilalți git push
. Puteți crea un depozit gol prin trecerea lui --neizolat
opțiunea pentru git init
:
git init --bare
Depozitele publice ar trebui să funcționeze doar ca spații de depozitare-nu medii de dezvoltare. Acest lucru este transmis prin adăugarea a .git
extindere la calea fișierului repository, deoarece baza de date internă de depozit se află în rădăcina proiectului în loc de .git
subdirector. Deci, un exemplu complet ar putea să arate:
git init - bate some-repo.git
În afară de lipsa unui director de lucru, nu există nimic special în ceea ce privește un depozit gol. Puteți să adăugați conexiuni la distanță, să le împingeți și să le trageți în mod obișnuit.
Fluxul de lucru centralizat este cel mai potrivit pentru echipele mici, unde fiecare dezvoltator are acces la scriere la depozit. Aceasta permite colaborarea utilizând un singur depozit central, la fel ca fluxul de lucru SVN sau CVS. În acest model, toate modificările trebuie să fie partajate prin repozitoriul central, care este de obicei stocat pe un server pentru a permite colaborarea pe Internet.
Dezvoltatorii lucrează individual în propriul depozit local, care este complet izolat de ceilalți. După ce au terminat o funcție și sunt gata să-și împărtășească codul, o curăță, o integrează în local maestru
, și împingeți-l în depozitul central (de ex., origine
). Acest lucru înseamnă, de asemenea, că fiecare dezvoltator are nevoie de acces SSH la depozitul central.
Apoi, toți ceilalți pot aduce noi comitete și le pot încorpora în proiectele lor locale. Din nou, acest lucru se poate face fie cu o fuzionare, fie cu o rebază, în funcție de convențiile echipei.
Acesta este procesul central din spatele fluxurilor de lucru centralizate, dar atinge o bumă atunci când mai mulți utilizatori încearcă să actualizeze simultan depozitul central. Imaginați-vă un scenariu în care doi dezvoltatori au terminat o caracteristică, au îmbinat-o cu cea locală maestru
, și a încercat să o publice în același timp (sau aproape de acesta).
Oricine ajunge pe server mai întâi poate împinge comitetele lor ca normal, dar apoi cel de-al doilea dezvoltator rămâne blocat cu o istorie divergentă, iar Git nu poate efectua o îmbinare rapidă. De exemplu, dacă un dezvoltator pe nume John urma să-și împingă schimbările chiar înainte de Mary, vom vedea un conflict în depozitul Mariei:
Singura modalitate de a face origine
(actualizat de John) meciul lui Mary maestru
este de a suprascrie Ioan se obligă. Evident, acest lucru ar fi foarte rău, așa că Git anulează împingerea și scoate un mesaj de eroare:
! [respins] master -> maestru (non-rapid-forward) eroare: nu a reușit să împingă unele refs la "some-repo.git"
Pentru a remedia această situație, Mary trebuie să se sincronizeze cu depozitul central. Apoi, ea va putea să-și împingă modificările în mod obișnuit.
git preluare origine master git rebase origine / master master push master de origine
În afară de aceasta, fluxul de lucru centralizat este relativ simplu. Fiecare dezvoltator se află în propriul depozit local, tragând / împingând periodic la depozitul central pentru a menține totul la zi. Este un flux de lucru convenabil pentru configurare, deoarece este necesar doar un singur server și utilizează funcționalitatea SSH existentă.
Fluxul de lucru al integratorului este un model de dezvoltare distribuit, în care toți utilizatorii își mențin propriile public repozitoriu, în plus față de cel privat. Există ca soluție la problemele de securitate și scalabilitate inerente fluxului de lucru centralizat.
Principalul dezavantaj al fluxului de lucru centralizat este acela fiecare dezvoltatorul trebuie să împingă accesul la întregul proiect. Acest lucru este bine dacă lucrați cu o mică echipă de dezvoltatori de încredere, dar imaginați-vă un scenariu în care lucrați la un proiect software open source și un străin a găsit un bug, a repara-l și dorește să includă actualizarea în proiect principal. Probabil că nu vreți să-i dați accesul la magazinul central, deoarece el sau ea ar putea începe să împingă tot felul de comiteri aleatorii și veți pierde efectiv controlul asupra proiectului.
Dar, ce puteți face este să spuneți contribuitorului să împingă modificările a lui sau a ei depozit public. Apoi, puteți să-i trageți bug-ul în depozitul dvs. privat pentru a vă asigura că acesta nu conține nici un cod nedeclarat. Dacă aprobați contribuțiile sale, tot ce trebuie să faceți este să le îmbinați într-o sucursală locală și să o împingeți în depozitul principal ca de obicei. Ai devenit un integrator, în plus față de un dezvoltator obișnuit:
În acest flux de lucru, fiecare dezvoltator are nevoie doar de acces la a lui sau a ei depozit public. Contributorul utilizează SSH pentru a-și împinge la depozitul său public, dar integratorul poate prelua modificările prin HTTP (un protocol numai pentru citire). Acest lucru înseamnă un mediu mai sigur pentru toată lumea, chiar dacă adăugați mai mulți colaboratori:
Rețineți că echipa trebuie să convină asupra unui singur depozit "oficial" de retragere - în caz contrar, modificările vor fi aplicate în afara ordinelor și toată lumea va sosi foarte ușor în afara sincronizării. În diagrama de mai sus, "Public Repo" este proiectul oficial.
Ca integrator, trebuie să țineți evidența mai multor telecomenzi decât ați face în fluxul de lucru centralizat, dar acest lucru vă oferă libertatea și securitatea pentru a încorpora modificări de la orice dezvoltator fără a amenința stabilitatea proiectului.
În plus, fluxul de lucru al integratorului nu are un singur punct de acces pentru a servi ca punct de coagulare pentru colaborare. În fluxurile de lucru centralizate, toată lumea trebuie să fie complet actualizată înainte de a publica modificările, dar acest lucru nu este cazul în fluxurile de lucru distribuite. Din nou, acesta este un rezultat direct al stilului de dezvoltare neliniar, prin intermediul implementării ramurii Git.
Acestea sunt avantaje uriașe pentru proiectele mari cu surse deschise. Organizarea a sute de dezvoltatori pentru a lucra la un singur proiect nu ar fi posibil fără securitatea și scalabilitatea colaborării distribuite.
Sprijinirea acestor modele de colaborare centralizată și distribuită a fost tot ce trebuia Git să facă vreodată. Directorul de lucru, stadiul, comitetele, sucursalele și telecomenzile au fost special concepute pentru a permite aceste fluxuri de lucru și practic totul din Git se învârte în jurul acestor componente.
Adevărat în filosofia UNIX, Git a fost conceput ca o suită de instrumente interoperabile, nu un singur program monolitic. Pe măsură ce continuați să explorați numeroasele capacități ale Git, veți găsi că este foarte ușor să adaptați comenzile individuale la fluxuri de lucru complet noi.
Acum vă las să aplicați aceste concepte proiectelor din lumea reală, dar pe măsură ce începeți să includeți Git în fluxul zilnic de lucru, amintiți-vă că nu este un glonț de argint pentru managementul de proiect. Este doar un instrument de urmărire a fișierelor dvs. și nici o cantitate de cunoștințe intime Git nu poate compensa un set de convenții întâmplător în cadrul unei echipe de dezvoltare.
Această lecție reprezintă un capitol din Git Succinct, o carte electronică gratuită de la echipa de la Syncfusion.