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
, jossadeadbeef
on vahingoittuneen haaran viimeisimmän hyvän sitoumuksen hash; - Avaa haarojen/tunnisteiden vaihtaja GitHubin web-käyttöliittymässä;
- 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
-
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.
-
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.
-
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.
-
Ä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