am vorbit înainte despre modul în care istoria unui codebase este la fel de important ca codebase în sine. Rebase este instrumentul care poate face cel mai mare impact unic pentru realizarea acestui lucru. Cunoașterea prealabilă a conceptelor fundamentale ale controlului sursei este crucială pentru înțelegerea acestui post.,
Amintiți-vă, chiar dacă puteți utiliza Rebazare pentru următoarele (și poate chiar mai mult) cazuri, aceasta rămâne cea mai bună practică de a comite devreme și de multe ori:
- Edit-rework o comite în istorie
- Adăugați o comite în istoria de o schimbare set (sau ramură)
- a Elimina o comite din istoria de o schimbare set (sau ramură)
- Split o comite în mai multe comite
- Combina o serie de comite în una comite
- Re-comanda se angajează
Ce Rebazare spun?,
git-rebazare – Reaplica se angajează pe partea de sus de o altă bază sfat
git-rebazare
Dacă înlocuiți cuvântul de bază ” cu „strămoșul’ înseamnă același lucru, deci, cu alte cuvinte:
Da un nou strămoș de a o comite sau secvență de comite.
‘base’ este folosit în documentație pentru a permite bazei să însemne o ramură, o comitere, o etichetă sau orice altceva care poate fi referit în cadrul git.,
așa cum s – a discutat anterior, o comitere conține – printre altele-id-ul comiterii părintești. Ca atare, Rebase actualizează efectiv angajamentul părinte pentru setul de angajamente pe care le furnizați.
de asemenea, este important să rețineți că fiecare comitere în Git este imuabilă, chiar și pentru a Rebase. Ca atare, Rebase va re-crea Fiecare comite, înlănțuindu-le pe toate împreună, dar cu noul strămoș.Rebase este un pic CA Grays sport Almanah: se poate schimba totul!
din tenor.com
Regulile!,
când utilizați Rebase, există anumite reguli pe care trebuie să le respectați – altfel poate apărea o lume a durerii.
- Nu Rebase niciodată o ramură publică – una pe care alte persoane o folosesc
amintiți – vă că Rebase trebuie să urmeze regulile unui commit-că este imuabil. Ca atare, un nou angajament va fi creat pentru fiecare pas al procesului. Acest lucru înseamnă că ar „trage covorul de sub picioare” de oricine folosind „vechi” comite.,
Git va vedea că comiterea există de două ori – prima versiune și versiunea Rebased – și poate deveni confuză atunci când încercați să îmbinați modificările împreună. Mai mult, Istoricul va arăta comiterea de două ori, deși cu ID-uri diferite. Un pic ca având două Marty în aceeași cronologie-confuz!
bibliografie:
- Rebasing reguli
dacă se întâmplă ceva
cu Spatele la Viitor, există întotdeauna o cale de ieșire din orice problemă care ar putea suprafață., Pe măsură ce Rebase creează noi comiteri, ramura poate fi resetată înapoi la comiterea veche și te-ai întors unde ai fost înainte. Aș sugera să vă împingeți întotdeauna sucursala la distanță înainte de a utiliza Rebase, mai ales dacă sunteți mai puțin familiarizați cu aceasta. Se adaugă doar un alt nivel de siguranță în cazul în care aveți nevoie de ea.
înainte de a utiliza Rebase, notează unde te afli – care este ID-ul de comitere sau numele ramurii dacă nu s-a schimbat de la distanță.,
Dacă Rebazare eșuează parte de drum prin și doriți să anulați/anulare și du-te înapoi de unde ai fost înainte, puteți executa: git rebase --abort
în Cazul în care sucursala a fost împinsă înainte de-o parte și doriți să resetați la ce ramura se pare ca de la distanță: git reset --hard origin/<branch name>
Dacă aveți doar anterioare comis-id: git reset --hard <commit SHA>
Fiecare dintre comenzile descrise mai sus, se va reseta ramură de curent înapoi de unde ai fost înainte de a începe Rebazare activitate.,
Ane lectură:
- git-rebazare
Interactive Rebazare
Rebazare poate fi folosit în două moduri diferite, interactiv și non-interactive. Ambele fac același lucru, dar ediția interactivă permite manipularea procesului.
așa că am descris Rebase ca un instrument care poate oferi un nou strămoș pentru un set de comiteri. Rebase va crea un „script” (un fel de listă todo) din care comitetele vor fi afectate. Versiunea non-interactivă a Rebase produce acest script, apoi îl execută imediat.,versiunea interactivă permite ca acest script să fie editat înainte de a fi executat.
scriptul este pur și simplu un set ordonat de comenzi pentru a executa. Este un fișier text care conține fiecare ID de comitere și ce trebuie făcut cu acesta. Mesajul pentru fiecare comitere este inclus pentru claritate.
Un exemplu interactive Rebazare scenariul arată cam așa:
pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post
În cele de mai sus, pick
înseamnă adauga dat comite ca un copil pe care anterior a comis-o. Deci, istoria, de la baza dată, va arăta exact așa cum este prevăzut mai sus., Scriptul funcționează de sus în jos, astfel încât comiterea din partea de jos va fi ultima comitere adăugată la ramură.
puteți alege diferite comenzi în loc de pick
, acestea sunt:
Într-o mulțime de cazuri, poate provoca merge conflicte ca Rebazare progresează prin intermediul script-ul. Acest lucru este normal și nu trebuie să vă faceți griji. Va trebui doar pentru a rezolva conflictele înainte de a putea continua. Dacă acesta este cazul, utilizați git mergetool
pentru a rezolva conflictele. Odată ce toate acestea sunt rezolvate, utilizați git rebase --continue
pentru a contina procesul., Desigur, dacă doriți să anulați procesul de Rebase, utilizați git rebase --abort
.este demn de remarcat faptul că Rebase este suficient de inteligent pentru a crea noi comiteri numai în cazul în care știe ceva sa schimbat. Dacă părintele unei comiteri este același ca înainte, va păstra comiterea așa cum este și va continua până când va avea ceva de făcut. Mai jos sunt câteva exemple pentru a demonstra utilizările Rebase la diferite scopuri. Toți presupun că „baza” sa schimbat și, ca atare, Rebase are de lucru la fiecare pas al procesului.,
Editați / refaceți o comitere în istoric
luați în considerare scenariul în care trebuie să remediați o greșeală de scriere într-un fișier. Doriți să editați comiterea, astfel încât comiterea să fie curată și adecvată – nu doriți să aveți o altă comitere care să remedieze mai târziu dactilografia.,=”5779374de0″>
449486aa
3d4e82be
, setarea mamă la nou id pentru 449486aa
La pasul 4 puteți face schimbările de care aveți nevoie și modifice comite, de exemplu:
- Modificați fișierul
- Stadiul dosarului (
git add <file>
) - Comite fișier, de modificare a comite (
git commit --amend
)
atunci Când ați terminat modifică ai nevoie executa git rebase --continue
pentru a continua cu pasul 5 și a finaliza procesul.,
Fix o greșeală de scriere într-un comite mesaj
reword
comanda este la fel ca edit
comanda – cu excepția faptului că doar instrucțiunile mesajului pentru a fi modificat, mai degrabă decât se angajeze conținut, de exemplu:
pick 509de5ac New post - Building performant large scale web applications (#1344)reword 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post
Nu uita, schimbarea mesaj în script-ul NU se schimba conținutul comite mesaj. Salvați și închideți scriptul și așteptați ca Rebase să redeschidă editorul de mesaje pentru comiterea / comiterile alese.,
adăugați o comitere în istoricul unui set de modificări (sau ramură)
luați în considerare scenariul în care trebuie să faceți o modificare additonală la baza de cod după o comitere. Ați uitat să o facă, și doresc să se asigure că este în locul potrivit în istorie – imediat după comiterea corespunzătoare., 509de5ac
3d4e82be
, stabilirea său părinte la id nou pentru noi comis-ai creatîn Loc de editare 449486aa
de data asta, puteți adăuga un nou comite în schimb, de exemplu:
- Face schimbarea/s
- Etapa fișierul/s (
git add <file>
) - Comite schimba/s (
git commit
)
atunci Când ați terminat modifică ai nevoie executa git rebase --continue
pentru a continua cu pasul 5 și a finaliza procesul., La sfârșitul procesului veți avea 4 comite în istorie, mai degrabă decât 3.
eliminați o comitere din istoricul unui set de modificări (sau ramură)
luați în considerare scenariul în care ați comis o modificare pe care nu doriți să o păstrați și doriți să o eliminați din istoric. Poate că ați comis o schimbare temporară pe care doriți să o eliminați din sucursală înainte de a fuziona.,
puteți edita script-ul astfel încât acesta arată ceva de genul următor:
pick 509de5ac New post - Building performant large scale web applications (#1344)pick 3d4e82be Add fundamentals blog post
Rețineți că linia 2 (449486aa
) a fost eliminat, astfel încât acesta nu va fi inclus în acest proces.,
atunci Când salvați apoi închideți fișierul, Rebazare va:
- Resetare la ramura de bază
- Adăugați comite
509de5ac
, stabilirea său părinte la baza de date - Adăugați comite
3d4e82be
, setarea mamă la nou id pentru509de5ac
La sfârșitul procesului, vei avea 2 se angajează în istorie mai degrabă decât 3.
împărțiți o comitere în mai multe comiteri
luați în considerare scenariul în care ați comis accidental două modificări în aceeași comitere., Doriți să le împărțiți astfel încât istoria să fie îngrijită; astfel încât, dacă este nevoie în viitor, o parte din comitere poate fi inversată fără a reveni la toate.,”>
atunci Când salvați apoi închideți fișierul, Rebazare va:
- Resetare la ramura de bază
- Adăugați comite
509de5ac
, stabilirea său părinte la baza de date - Adăugați comite
449486aa
, setarea mamă la nou id pentru509de5ac
- Așteptați pentru tine de a edita/modifica acest comite
- Adăugați comite
3d4e82be
, stabilirea său părinte la noul id pentru ultima comis-ați adăugat în pasul 4
în Loc de editare a comis-o, resetați-l, desfacerea pasul 2, dar păstrarea modificările pe disc.,
astfel încât să puteți executa git reset HEAD~1
. Aceasta va elimina comiterea și va plasa toate modificările din copia dvs. de lucru. De acolo, puteți adăuga selectiv fișierele individuale se angajează, de exemplu,
-
git add <file1>
apoigit commit -m <message 1>
-
git add <file2>
apoigit commit -m <message 2>
atunci Când ați terminat modifică ai nevoie, executa git rebase --continue
pentru a continua cu pasul 5 și a finaliza procesul. La sfârșitul procesului veți avea 5 (sau mai multe) comiteri în istorie, mai degrabă decât 3.,
combinați o serie de comiteri într-o singură comitere
luați în considerare scenariul, ați făcut câteva comiteri și trebuie să fie îmbinate împreună: nu au sens pe cont propriu sau din alt motiv.,p>puteți edita script-ul astfel încât acesta arată ceva de genul următor:
pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)squash 3d4e82be Add fundamentals blog post
atunci Când salvați apoi închideți fișierul, Rebazare va:
- Resetare la ramura de bază
- Adăugați comite
509de5ac
, setarea său părinte la baza de date - Adăugați comite o comite conține modificările de la
449486aa
și3d4e82be
, stabilirea său părinte la noul id pentru509de5ac
- Rebazare va întrerupe și prompt pentru un mesaj, care este preparat după o combinație de ambele comite mesaje, am.,e. „Sursa de control – atunci când blog (#1345) se Adaugă fundamentele blog”
- Dacă doriți să luați mesajul de la primul comis-ca-este de a folosi apoi
fixup
comandă în loc desquash
.
squash
sau fixup
comite cât mai multe ca tine place – nu este limitat la 2 comite la un moment dat. Când editorul de mesaje este salvat și închis (dacă utilizați squash
) Rebase va conține până la sfârșitul scriptului., La sfârșitul procesului veți avea 2 comiteri în istorie, mai degrabă decât 3. Ultima comitere va avea mesajul pe care l-ați introdus în editorul de mesaje în timpul pasului 3. Git va fi default înlănțui mesajele împreună, atunci când se utilizează squash
și de a folosi primul mesaj atunci când se utilizează fixup
.luați în considerare scenariul, ați făcut unele modificări, dar ele au mai mult sens dacă sunt într-o ordine diferită.,
puteți edita scriptul astfel încât să arate ceva de genul:
pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog postpick 509de5ac New post - Building performant large scale web applications (#1344)
rețineți că linia 1 a fost mutată la linia 3., Atunci când salvați apoi închideți fișierul, Rebazare va:
- Resetare la ramura de bază
- Adăugați comite
449486aa
, stabilirea său părinte la baza de date - Adăugați comite
3d4e82be
, setarea mamă la nou id pentru449486aa
- Adăugați comite
509de5ac
, stabilirea său părinte la noul id pentru3d4e82be
La sfârșitul procesului, veți avea același comite, doar într-o ordine diferită.,am menționat mai sus că Rebase este suficient de inteligent pentru a nu crea noi comiteri acolo unde nu este nevoie – atunci când baza/părintele este la fel ca înainte., Aceasta este ceea ce se întâmplă dacă nu modificați inițială script, prin urmare, se pare că acest lucru atunci când vă închideți editorul:
pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post
- Resetare la ramura de bază, care este la fel ca părinte al
509de5ac
- Adăugați comite
509de5ac
, părintele este la fel, Nici alte modificări sunt necesare astfel încât comite poate fi folosit ca-este - Adăugați comite
449486aa
, părintele este aceeași:509de5ac
., Alte modificări sunt necesare astfel încât comite poate fi folosit ca-este - Adăugați comite
3d4e82be
, părintele este același:449486aa
. Nu sunt necesare alte modificări, astfel încât comiterea să poată fi utilizată ca-is
la sfârșitul procesului nimic nu se va fi schimbat pe ramură – toate comiterile vor exista în continuare și în aceeași ordine. În adevăr Rebase este chiar mai inteligent decât acest lucru, dar eu folosesc această simplificare pentru a demonstra că Rebase va recrea doar comite atunci când este nevoie să.,
Lectură suplimentară
- git rebase
- reguli Rebasing
Lasă un răspuns