Git Squash selgitatud

Mis on Git Squash?

Üks asi, mida arendajad oma tõmbetaotluste kohta üsna sageli kuulevad, on umbes selline: "See tundub mulle hea, palun ühendage ja ühendage". Lõbus osa on see, et sellist käsku nagu pole git squash(kui te ei loo sellele varjunime).

Taotluse squashhankimine tähendab tavaliselt kõigi selles taotluses sisalduvate kohustuste tihendamist ühte (harva teise arvu), et muuta see kokkuvõtlikumaks, loetavamaks ja mitte saastata põhiharu ajalugu. Selle saavutamiseks peab arendaja kasutama käsu Git Rebase interaktiivset režiimi .

Üsna sageli, kui arendate mõnda uut funktsiooni, jõuate oma ajaloos mitme katkendliku kohustuseni - arenete ju ometi järk-järgult. See võib olla vaid mõni kirjaviga või samm lõpliku lahenduseni. Enamasti pole mõtet, et kõik need toimingud oleksid teie koodi lõplikus avalikus versioonis, seega on kasulikum need kõik ühte, ühte ja lõplikku versiooni kokku suruda.

Oletame, et teil on järgmises logis oksas, mille soovite ühendada tõmbenõude osana:

$ 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

Ilmselgelt eelistaksime, et siin oleks ainult üks kohustus, sest pole kasu sellest, kui teame, mida kirjutades alustasime ja millised kirjavead seal hiljem parandasime. Tähtis on ainult lõpptulemus.

Mida me teeme, on interaktiivse taasseanssi alustamine praeguselt HEAD- ilt (pühendama 30374054 ), et siduda 3233cb21 , kavatsusega ühendada 3 viimast kohustust üheks:

$ git rebase -i HEAD~3

See avab redaktori, millel on umbes järgmine:

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

Nagu alati, annab Git meile väga toreda abisõnumi, kus näete squashmeie otsitavat võimalust.

Praegu ütlevad interaktiivse taaskäivitamise juhised pickigale määratud pühendusele ja säilitavad vastava pühendamisteate. See tähendab - ära muuda midagi. Kuid me tahame, et lõpuks pühenduks ainult üks.

Nii saate redigeerida redaktoris olevat teksti, asendades pickjärgmise squash(või lihtsalt s) järgmise iga kohustusega, millest soovime vabaneda ja redaktorist salvestada / väljuda. See võib välja näha järgmine:

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

Kui sulgete redaktori pärast selle muudatuse salvestamist, avatakse see kohe uuesti ja soovitatakse teil need sõnumid välja valida ja sõnastada. Midagi sellist:

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

Sel hetkel saate kustutada kõik sõnumid, mida te ei soovi lõpliku pühendamisversiooni kaasata. Võite ka need ümber sõnastada või kirjutada lihtsalt täitmise sõnumi nullist.

Pidage meeles, et uus versioon sisaldab kõiki ridu, mis ei alga #tähemärgist. Veelkord salvestage redaktor ja sulgege see.

Teie terminal peaks nüüd näitama edukat teadet, sealhulgas Successfully rebased and updated ja git-logi näitama kena ja tihendatud ajalugu ainult ühe pühendusega. Kõik vahenduskohustused on kadunud ja oleme valmis liituma!

Hoiatus kohaliku ajaloo ja kaugkäitumise ajaloo mittevastavuse kohta

See toiming on kergelt ohtlik, kui teie haru on kaughoidlas juba avaldatud - te muudate siiski pühendumiste ajalugu. Seega on kõige parem teha squash-operatsioon kohalikus harus enne, kui te tõukate .

Mõnikord lükatakse seda juba edasi - kuidas saaksite ikkagi tõmbenõude luua? Sellisel juhul peate pärast squashingu tegemist sundima muudatusi kaugharus, kuna teie kohalik ajalugu ja kaughoidla haru ajalugu on erinevad:

$ git push origin +my-branch-name

Andke endast parim, et oleksite ainus, kes seda kaugharu praegu kasutab, muidu teete teise arendaja elu raskemaks, kui neil on ajaloo mittevastavus. Kuid kuna pritsimine tehakse haru viimase toiminguna enne sellest lahti saamist, pole see tavaliselt nii suur probleem.