„vă Rugăm să rebazare pe partea de sus de master și vom merge de cerere de tragere”.
„vă rog să vă strângeți angajamentele împreună pentru a obține o githistory curată și reversibilă?”.
” puteți rescrie mesajul comiterii dvs. pentru a descrie mai bine problema pe care o rezolvă și cum o rezolvă?”.
întrebări ca acestea sunt frecvent solicitate în cererile de tragere. Să vedem de ce eiexistă, cum să le îndepliniți și posibilele lor probleme.,
reformulați ultimul mesaj de comitere
una dintre cele mai simple rescrieri de istorie pe care le putem face cu git este schimbarea mesajului lastcommit. Să spunem că imediat după ce a făcut o comite veți găsi o greșeală de scriere în itsdescription, sau veți găsi o cale mai bună de a descrie changeset. Pentru a face thecorrection tu a alerga:
git commit --amend
Se va deschide o editorwith ultimul comite mesaj, astfel încât să puteți modifica. După salvare, o nouă comitereva fi creat cu aceleași modificări și noul mesaj, înlocuind comiterea cu mesajul anterior.,acest lucru poate fi util pentru a include fișierele pe care ați uitat să le urmăriți sau pentru a includemodificări ale fișierelor pe care tocmai le-ați angajat. Pentru a face acest lucru, puteți adăuga changesand apoi efectuați modifica:
git add README.md config/routes.rb git rm notes.txt git commit --amend
în Afară de editarea comite mesaj, noul comite va conține changesspecified cu git add
și git rm
. De asemenea, puteți edita autorul. Pentru exemplu:
git commit --amend --author="Tute Costa and Dan Croak <[email protected]>"
realizare deblocat!, Acum Puteți schimba ultima comitere a depozitului dvs. pentru a include modificări mai noi ale fișierelor și / sau pentru a îmbunătăți mesajul commit. Dar nu începeți să modificați toate lucrurile înainte de a înțelegeaultima secțiune a acestei postări pe blog intitulată „pericol”.
Reformuleze alte comite mesaje
– Ar plăcea să vorbesc despre asta acum, dar trebuie să înțelegem mai generaltool înainte. Rămâneți aproape! Orice altceva va fi mai ușor după ce am citit despre…
Interactive Rebazare
git rebase
re-se aplică comite, unul byone, în ordine, de la curent ramură pe alta., Acceptă mai multe opțiuni și parametri, deci este un vârf al explicației aisbergului, suficient pentru a face legătura între StackOverflow sau comentariile GitHub și paginile git man.
O opțiune interesantă-l acceptă e --interactive
(-i
pentru scurt), care willopen un editor cu o listă a comite care sunt pe cale de a fi schimbat. Thislist acceptă comenzi, permițând utilizatorului să editeze lista înainte de a iniția acțiunea de bază.
Să vedem un exemplu.,
reformulați alte mesaje de comitere, luați 2
să spunem că vreau să reformulez oricare dintre ultimele 4 comiteri ale acestui blog. Apoi rulezgit rebase -i HEAD~4
, și iată ce văd:
pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls pick 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend # Rebase 8db7e8b..fa20af3 onto 8db7e8b # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
vedem ultimele patru comiteri, de la mai vechi la mai noi. A se vedea comentariul de mai joslista de comiteri? Bună treabă explicând, git! pick
(p
pe scurt) este defaultaction. În acest caz, se va aplica din nou comite ca este, nici o schimbare în itscontents sau mesaj. Salvarea (și executarea) acestui fișier nu ar face nicio modificare în depozit.,
Dacă spun reword
(r
pe scurt), într-un comite vreau să editați:
pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls r 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend
Când am salva si a iesi din editor, git va urma comenzile descrise, landingmyself în editorul din nou, ca și cum aș fi modificată comite 3e7ee36
. Editez astamesaj de angajare, salvați și părăsiți editorul, iar aici este ieșirea:
acum Caleb spune în mesajul său de comitere „Opriți toate evidențierea”, indiferent dacă sunteți copil sau nu.
realizare deblocat! Acum Puteți schimba mesajul oricăreicommit pe care doriți., Puteți face acest lucru, asigurați-vă că înțelegeți secțiunea „pericol”.
Squash se angajează împreună
alte Două comenzi rebazare interactive ne oferă sunt:
-
squash
(s
pentru scurt), care contopeste angajeze în cel anterior (theone în linie înainte) -
fixup
(f
pentru scurt), care acționează ca „suc de fructe”, dar se debarasează de această comis’smessage
Vom continua să lucreze pe rebazare exemplu am workedbefore., Am avut patru comite, propria mea pentru acest post pe blog, andthree altele de Caleb, care au fost legate de postul anterior de pe PGP:
pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls pick 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend
Să zicem că vreau să contopească lui Caleb se angajează împreună, pentru că ele aparțin aceeași logică changeset, și astfel încât să putem git revert
cu ușurință dacă vom găsi weprefer nu au aceste schimbări în acest depozit. Vom dori să păstreze mesajul comite primul, și suc de fructe cele două comite ulterioare în precedentul., Am schimba pick
și squash
acolo unde este cazul:
pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls s 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend
Salva, și am aterizat în editor pentru a decide comite mesaj de meldedthree comite (a se vedea modul în care acestea sunt concatenate unul după altul):
# This is a combination of 3 commits. # The first commit's message is: Introduce OpenPGP and teach basic usage Besides demystifying a relatively complex tool, protocol, and etiquette, this post is intended to help with problems such as the one outlined in this tweet: > Emailed sensitive info to someone with PGP. They replied, with my > original email, all in clear text. They didn't realize it. # This is the 2nd commit message: Fix PostChecker::Post#urls # This is the 3rd commit message: Hey kids, stop all the highlighting # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Author: Caleb Hearth # Date: Tue Sep 2 09:39:07 2014 -0500 # # rebase in progress; onto 71d4789 # You are currently editing a commit while rebasing branch 'tc-git-rebase' on '71d4789'.
am decide pentru a elimina cea de-a treia comite mesaj, și se adaugă o mai relevante notă pentru a doua comite mesaj. Salvați editorul și cele patru comiteri au fost transformateîn două: cel de la Caleb și al meu după. Bun!,
Ne-ar fi folosit fixup
comandă, dacă ne-am văzut mai devreme că vrem thechanges, dar nu comite mesaj, al treilea comis-o. În acest caz, thecommands ar fi privit ca:
pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls f 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend
atunci Când a salvat, editorul ar fi inclus cel de-al treilea comite mesaj alreadycommented pentru noi:
Salvare și ieșiri:
Rezultatul este același: 2 se angajează în loc de 4, fiecare cu un singur, diferite blogpost.
realizare deblocat! Acum Puteți îmbina comiterile împreună. Întotdeauna, fiți atenți la secțiunea de pericol.,
Rebase pe partea de sus a master
am furculiță o bibliotecă open source, începe să lucreze la o ramură caracteristică, și master in upstream proiectul se mișcă înainte. Istoria noastră arată cam așa:
A---B---C feature / D---E---F---G upstream/master
biblioteca responsabilul cere ca să „rebazare pe partea de sus de master”, asa ca am rezolva orice mergeconflicts care pot apărea între cele două ramuri, și să ne păstrăm changeset împreună.Responsabilul ar dori să vadă o istorie, cum ar fi:
A'--B'--C' feature / D---E---F---G upstream/master
vrem să reaplicați noastră se angajează, unul câte unul, în ordine, pe amonte de master.,Sună ca descrierea comenzii rebase! Să vedem ce comenzi wouldland noi în scenariul dorit:
# Point our `upstream` remote to the original fork git remote add upstream https://github.com/thoughtbot/factory_girl.git # Fetch latest commits from `upstream` (the original fork) git fetch upstream # Checkout our feature branch git checkout feature # Reapply it onto upstream's master git rebase upstream/master # Fix conflicts, then `git rebase --continue`, repeat until done # Push to our fork git push --force origin feature
Achievement Unlocked! Sucursala dvs. caracteristică va fi aplicată peîn partea de sus a ultimului maestru al furcii originale.
Și așa ajungem la…
PERICOL: sunteți rescrierea istoriei
Vezi --force
în ultimii git push
comanda? Asta înseamnă că suprascriem istoria repoziționării., Acest lucru este întotdeauna sigur de a face în comite noi nu împărtășim fie membri ai echipei, sau în ramuri care ne aparțin (a se vedea initialele mele în theexample de acest blog).
Dar dacă forța de împingere ediții care au fost deja partajate cu echipa (commitsthat există în afara mea depozit, cum ar fi modificările le-am făcut la PGP commitsthat au fost deja partajate), atunci toată lumea filiala primeste de sincronizare.
rescrierea istoriei înseamnă abandonarea angajamentelor existente și crearea de noi, carepot fi foarte asemănătoare, dar sunt diferite., Dacă alții de muncă de bază, pe previouscommits, și apoi rescrie și forță împinge comite, echipa ta memberswill trebuie să re-fuzioneze lor de muncă (în cazul în care observați pierderea potențială).
La thoughtbot noi prefix sucursalele noastre cu initialele noastre, de semnalizare, care thosecommits pot obține rescris și alții nu ar trebui să adauge se angajează să ramura. Când cei care angajează teren în maestru sau o ramură comună nu le rescrie din nou.
deci rescrieți istoria git, cu condiția ca comiterile rescrise să existe doar în repoziționarea dvs. sau dvs. și echipa dvs. să știți că nimeni altcineva nu ar trebui să se bazeze pe ele.,
realizare deblocat! Acum știi cum să te retragi în timp ce ești un bun cetățean.