Ce este Git Squash?

Unul dintre lucrurile pe care dezvoltatorii le aud destul de des în legătură cu cererile lor de extragere este ceva de genul „Asta mi se pare bine, vă rog să vă spulberați și să vă îmbinați”. Partea distractivă este că nu există o astfel de comandă de genul git squash (cu excepția cazului în care creați un fișier alias la ea).

La squash pull request înseamnă în mod obișnuit să compacteze toate comitetele din această solicitare într-una (rar către alt număr) pentru a o face mai concisă, mai ușor de citit și pentru a nu polua istoria ramurii principale. Pentru a realiza acest lucru, un dezvoltator trebuie să utilizeze modul interactiv de Git Rebase comanda.

Destul de des, atunci când dezvolți o caracteristică nouă, ai sfârșit cu mai multe comisii intermitente din istoria ta – la urma urmei, te dezvolți incremental. Acestea ar putea fi doar câteva greșeli sau pași către soluția finală. De cele mai multe ori nu are rost să ai toate aceste confirmări în versiunea publică finală a codului tău, deci este mai benefic să le compaci pe toate într-o singură versiune unică și finală.

Deci, să presupunem că aveți următorul jurnal de comitere în ramura pe care doriți să o îmbinați ca parte a cererii de extragere:

$ git log --pretty=oneline --abbrev-commit
30374054 Add Jupyter Notebook stub to Data Science Tools
8490f5fc Minor formatting and Punctuation changes
3233cb21 Prototype for Notebook page

În mod clar, am prefera să avem un singur commit aici, deoarece nu are niciun avantaj să știm ce am început să scriem și ce tipuri am remediat acolo mai târziu. Este important doar rezultatul final.

Deci, ceea ce facem este să începem o sesiune de rebase interactivă din curent CAP (comite 30374054) a comite 3233cb21, cu intenția de a combina 3 cele mai recente se angajează într-una:

ad-banner
$ git rebase -i HEAD~3

Aceasta va deschide un editor cu ceva de genul:

pick 3233cb21 Prototype for Notebook page
pick 8490f5fc Minor formatting and Punctuation changes
pick 30374054 Add Jupyter Notebook to Data Science Tools
# Rebase
#
# 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

Ca întotdeauna, Git ne oferă un mesaj de ajutor foarte frumos unde puteți vedea squash opțiune pe care o căutăm.

În prezent, instrucțiunile pentru rebase interactiv spun că pick fiecare comitere specificată și păstrați mesajul de confirmare corespunzător. Adică – nu schimba nimic. Dar vrem să avem o singură comitere în cele din urmă.

Deci, puteți edita textul în locul editorului pick cu squash (sau doar s) în continuare, fiecare comitere de care vrem să scăpăm și să salvăm / ieșim din editor. Ar putea arăta astfel:

s 3233cb21 Prototype for Notebook page
s 8490f5fc Minor formatting and Punctuation changes
pick 30374054 Add Jupyter Notebook to Data Science Tools

Când închideți editorul după ce ați salvat această modificare, acesta va fi redeschis imediat și vă va sugera să alegeți și să reformulați acele mesaje de confirmare. Ceva de genul:

# This is a combination of 3 commits.
# The first commit's message is:
Prototype for Notebook page

# This is the 2nd commit message:

Minor formatting and Punctuation changes

# This is the 3rd commit message:

Add Jupyter Notebook to Data Science Tools

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.

În acest moment puteți șterge toate mesajele pe care nu doriți să le includă în versiunea finală de validare. De asemenea, le puteți reformula sau pur și simplu scrieți mesajul de comitere de la zero.

Nu uitați că noua versiune va include toate liniile care nu încep cu # caracter. Încă o dată, salvați și ieșiți din editor.

Terminalul dvs. acum ar trebui să afișeze un mesaj de succes, inclusiv Successfully rebased and updated <branch name> iar jurnalul git ar trebui să arate un istoric frumos și compact, cu o singură comitere. Toate angajamentele intermediare au dispărut și suntem gata să fuzionăm!

Avertisment despre nepotrivirea istoricului de comitere local și la distanță

Această operațiune este ușor periculoasă dacă filiala dvs. este deja publicată într-un depozit la distanță – în cele din urmă modificați istoricul de comitere. Deci, cel mai bine este să faceți operația de squash pe o sucursală locală înainte de a o face Apăsați.

Uneori, va fi deja împins – cum ați crea o cerere de extragere la urma urmei? În acest caz va trebui forta modificările de pe ramura la distanță după ce ați făcut zdrobire, deoarece istoricul local și istoricul ramurilor din depozitul de la distanță sunt diferite:

$ git push origin +my-branch-name

Faceți tot posibilul pentru a vă asigura că sunteți singurul care folosește această ramură la distanță în acest moment, sau veți îngreuna viața celuilalt dezvoltator atunci când au o nepotrivire istorică. Dar de atunci zdrobind se face de obicei ca operațiune finală pe o sucursală înainte de a scăpa de ea, de obicei nu este atât de mare de îngrijorare.