git push –force and how to deal with it

Oletko koskaan joutunut tilanteeseen, jossa väärä git-komento aiheutti tuhoa projektisi repoon? Ihmiset tekevät virheitä, ja joskus nämä virheet voivat maksaa tunteja tiimisi ajasta. Tässä opetusohjelmassa näytämme, miten voit toipua epäonnisesta git push --force nopeasti.

Ei olla liian itsevarmoja. Ennemmin tai myöhemmin näin tapahtuu. Kun työskentelet useiden etähaarojen kanssa samassa git-tietovarastossa, päädyt lopulta git push --force:stä master:ään (tai muuhun tärkeään haaraan, jonka kanssa ei saisi koskaan sekaantua).

Tämä voi tapahtua esimerkiksi silloin, kun otat käyttöön Deisin tai Herokun kanssa, jotka käyttävät erillisiä git-etähaaroja sovelluksen rakentamiseen ja käyttöönottoon. Pitkän työpäivän jälkeen on uskomattoman helppoa suorittaa git push --force tavallisen git push --force deis master sijasta.

Oops! Silmänräpäyksessä joukkuetoverisi ovat menettäneet kaiken viimeisimmän työnsä. Aika kohdata heidän raivonsa.

Mutta kuten eräs erinomainen opas kertoo: ÄLÄ PANIKOI! Hyvä asia on se, että käytät Gitiä, ja se tarkoittaa, että kaikki voidaan korjata.

Parhaassa tapauksessa joku muu, joka työskentelee saman koodin parissa, veti tuoreen version master juuri ennen kuin sinä rikoit sen. Silloin sinun tarvitsee vain mennä tiimisi chattiin ja pyytää kyseistä henkilöä työntämään väkisin viimeisimmät muutoksensa.

Jos olet onnekas, heidän paikallisessa arkistossaan on koko kommitointihistoria, virheesi ylikirjoitetaan tuoreella koodilla, eikä mitään menetetä. Mutta entä jos et ole niin onnekas? Lue sitten eteenpäin!

Tapaus 1: Olit viimeinen henkilö, joka työnsi masteriin ennen virhettä

Hyviä uutisia! Sinulla on kaikki tarvittava virheesi peruuttamiseen silmiesi edessä. Älä vain sulje tai tyhjennä päätettäsi. Mene ensin tiimisi chattiin ja tunnusta syntisi. Pyydä ihmisiä olemaan sotkematta repoa seuraavaan minuuttiin, kun korjaat asioita.

Etsi komennon git push --force tulosteesta komentotulkissasi rivi, joka muistuttaa tätä:

 + deadbeef...f00f00ba master -> master (forced update)

Ensimmäinen symboliryhmä (joka näyttää commitin SHA-etuliitteeltä) on avain pelastukseen. deadbeef on viimeinen hyvä sitoutumisesi master-haaraan juuri ennen kuin aiheutit vahinkoa.

Siten sinun tarvitsee vain… työntää väkisin (tulta tulella torjuen!) tämä sitoutuminen takaisin master-haaraan, huonon sitoutumisen päälle.

$ git push --force origin deadbeef:master

Onnittelut! Olet pelastanut päivän. Nyt on aika oppia virheistäsi.

Tapaus 2: joku muu oli muuttanut masteria ennen kuin sinä mokasit

Juuri ennen kuin teit git push --force, joku oli sulkenut joukon pull requesteja, ja master ei nyt näytä lainkaan samalta kuin paikallinen kopiosi. Et voi enää tehdä git push --force sha1:master, koska sinulla ei ole viimeisimpiä kommitteja paikallisesti (etkä saa niitä git fetch:llä, koska ne eivät enää kuulu mihinkään haaraan). Pysy silti rauhallisena ja pyydä joukkuetovereitasi pysymään poissa etäyhteydestä jonkin aikaa.

Hyödymme siitä, että GitHub ei poista tavoittamattomia kommitteja heti. Et tietenkään voi noutaa niitäkään, mutta on olemassa kiertotie.

Huomaa, että se toimii vain, jos ”tarkkailet” arkistoa, jolloin kaikki siinä tapahtuva näkyy GitHubin etusivulla näkyvässä syötteessä. Avaa tuo syöte ja etsi jotain tällaista:

an hour agoUsername pushed to master at org/repo - deadbeef Implement foo - deadf00d Fix bar

Nyt voit:

  • Kirjoita URL-osoite https://github.com/org/repo/tree/deadbeef, jossa deadbeef on vahingoittuneen haaran viimeisimmän hyvän sitoumuksen hash;
  • Avaa haarojen/tunnisteiden vaihtaja GitHubin web-käyttöliittymässä;

GitHub branch/tag switcher

GitHub branch/tag switcher

  • Luo nimi uudelle väliaikaiselle haaralle (esim.g., master-before-force-push);
  • Klikkaa ”Luo haara”.

Nyt voit hakea kaikki puuttuvat kommitit:

$ git fetchFrom github.com:org/repo * master-before-force-push -> origin/master-before-force-push

Ongelmasi on nyt supistunut aiemmassa esimerkissä kuvatun kaltaiseksi:

$ git push --force origin origin/master-before-force-push:master

Jos haluat edelleen työsi olevan master:ssä, tee vain rebase sen päälle:

$ git rebase origin/master

Miten vältät tällaisen katastrofin tulevaisuudessa

  1. GitHubissa ja GitLabissa on ominaisuus nimeltä suojattu haara.” Merkitse master, develop, stable tai muut tärkeät haarat suojatuiksi, eikä kukaan saa pakottaa pushia niihin. Aina on mahdollista tilapäisesti ”poistaa” haaran suojaus, jos todella haluat korvata historian.

    Lue GitHubin asiakirjoista lisätietoja.

  2. Vaihtoehdon --force sijasta käytä --force-with-lease. Se pysäyttää push-operaation, jos joku on tehnyt pushin samaan haaraan, kun olet työskennellyt sen parissa (etkä ole vetänyt mitään muutoksia).

    Katso tämä Atlassianin artikkeli.

  3. Luo aliaksia komennoille, jotka käyttävät git push --force, jotta vältät vahingossa tuhoisat toiminnot:

    # ~/.gitconfig deploy = "!git push --force deis \"$(git rev-parse --abbrev-ref HEAD):master\""

    Lue ProGitin luku aliaseista.

  4. Älä koskaan tee kokeilujasi arkiston päähaarassa! git checkout -b experiments on paras ystäväsi.

Pro-vinkki: git push on monia vaihtoehtoja. --force ja --all toimivat erityisen hyvin yhdessä. Voit käyttää tätä yhdistelmää, kun palaat projektiin useiden kuukausien toimettomuuden jälkeen. Kokeile sitä, jos tunnet olosi erityisen seikkailunhaluiseksi!

Leave a Reply