Git - este tragerea sau rebazarea atunci când lucrează pe ramuri cu alți oameni

Deci, dacă folosesc sucursale care sunt sucursale la distanță și vreau să obțin cea mai recentă, încă nu știu dacă ar trebui să fac git pull sau git rebase code>. M-am gândit că am citit că făcând git rebase când lucrez la o ramură cu alți utilizatori, poate să-i înșele atunci când trag sau rebasează. E adevarat? Ar trebui să folosim cu toții git pull ?

0

5 răspunsuri

Dacă doriți să trageți sursă, fără a afecta sucursale de la distanță și fără modificări în copia locală, cel mai bine este să utilizați git pull.

Cred că dacă aveți o ramură de lucru pe care ați făcut-o modificări, utilizați git rebase pentru a schimba baza acelei sucursale pentru a fi ultimul maestru la distanță, veți păstra toate modificările sucursalei, cu toate acestea ramura va fi ramificată acum de la master locație, mai degrabă decât în ​​cazul în care a fost anterior divizată.

0
adăugat

Git rebase este o re-scriere a istoriei. Nu trebuie să faceți niciodată acest lucru pe sucursalele care sunt "publice" (adică sucursalele pe care le împărțiți altora). Dacă cineva îți clonează sucursala și apoi îți recastigi sucursala - atunci nu mai pot trage/îmbina schimbările de la ramura ta - va trebui să-i arunce pe cel vechi și să-l retragă.

Acest articol pe software-ul de ambalare cu git este o citire foarte utilă. Este vorba mai mult despre gestionarea distribuțiilor de software, dar este destul de tehnic și vorbește despre modul în care pot fi utilizate/gestionate/distribuite filialele. Vorbesc despre când să renteze și când să tragă și care sunt consecințele diferite ale fiecăruia.

Pe scurt, amândoi au locul lor, dar trebuie să distrugeți diferența.

0
adăugat
Pe scurt, nu refaceți niciun comitet care trăiește în alte depozite.
adăugat autor Ikke, sursa
Problema este dacă altcineva trage dintr-o ramură pe care apoi o renunți. E bine dacă trag din A în local apoi rebase local și altcineva trage din A . Nu este bine dacă trag din A , altcineva trage din local , apoi rebase local .
adăugat autor Cameron Skinner, sursa
Este adevărat, @ Pat? În cazul unui "pull -rebase", nu re-ordonați comitetele locale pentru a fi pe lângă ceea ce ați scos? Deoarece acestea au fost comitete locale și nu au fost încă publicate, cum vor sparge pe cineva care încearcă să tragă după ce pull --rebase 'ed?
adăugat autor Gabe Hollombe, sursa

git pull does a merge if you've got commits that aren't in the remote branch. git rebase rewrites any existing commits you have to be relative to the tip of the remote branch. They're similar in that they can both cause conflicts, but I think using git rebase if you can allows for smoother collaboration. During the rebase operation you can refine your commits so they look like they were newly applied to the latest revision of the remote branch. A merge is perhaps more appropriate for longer development cycles on a branch that have more history.

Ca cele mai multe alte lucruri în git, există o mulțime de funcționalități suprapuse pentru a se potrivi cu diferite stiluri de lucru.

0
adăugat

Git pull este o combinație de 2 comenzi

  • git fetch (sincronizează repo local cu cele mai noi lucruri de pe telecomandă)
  • git merge (îmbină schimbările din ramura îndepărtată, dacă există, în ramura de urmărire locală)

git rebase este doar un echivalent dur cu fuziunea git. Nu aduce nimic de la distanță. De fapt, nu se face nici o fuziune corectă, ci se repetă comitetele ramurii în care te afli, după ce noul se angajează dintr-o a doua sucursală.

Scopul său este, în principal, de a vă permite să aveți o istorie mai curată. Nu este nevoie de multe fuzionări de către mulți oameni înainte de istoria trecutului în gitk devine teribil de spaghete.

Cea mai bună explicație grafică poate fi văzută în primele 2 imagini aici . Dar permiteți-mi să vă explic aici cu un exemplu.

Am 2 filiale: maestru și mie. Când stau pe fundul meu, pot alerga

git rebase master

și voi primi ceva nou în maestru înainte de cele mai recente comitete la mine. Acest lucru este perfect, pentru că dacă am acum îmbinare sau rebase chestii de la mybranch în maestru, noile comitete mele sunt adăugate liniar imediat după cele mai recente comitete.

Problema la care te referi se întâmplă dacă rebacă în direcția "greșită". Dacă am primit cel mai recent maestru (cu noi modificări) și de la maestru am rebase astfel (înainte de a sincroniza sucursala mea):

git rebase mybranch

Ceea ce am făcut a fost că am introdus noile mele schimbări undeva în trecutul maestrului. Principala linie de angajamente sa schimbat. Și din cauza felului în care funcționează git cu ID-uri de comitere, toate comitetele (de la master) care au fost replayate peste noile mele modificări au ID-uri noi.

Ei bine, e greu de explicat doar in cuvinte ... Sper ca acest lucru are un sens :-)

Oricum, propriul meu flux de lucru este acesta:

  • "Git trage" noile modificări de la distanță
  • comutați la lista mea
  • 'git master rebase' pentru a aduce noile modificări ale masterului în istoricul comitetului meu
  • comutați înapoi la comandă
  • 'git merge mybranch', care se transmite rapid numai atunci când tot ceea ce se află în master este, de asemenea, în mibranch (evitând astfel problema de reordonare a comitetului într-o sucursală publică)
  • 'git push'

Un ultim cuvânt. Vă recomandăm cu insistență utilizarea rebasei atunci când diferențele sunt triviale (de ex., Persoane care lucrează pe fișiere diferite sau cel puțin linii diferite). Ea a avut gotcha Am încercat să explic doar acolo, dar face pentru o istorie mult mai curat.

De îndată ce pot apărea conflicte semnificative (de exemplu, un colaborator a redenumit ceva într-o grămadă de fișiere), recomand cu fermitate o îmbinare. În acest caz, vi se va solicita rezolvarea conflictului și apoi declanșarea rezoluției. În plus, o îmbinare este mult mai ușor de rezolvat atunci când există conflicte. Partea inferioară este că istoria ta poate deveni greu de urmărit dacă o mulțime de oameni merg tot timpul :-)

Mult noroc!

0
adăugat
Mi se pare că ar fi trebuit să spuneți: "git merge mybranch", ceea ce se face numai rapid atunci când tot ceea ce se află în maestru se află, de asemenea, la nivelul meu (evitând astfel problema reorganizării comitetului într-o sucursală publică)
adăugat autor Bruno Bronosky, sursa
'git rebase mybranch' ar trebui să citească cu siguranță 'git merge mybranch'.
adăugat autor James H, sursa

Consultați Gitcast-urile excelente pe Divizarea și fuziunea ca și precum și rebasing .

0
adăugat