git rebazare
Rebasing este procesul de mișcare sau combinând o secvență de se angajează la o nouă bază a comis-o. Rebasing este cel mai util și ușor de vizualizat în contextul unui flux de lucru caracteristică ramificare. Procesul general pot fi vizualizate fi următoarele:
Din punct de vedere al conținutului, rebasing este schimbarea bazei de filiala de la o comite la alta făcându-l să apară ca în cazul în care ai creat-o filiala dintr-o altă comis-o., Pe plan intern, Git realizează acest lucru prin crearea de noi angajamente și aplicarea acestora la baza specificată. Este foarte important să înțelegem că, deși ramura arată la fel, este compusă din angajamente complet noi.
utilizare
motivul principal pentru rebasing este de a menține un istoric de proiect liniar. De exemplu, luați în considerare o situație în care ramura principală a progresat de când ați început să lucrați la o ramură caracteristică., Doriți să obțineți cele mai recente actualizări ale sucursalei principale din sucursala dvs. de caracteristici, dar doriți să păstrați istoricul sucursalei curate, astfel încât să pară că ați lucrat la cea mai recentă sucursală principală. Acest lucru oferă beneficiul ulterior al unei fuziuni curate a ramurii dvs. de caracteristici înapoi în ramura principală. De ce vrem să menținem o „istorie curată”? Beneficiile de a avea un istoric curat devin tangibile atunci când efectuați operații Git pentru a investiga introducerea unei regresii. Un scenariu mai real ar fi:
- un bug este identificat în ramura principală., O caracteristică care funcționa cu succes este acum ruptă.
- un dezvoltator examinează istoria sucursalei master folosind
git log
din cauza „istoric curat” dezvoltatorul este rapid capabil să motiv despre istoria proiectului. - dezvoltatorul nu poate identifica când a fost introdusă eroarea folosind
git log
deci dezvoltatorul execută ungit bisect
. - deoarece istoricul git este curat,
git bisect
are un set rafinat de angajamente de comparat atunci când caută regresia., Dezvoltatorul găsește rapid comiterea care a introdus eroarea și este capabil să acționeze în consecință.
Aflați mai multe despre git log și GIT bisect pe paginile lor individuale de utilizare.
aveți două opțiuni pentru integrarea funcției dvs. în ramura principală: fuzionarea directă sau rebasarea și apoi fuzionarea. Prima opțiune are ca rezultat o îmbinare în 3 direcții și o îmbinare, în timp ce cea din urmă are ca rezultat o îmbinare rapidă și o istorie perfect liniară. Următoarea diagramă demonstrează modul în care rebasing – ul pe ramura principală facilitează o îmbinare rapidă înainte.,
Rebasing este o modalitate comună de a integra modificările în amonte în depozitul local. Tragerea modificărilor în amonte cu Git merge duce la o comitere de îmbinare inutilă de fiecare dată când doriți să vedeți cum a progresat proiectul. Pe de altă parte, rebasing-ul este ca și cum ai spune: „Vreau să-mi bazez schimbările pe ceea ce toată lumea a făcut deja.”
nu rebazare publice istorie
așa Cum am discutat anterior, în rescrierea istoriei, niciodată nu ar trebui să rebazare se angajează odată ce au fost împins într-un registru public., Rebase-ul ar înlocui vechile angajamente cu altele noi și ar părea că acea parte din istoria proiectului dvs. a dispărut brusc.
Git Rebazare Standard vs Git Rebazare Interactive
Git rebazare interactive este atunci când git rebazare acceptă un -- i
argument. Aceasta înseamnă ” interactiv.”Fără argumente, comanda rulează în modul standard. În ambele cazuri, să presupunem că am creat o ramură caracteristică separată.,
# Create a feature branch based off of master git checkout -b feature_branch master # Edit files git commit -a -m "Adds new feature"
Git rebazare în modul standard va lua în mod automat angajează în lucru curent ramură și să le aplice la cap a trecut de ramură.
git rebase
Acest lucru în mod automat rebases ramura curentă pe , care poate fi orice fel de comite de referință (de exemplu, o IDENTITATE, un nume de ramură, o etichetă sau o referință relativă la
HEAD
).
Execută git rebase
cu -i
steagul începe un interactiv rebasing sesiune., În loc să mutați orbește toate comiterile la noua bază, rebasingul interactiv vă oferă posibilitatea de a modifica comiterile individuale în acest proces. Acest lucru vă permite să curățați istoricul prin eliminarea, divizarea și modificarea unei serii existente de comiteri. Este ca Git commit --amend
pe steroizi.
git rebase --interactive
Acest rebases ramura curentă pe dar foloseste un interactiv rebasing sesiune. Aceasta deschide un editor în care puteți introduce comenzi (descrise mai jos) pentru fiecare comitere care urmează să fie rebasată., Aceste comenzi determină modul în care comiterile individuale vor fi transferate în noua bază. De asemenea, puteți reordona înregistrarea comiterii pentru a schimba ordinea angajărilor în sine. După ce ați specificat comenzi pentru fiecare comitere din rebase, Git va începe redarea comiterilor aplicând comenzile rebase. La rebasing edita comenzi sunt după cum urmează:
Suplimentare rebazare comenzi
după Cum este detaliat în rescrierea istoriei pagina, rebasing poate fi folosit pentru a schimba mai în vârstă și mai multe se angajează, angajate fișiere, și mai multe mesaje., În timp ce acestea sunt cele mai comune aplicații, git rebase
are, de asemenea, opțiuni de comandă suplimentare care pot fi utile în aplicații mai complexe.
-
git rebase -- d
înseamnă că în timpul redării comiterea va fi eliminată din blocul final de comitere combinat. -
git rebase -- p
lasă comiterea așa cum este. Nu va modifica mesajul sau conținutul comiterii și va fi în continuare o comitere individuală în istoricul sucursalelor. -
git rebase -- x
în timpul redării execută un script shell linie de comandă pe fiecare comite marcate., Un exemplu util ar fi să rulați suita de teste codebase pe anumite comiteri, ceea ce poate ajuta la identificarea regresiilor în timpul unei rebase.
recapitulare
rebasing interactiv vă oferă un control complet asupra ceea ce arată istoricul proiectului. Acest lucru oferă o mulțime de libertate dezvoltatorilor, deoarece le permite să comită o istorie „dezordonată” în timp ce se concentrează pe scrierea codului, apoi se întorc și o curăță după fapt.majoritatea dezvoltatorilor preferă să folosească o rebase interactivă pentru a lustrui o ramură de caracteristici înainte de a o contopi în baza principală de cod., Acest lucru le oferă posibilitatea de a zdrobi comiterile nesemnificative, de a șterge cele învechite și de a se asigura că totul este în ordine înainte de a se angaja în istoricul proiectului „Oficial”. Pentru toți ceilalți, va părea că întreaga caracteristică a fost dezvoltată într-o singură serie de angajamente bine planificate.puterea reală a rebasingului interactiv poate fi văzută în istoria ramurii master Rezultate. Pentru toți ceilalți, se pare că sunteți un dezvoltator strălucit care a implementat noua caracteristică cu suma perfectă de comiteri pentru prima dată., Acesta este modul în care rebasingul interactiv poate păstra istoricul unui proiect curat și semnificativ.
Opțiuni de configurare
există câteva proprietăți rebase care pot fi setate folosind git config
. Aceste opțiuni vor modifica aspectul de ieșire git rebase
.
-
rebase.stat
: un boolean care este setat la false în mod implicit. Opțiunea comută afișarea conținutului diffstat vizual care arată ce sa schimbat de la ultima degradare.
-
rebase.autoSquash:
O valoare booleană care comută--autosquash
comportament.,
-
rebase.missingCommitsCheck:
poate fi setat la mai multe valori care schimbă comportamentul rebase în jurul angajărilor lipsă.,/tr>
error
Stops the rebase and prints removed commit warning messages ignore
Set by default this ignores any missing commit warnings -
rebase.instructionFormat:
Agit log
format string that will be used for formatting interactive rebase display
Advanced rebase application
The command line argument
--onto
can be passed togit rebase
., Când în git rebazare--onto
modul de comanda se extinde la:git rebase --onto
--onto
comandă permite o mai puternică formă sau rebazare care permite trecerea specifice ref a fi sfaturi de o schimbare de bază.
Să presupunem că avem un exemplu repo cu ramuri ca:o---o---o---o---o master \ o---o---o---o---o featureA \ o---o---o featureB
featureB se bazează pe featureA, cu toate acestea, ne dăm seama featureB nu este dependentă nici de modificările în featureA și-ar fi desprins de master.
git rebase --onto master featureA featureB
featureA este
.,
master
devineși featureB este de referință pentru ceea ce
HEAD
deva indica. Rezultatele sunt apoi:
o---o---o featureB / o---o---o---o---o master \ o---o---o---o---o featureA
Înțelegerea pericolelor de rebazare
O opoziție să ia în considerare atunci când se lucrează cu Git Rebazare este fuziona conflictele pot deveni mai frecvente în timpul o schimbare de bază de flux de lucru. Acest lucru se întâmplă dacă aveți o ramură de lungă durată care s-a îndepărtat de maestru., În cele din urmă, veți dori să faceți rebase împotriva master și, în acel moment, poate conține multe angajamente noi cu care modificările ramurii dvs. pot intra în conflict. Acest lucru este ușor de remediat prin rebasing sucursala frecvent împotriva master, și de a face comiteri mai frecvente.
--continue
și--abort
argumente în linia de comandă poate fi transmis de lagit rebase
pentru a avansa sau de a reseta la rebazare atunci când se ocupă cu conflictele.un avertisment rebase mai grave este pierdut comite de rescrierea istoriei interactive., Rularea rebase în modul interactiv și executarea subcomandelor, cum ar fi squash sau drop, va elimina comiterile din jurnalul imediat al Sucursalei. La prima vedere, acest lucru poate apărea ca și cum comiterile au dispărut definitiv. Folosind
git reflog
aceste comiteri pot fi restaurate și întreaga rebase poate fi anulată. Pentru mai multe informații despre utilizareagit reflog
pentru a găsi pierdut comite, vizita noastră Git reflog pagina de documentare.git Rebase în sine nu este serios periculos., Cazurile reale de pericol apar atunci când executați rescrierea istoricului rebases interactive și forțați împingerea rezultatelor către o ramură la distanță care este împărtășită de alți utilizatori. Acesta este un model care ar trebui evitat, deoarece are capacitatea de a suprascrie munca altor utilizatori la distanță atunci când trag.
Recuperarea din amonte rebazare
Dacă un alt utilizator a indexat și forța împins la filiala de care ai comite, un
git pull
apoi va suprascrie orice se angajează ai bazat pe faptul că anterior ramură cu vârful care a fost forța împins., Din fericire, folosindgit reflog
puteți obține reflogul sucursalei de la distanță. Pe reflogul sucursalei de la distanță puteți găsi un ref înainte de a fi rebased. Apoi, puteți rebazare filiala împotriva ref la distanță folosind--onto
opțiune așa cum sa discutat mai sus, în Avansate Rebazare secțiunea Aplicare.rezumat
în acest articol am acoperit
git rebase
utilizare. Am discutat cazuri de utilizare de bază și avansate și exemple mai avansate., Unele dintre principalele puncte de discuție sunt:- git rebazare standard vs moduri interactive
- git rebazare opțiuni de configurare
- git rebazare-pe
- git rebazare a pierdut comite
-