Git Squash forklaret

Hvad er Git Squash?

En af de ting, som udviklere hører ofte om deres pullanmodninger, er noget som "Det ser godt ud for mig, vær venlig at squash og flette". Den sjove del er, at der ikke er sådan en kommando som git squash(medmindre du opretter et alias til den).

At squashtrække anmodning betyder ofte at komprimere alle forpligtelserne i denne anmodning til et (sjældent til et andet nummer) for at gøre det mere kortfattet, læsbart og ikke forurener hovedgrenens historie. For at opnå dette skal en udvikler bruge den interaktive tilstand af Git Rebase-kommandoen.

Ofte når du udvikler en ny funktion, ender du med flere intermitterende forpligtelser i din historie - du udvikler dig trinvist. Det kan kun være nogle typografier eller trin til den endelige løsning. For det meste nytter det ikke at have alle disse forpligtelser i den endelige offentlige version af din kode, så det er mere fordelagtigt at have dem alle komprimeret til en, enkelt og endelig version.

Så lad os antage, at du har følgende forpligtelseslog i den gren, du gerne vil flette som en del af pull-anmodning:

$ 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

Vi foretrækker åbenbart kun at have en forpligtelse her, da der ikke er nogen fordel ved at vide, hvad vi startede med at skrive, og hvilke skrivefejl vi fikset der senere. Kun det endelige resultat er vigtigt.

Så hvad vi gør er at starte en interaktiv rebasesession fra den aktuelle HEAD (commit 30374054 ) for at begå 3233cb21 med den hensigt at kombinere de tre seneste forpligtelser til en:

$ git rebase -i HEAD~3

Det åbner en editor med noget som følger:

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

Som altid giver Git os en meget god hjælpebesked, hvor du kan se den squashmulighed, vi leder efter.

I øjeblikket siger instruktionerne til interaktiv rebase til pickhver specificeret forpligtelse og bevarer den tilsvarende meddelelse. Det er - ikke ændre noget. Men vi vil kun have en forpligtelse i sidste ende.

Så du kan simpelthen redigere teksten i din editor og erstatte pickmed squash(eller bare s) næste yo hver forpligtelse, vi vil slippe af med, og gemme / afslutte editoren. Det kan se sådan ud:

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

Når du lukker din redaktør efter at have gemt denne ændring, genåbnes den med det samme og vil foreslå, at du vælger og omformulerer disse forpligtelsesmeddelelser. Noget som dette:

# 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.

På dette tidspunkt kan du slette alle de meddelelser, du ikke ønsker at blive inkluderet i den endelige forpligtelsesversion. Du kan også omformulere dem eller bare skrive begå besked fra bunden.

Husk bare, at den nye version inkluderer alle de linjer, der ikke starter med #tegnet. Igen skal du gemme og afslutte din editor.

Din terminal skal nu vise en succesbesked inklusive, Successfully rebased and updated og git-loggen skal vise en dejlig og komprimeret historie med kun en forpligtelse. Alle mellemliggende forpligtelser er væk, og vi er klar til at fusionere!

Advarsel om uoverensstemmelse mellem lokal og fjern begivenhedshistorie

Denne handling er lidt farlig, hvis du allerede har din filial offentliggjort i et eksternt lager - du ændrer alligevel forpligtelseshistorik. Så det er bedst at udføre squashoperationen på en lokal filial, inden du skubber .

Nogle gange er det allerede skubbet - hvordan ville du trods alt oprette en pullanmodning? I dette tilfælde bliver du nødt til at tvinge ændringerne til den eksterne gren efter at have udført squashingen, da din lokale historie og grenhistorie i det eksterne lager er forskellige:

$ git push origin +my-branch-name

Gør dit bedste for at sikre, at du er den eneste, der bruger denne fjerntliggende gren på dette tidspunkt, ellers vil du gøre den anden udviklers liv sværere, når de har en historisk uoverensstemmelse. Men da squashing normalt udføres som den sidste operation på en gren, før den slipper af med det, er det normalt ikke så stort en bekymring.